Horizon
rules_window.hpp
1 #pragma once
2 #include "common/common.hpp"
3 #include "rules/rules.hpp"
4 #include "rules/cache.hpp"
5 #include "util/uuid.hpp"
6 #include "util/changeable.hpp"
7 #include "util/window_state_store.hpp"
8 #include <array>
9 #include <gtkmm.h>
10 #include <set>
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  static RulesWindow *create(Gtk::Window *p, class CanvasGL &ca, class Core &c);
17  typedef sigc::signal<void, Coordi, UUID, UUIDVec> type_signal_goto;
18  type_signal_goto signal_goto()
19  {
20  return s_signal_goto;
21  }
22 
23  typedef sigc::signal<void> type_signal_canvas_update;
24  type_signal_canvas_update signal_canvas_update()
25  {
26  return s_signal_canvas_update;
27  }
28 
29  void run_checks();
30  void apply_rules();
31 
32  void set_enabled(bool enable);
33 
34 private:
35  Gtk::ListBox *lb_rules = nullptr;
36  Gtk::ListBox *lb_multi = nullptr;
37  Gtk::Revealer *rev_multi = nullptr;
38  Gtk::Button *button_rule_instance_add = nullptr;
39  Gtk::Button *button_rule_instance_remove = nullptr;
40  Gtk::Button *button_rule_instance_move_up = nullptr;
41  Gtk::Button *button_rule_instance_move_down = nullptr;
42  Gtk::Box *rule_editor_box = nullptr;
43  Gtk::Button *run_button = nullptr;
44  Gtk::Button *apply_button = nullptr;
45  Gtk::Stack *stack = nullptr;
46  Gtk::StackSwitcher *stack_switcher = nullptr;
47  Gtk::Revealer *rev_warn = nullptr;
48  Glib::RefPtr<Gtk::SizeGroup> sg_order;
49 
50  void rule_selected(RuleID id);
51  void rule_instance_selected(RuleID id, const UUID &uu);
52  void update_rule_instances(RuleID id);
53  void update_rule_instance_labels();
54  void update_rule_labels();
55  void update_warning();
56 
57 
58  CanvasGL &canvas;
59  Core &core;
60  Rules &rules;
61  class CanvasAnnotation *annotation = nullptr;
62 
63  class Block *get_top_block();
64  type_signal_goto s_signal_goto;
65  type_signal_canvas_update s_signal_canvas_update;
66  RuleID rule_id_current = RuleID::NONE;
67 
68  class RuleEditor *editor = nullptr;
69  void show_editor(RuleEditor *e);
70  RuleEditor *create_editor(Rule &r);
71  void reload_editor();
72 
73  class TreeColumns : public Gtk::TreeModelColumnRecord {
74  public:
75  TreeColumns()
76  {
77  Gtk::TreeModelColumnRecord::add(name);
78  Gtk::TreeModelColumnRecord::add(result);
79  Gtk::TreeModelColumnRecord::add(has_location);
80  Gtk::TreeModelColumnRecord::add(location);
81  Gtk::TreeModelColumnRecord::add(sheet);
82  Gtk::TreeModelColumnRecord::add(instance_path);
83  Gtk::TreeModelColumnRecord::add(running);
84  Gtk::TreeModelColumnRecord::add(status);
85  Gtk::TreeModelColumnRecord::add(pulse);
86  }
87  Gtk::TreeModelColumn<Glib::ustring> name;
88  Gtk::TreeModelColumn<RulesCheckErrorLevel> result;
89  Gtk::TreeModelColumn<bool> has_location;
90  Gtk::TreeModelColumn<Coordi> location;
91  Gtk::TreeModelColumn<UUID> sheet;
92  Gtk::TreeModelColumn<UUIDVec> instance_path;
93  Gtk::TreeModelColumn<bool> running;
94  Gtk::TreeModelColumn<std::string> status;
95  Gtk::TreeModelColumn<int> pulse;
96  };
97  TreeColumns tree_columns;
98 
99  Glib::RefPtr<Gtk::TreeStore> check_result_store;
100  Gtk::TreeView *check_result_treeview = nullptr;
101 
102  Glib::Dispatcher dispatcher;
103 
104  class RuleRunInfo {
105  public:
106  RuleRunInfo(Gtk::TreeModel::Row &r) : row(r)
107  {
108  }
109  RulesCheckResult result;
110  std::string status;
111  Gtk::TreeModel::Row row;
112  };
113 
114  std::map<RuleID, RuleRunInfo> run_store;
115  std::mutex run_store_mutex;
116 
117  std::unique_ptr<RulesCheckCache> cache;
118 
119  void check_thread(RuleID id);
120  sigc::connection pulse_connection;
121 
122  WindowStateStore state_store;
123  bool enabled = true;
124 
125  Glib::RefPtr<Gio::Menu> hamburger_menu;
126  Glib::RefPtr<Gio::SimpleActionGroup> action_group;
127 
128  void export_rules();
129  void import_rules();
130 };
131 } // namespace horizon
A block is one level of hierarchy in the netlist.
Definition: block.hpp:29
Definition: annotation.hpp:7
Definition: canvas_gl.hpp:18
Definition: changeable.hpp:5
Where Tools and and documents meet.
Definition: core.hpp:42
Definition: rule_editor.hpp:9
Definition: rule.hpp:54
Definition: rules.hpp:36
Definition: rules_window.hpp:13
Definition: rules.hpp:51
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