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