1 #include "edit_plane.hpp"
2 #include "widgets/net_button.hpp"
3 #include "widgets/spin_button_dim.hpp"
4 #include "widgets/plane_editor.hpp"
5 #include "board/board.hpp"
6 #include "util/gtk_util.hpp"
7
8 namespace horizon {
9
bind(Gtk::Switch * sw,bool & v)10 void bind(Gtk::Switch *sw, bool &v)
11 {
12 sw->set_active(v);
13 sw->property_active().signal_changed().connect([sw, &v] { v = sw->get_active(); });
14 }
15
EditPlaneDialog(Gtk::Window * parent,Plane & p,Board & brd)16 EditPlaneDialog::EditPlaneDialog(Gtk::Window *parent, Plane &p, Board &brd)
17 : Gtk::Dialog("Edit Plane", *parent, Gtk::DialogFlags::DIALOG_MODAL | Gtk::DialogFlags::DIALOG_USE_HEADER_BAR),
18 plane(p)
19 {
20 add_button("Cancel", Gtk::ResponseType::RESPONSE_CANCEL);
21 auto ok_button = add_button("OK", Gtk::ResponseType::RESPONSE_OK);
22 set_default_response(Gtk::ResponseType::RESPONSE_OK);
23 // set_default_size(400, 300);
24
25
26 auto box = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL, 20));
27 box->set_margin_start(20);
28 box->set_margin_end(20);
29 box->set_margin_top(20);
30 box->set_margin_bottom(20);
31 box->set_halign(Gtk::ALIGN_CENTER);
32 box->set_valign(Gtk::ALIGN_CENTER);
33
34 auto box2 = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL, 20));
35 auto from_rules = Gtk::manage(new Gtk::CheckButton("From rules"));
36 bind_widget(from_rules, plane.from_rules);
37 box2->pack_start(*from_rules, false, false, 0);
38
39 auto net_button = Gtk::manage(new NetButton(*brd.block));
40 if (plane.net) {
41 net_button->set_net(plane.net->uuid);
42 }
43 else {
44 ok_button->set_sensitive(false);
45 }
46
47 net_button->signal_changed().connect([this, &brd, ok_button](const UUID &uu) {
48 plane.net = brd.block->get_net(uu);
49 ok_button->set_sensitive(true);
50 });
51 box2->pack_start(*net_button, true, true, 0);
52
53 box->pack_start(*box2, false, false, 0);
54
55 auto ed = Gtk::manage(new PlaneEditor(&plane.settings, &plane.priority));
56 ed->set_from_rules(from_rules->get_active());
57 from_rules->signal_toggled().connect([from_rules, ed] { ed->set_from_rules(from_rules->get_active()); });
58 box->pack_start(*ed, true, true, 0);
59
60 if (plane.net) {
61 auto delete_button = Gtk::manage(new Gtk::Button("Delete Plane"));
62 delete_button->signal_clicked().connect([this, &brd] {
63 brd.planes.erase(plane.uuid);
64 response(Gtk::RESPONSE_OK);
65 });
66 box->pack_start(*delete_button, false, false, 0);
67 }
68
69
70 get_content_area()->pack_start(*box, true, true, 0);
71
72 show_all();
73 }
74 } // namespace horizon
75