Horizon
Loading...
Searching...
No Matches
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>
11namespace horizon {
12
13class RulesWindow : public Gtk::Window, public Changeable {
14public:
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
36
37private:
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:58
Definition rules.hpp:38
Definition rules_window.hpp:13
Definition rules.hpp:54
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