Horizon
bom_export_window.hpp
1 #pragma once
2 #include <array>
3 #include <gtkmm.h>
4 #include <set>
5 #include "util/window_state_store.hpp"
6 #include "block/bom.hpp"
7 #include "util/changeable.hpp"
8 #include "util/export_file_chooser.hpp"
9 #include "pool/pool_parametric.hpp"
10 #include "widgets/column_chooser.hpp"
11 
12 namespace horizon {
13 
14 class BOMExportWindow : public Gtk::Window, public Changeable {
15  friend class OrderableMPNSelector;
16 
17 public:
18  BOMExportWindow(BaseObjectType *cobject, const Glib::RefPtr<Gtk::Builder> &x, class Block &block,
19  class BOMExportSettings &settings, class IPool &pool, const std::string &project_dir);
20  static BOMExportWindow *create(Gtk::Window *p, class Block &block, class BOMExportSettings &settings,
21  class IPool &pool, const std::string &project_dir);
22 
23  void set_can_export(bool v);
24  void generate();
25  void update_preview();
26  void update_orderable_MPNs();
27  void update();
28 
29 private:
30  class Block &block;
31  class BOMExportSettings &settings;
32  class IPool &pool;
33  PoolParametric pool_parametric;
34 
35  void update_concrete_parts();
36 
37  class MyExportFileChooser : public ExportFileChooser {
38  protected:
39  void prepare_chooser(Glib::RefPtr<Gtk::FileChooser> chooser) override;
40  void prepare_filename(std::string &filename) override;
41  };
42  MyExportFileChooser export_filechooser;
43 
44  Gtk::Button *export_button = nullptr;
45  Gtk::CheckButton *nopopulate_check = nullptr;
46  Gtk::ComboBoxText *sort_column_combo = nullptr;
47  Gtk::ComboBoxText *sort_order_combo = nullptr;
48  Gtk::Revealer *done_revealer = nullptr;
49  Gtk::Label *done_label = nullptr;
50  Gtk::Entry *filename_entry = nullptr;
51  Gtk::Button *filename_button = nullptr;
52  Gtk::ListBox *orderable_MPNs_listbox = nullptr;
53  bool can_export = true;
54  void update_export_button();
55 
56  Glib::RefPtr<Gtk::SizeGroup> sg_manufacturer;
57  Glib::RefPtr<Gtk::SizeGroup> sg_MPN;
58  Glib::RefPtr<Gtk::SizeGroup> sg_orderable_MPN;
59 
60  Gtk::TreeView *meta_parts_tv = nullptr;
61  Gtk::Label *concrete_parts_label = nullptr;
62 
63  class MetaPartsListColumns : public Gtk::TreeModelColumnRecord {
64  public:
65  MetaPartsListColumns()
66  {
67  Gtk::TreeModelColumnRecord::add(MPN);
68  Gtk::TreeModelColumnRecord::add(value);
69  Gtk::TreeModelColumnRecord::add(manufacturer);
70  Gtk::TreeModelColumnRecord::add(qty);
71  Gtk::TreeModelColumnRecord::add(uuid);
72  Gtk::TreeModelColumnRecord::add(concrete_MPN);
73  Gtk::TreeModelColumnRecord::add(concrete_value);
74  Gtk::TreeModelColumnRecord::add(concrete_manufacturer);
75  }
76  Gtk::TreeModelColumn<Glib::ustring> MPN;
77  Gtk::TreeModelColumn<Glib::ustring> value;
78  Gtk::TreeModelColumn<Glib::ustring> manufacturer;
79  Gtk::TreeModelColumn<UUID> uuid;
80  Gtk::TreeModelColumn<unsigned int> qty;
81 
82  Gtk::TreeModelColumn<Glib::ustring> concrete_MPN;
83  Gtk::TreeModelColumn<Glib::ustring> concrete_value;
84  Gtk::TreeModelColumn<Glib::ustring> concrete_manufacturer;
85  };
86  MetaPartsListColumns meta_parts_list_columns;
87 
88  Glib::RefPtr<Gtk::ListStore> meta_parts_store;
89 
90  Gtk::Box *param_browser_box = nullptr;
91  Gtk::RadioButton *rb_tol_10 = nullptr;
92  Gtk::RadioButton *rb_tol_1 = nullptr;
93  Gtk::Button *button_clear_similar = nullptr;
94  Gtk::Button *button_set_similar = nullptr;
95  class PoolBrowserParametric *browser_param = nullptr;
96  UUID meta_part_current;
97  void update_meta_mapping();
98  void handle_set_similar();
99  void update_similar_button_sensitivity();
100 
101  Gtk::TreeView *preview_tv = nullptr;
102 
103  WindowStateStore state_store;
104 
105  ColumnChooser *column_chooser = nullptr;
106 
107  class MyAdapter : public ColumnChooser::Adapter<BOMColumn> {
108  public:
109  using ColumnChooser::Adapter<BOMColumn>::Adapter;
110  std::string get_column_name(int col) const override;
111  std::map<int, std::string> get_column_names() const override;
112  };
113 
114  MyAdapter adapter;
115 
116  void flash(const std::string &s);
117  sigc::connection flash_connection;
118 
119  class ListColumnsPreview : public Gtk::TreeModelColumnRecord {
120  public:
121  ListColumnsPreview()
122  {
123  Gtk::TreeModelColumnRecord::add(row);
124  }
125  Gtk::TreeModelColumn<BOMRow> row;
126  };
127  ListColumnsPreview list_columns_preview;
128 
129  Glib::RefPtr<Gtk::ListStore> bom_store;
130 };
131 } // namespace horizon