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