Horizon
rules_window.hpp
1 #pragma once
2 #include "common/common.hpp"
3 #include "rules/rules.hpp"
4 #include "util/uuid.hpp"
5 #include "util/changeable.hpp"
6 #include "util/window_state_store.hpp"
7 #include <array>
8 #include <gtkmm.h>
9 #include <set>
10 #include <atomic>
11 namespace horizon {
12 
13 class RulesWindow : public Gtk::Window, public Changeable {
14 public:
15  RulesWindow(BaseObjectType *cobject, const Glib::RefPtr<Gtk::Builder> &x, class CanvasGL &ca, class Core &c,
16  bool layered);
17  static RulesWindow *create(Gtk::Window *p, class CanvasGL &ca, class Core &c, bool layered);
18  typedef sigc::signal<void, Coordi, UUID, UUIDVec> type_signal_goto;
19  type_signal_goto signal_goto()
20  {
21  return s_signal_goto;
22  }
23 
24  typedef sigc::signal<void> type_signal_canvas_update;
25  type_signal_canvas_update signal_canvas_update()
26  {
27  return s_signal_canvas_update;
28  }
29 
30  void run_checks();
31  void apply_rules();
32 
33  void set_enabled(bool enable);
34 
35  ~RulesWindow();
36 
37 private:
38  Gtk::ListBox *lb_rules = nullptr;
39  Gtk::ListBox *lb_multi = nullptr;
40  Gtk::Revealer *rev_multi = nullptr;
41  Gtk::Button *button_rule_instance_add = nullptr;
42  Gtk::Button *button_rule_instance_remove = nullptr;
43  Gtk::Button *button_rule_instance_move_up = nullptr;
44  Gtk::Button *button_rule_instance_move_down = nullptr;
45  Gtk::Box *rule_editor_box = nullptr;
46  Gtk::Box *run_box = nullptr;
47  Gtk::Button *apply_button = nullptr;
48  Gtk::Button *cancel_button = nullptr;
49  Gtk::Stack *stack = nullptr;
50  Gtk::StackSwitcher *stack_switcher = nullptr;
51  Gtk::Revealer *rev_warn = nullptr;
52  Glib::RefPtr<Gtk::SizeGroup> sg_order;
53  Gtk::MenuItem *check_selected_rule_item = nullptr;
54 
55  void rule_selected(RuleID id);
56  void rule_instance_selected(RuleID id, const UUID &uu);
57  void update_rule_instances(RuleID id);
58  void update_rule_instance_labels();
59  void update_rule_labels();
60  void update_warning();
61  void cancel_checks();
62  void update_can_check_selected();
63 
64  void run_check(RuleID rule);
65 
66  CanvasGL &canvas;
67  Core &core;
68  Rules &rules;
69  const bool layered;
70  class CanvasAnnotation *annotation = nullptr;
71 
72  class Block *get_top_block();
73  type_signal_goto s_signal_goto;
74  type_signal_canvas_update s_signal_canvas_update;
75  RuleID rule_id_current = RuleID::NONE;
76 
77  class RuleEditor *editor = nullptr;
78  void show_editor(RuleEditor *e);
79  RuleEditor *create_editor(Rule &r);
80  void reload_editor();
81 
82  enum class CheckState { NOT_RUNNING, RUNNING, CANCELLING };
83 
84  class TreeColumns : public Gtk::TreeModelColumnRecord {
85  public:
86  TreeColumns()
87  {
88  Gtk::TreeModelColumnRecord::add(rule);
89  Gtk::TreeModelColumnRecord::add(name);
90  Gtk::TreeModelColumnRecord::add(result);
91  Gtk::TreeModelColumnRecord::add(has_location);
92  Gtk::TreeModelColumnRecord::add(location);
93  Gtk::TreeModelColumnRecord::add(sheet);
94  Gtk::TreeModelColumnRecord::add(instance_path);
95  Gtk::TreeModelColumnRecord::add(paths);
96  Gtk::TreeModelColumnRecord::add(layers);
97  Gtk::TreeModelColumnRecord::add(state);
98  Gtk::TreeModelColumnRecord::add(status);
99  Gtk::TreeModelColumnRecord::add(pulse);
100  Gtk::TreeModelColumnRecord::add(outdated);
101  }
102  Gtk::TreeModelColumn<RuleID> rule;
103  Gtk::TreeModelColumn<Glib::ustring> name;
104  Gtk::TreeModelColumn<RulesCheckErrorLevel> result;
105  Gtk::TreeModelColumn<bool> has_location;
106  Gtk::TreeModelColumn<Coordi> location;
107  Gtk::TreeModelColumn<UUID> sheet;
108  Gtk::TreeModelColumn<UUIDVec> instance_path;
109  Gtk::TreeModelColumn<CheckState> state;
110  Gtk::TreeModelColumn<ClipperLib::Paths> paths;
111  Gtk::TreeModelColumn<std::set<int>> layers;
112  Gtk::TreeModelColumn<std::string> status;
113  Gtk::TreeModelColumn<int> pulse;
114  Gtk::TreeModelColumn<bool> outdated;
115  };
116  TreeColumns tree_columns;
117 
118  Glib::RefPtr<Gtk::TreeStore> check_result_store;
119  Glib::RefPtr<Gtk::TreeModelFilter> check_result_filter;
120  Gtk::CheckButton *work_layer_only_checkbutton = nullptr;
121  Gtk::Box *work_layer_only_box = nullptr;
122  Gtk::TreeView *check_result_treeview = nullptr;
123 
124  class RuleRunInfo {
125  public:
126  RuleRunInfo(Gtk::TreeModel::Row &r) : row(r)
127  {
128  }
129  RulesCheckResult result;
130  std::string status;
131  Gtk::TreeModel::Row row;
132  };
133 
134  std::map<RuleID, RuleRunInfo> run_store;
135  std::mutex run_store_mutex;
136 
137  std::unique_ptr<class RulesCheckCache> cache;
138 
139  void check_thread(RuleID id);
140 
141  WindowStateStore state_store;
142  bool enabled = true;
143 
144  Glib::RefPtr<Gio::Menu> hamburger_menu;
145  Gtk::MenuButton *hamburger_menu_button = nullptr;
146  Glib::RefPtr<Gio::SimpleActionGroup> action_group;
147 
148  bool update_results();
149  void update_markers_and_error_polygons();
150 
151  std::atomic_bool cancel_flag;
152  bool queue_close = false;
153 
154  void export_rules();
155  void import_rules();
156 };
157 } // namespace horizon
A block is one level of hierarchy in the netlist.
Definition: block.hpp:29
Definition: annotation.hpp:7
Definition: canvas_gl.hpp:20
Definition: changeable.hpp:5
Where Tools and and documents meet.
Definition: core.hpp:42
Definition: rule_editor.hpp:9
Definition: rule.hpp:57
Definition: rules.hpp:37
Definition: rules_window.hpp:13
Definition: rules.hpp:53
This class encapsulates a UUID and allows it to be uses as a value type.
Definition: uuid.hpp:16
Definition: window_state_store.hpp:25