1 #include "footprint_generator_window.hpp"
2 #include "footprint_generator_base.hpp"
3 #include "footprint_generator_dual.hpp"
4 #include "footprint_generator_grid.hpp"
5 #include "footprint_generator_quad.hpp"
6 #include "footprint_generator_single.hpp"
7 #include "footprint_generator_footag.hpp"
8 #include "widgets/spin_button_dim.hpp"
9 #include "core/core_package.hpp"
10 #include "util/gtk_util.hpp"
11 #include <pangomm/layout.h>
12
13 namespace horizon {
14
FootprintGeneratorWindow(BaseObjectType * cobject,const Glib::RefPtr<Gtk::Builder> & x,CorePackage & c)15 FootprintGeneratorWindow::FootprintGeneratorWindow(BaseObjectType *cobject, const Glib::RefPtr<Gtk::Builder> &x,
16 CorePackage &c)
17 : Gtk::Window(cobject), core(c)
18 {
19 GET_WIDGET(stack);
20 GET_WIDGET(generate_button);
21
22 {
23 auto gen = Gtk::manage(new FootprintGeneratorFootag(c));
24 gen->show();
25 stack->add(*gen, "footag", "IPC-7351B");
26 }
27 {
28 auto gen = Gtk::manage(new FootprintGeneratorDual(c));
29 gen->show();
30 gen->property_can_generate().signal_changed().connect(
31 sigc::mem_fun(*this, &FootprintGeneratorWindow::update_can_generate));
32 stack->add(*gen, "dual", "Dual");
33 }
34 {
35 auto gen = Gtk::manage(new FootprintGeneratorSingle(c));
36 gen->show();
37 gen->property_can_generate().signal_changed().connect(
38 sigc::mem_fun(*this, &FootprintGeneratorWindow::update_can_generate));
39 stack->add(*gen, "single", "Single");
40 }
41 {
42 auto gen = Gtk::manage(new FootprintGeneratorQuad(c));
43 gen->show();
44 gen->property_can_generate().signal_changed().connect(
45 sigc::mem_fun(*this, &FootprintGeneratorWindow::update_can_generate));
46 stack->add(*gen, "quad", "Quad");
47 }
48 {
49 auto gen = Gtk::manage(new FootprintGeneratorGrid(c));
50 gen->show();
51 gen->property_can_generate().signal_changed().connect(
52 sigc::mem_fun(*this, &FootprintGeneratorWindow::update_can_generate));
53 stack->add(*gen, "grid", "Grid");
54 }
55 stack->property_visible_child().signal_changed().connect(
56 sigc::mem_fun(*this, &FootprintGeneratorWindow::update_can_generate));
57 update_can_generate();
58 generate_button->signal_clicked().connect([this] {
59 {
60 auto gen = dynamic_cast<FootprintGeneratorBase *>(stack->get_visible_child());
61 if (gen) {
62 if (gen->generate()) {
63 core.set_needs_save();
64 core.rebuild();
65 signal_generated().emit();
66 hide();
67 }
68 }
69 }
70 {
71 auto gen = dynamic_cast<FootprintGeneratorFootag *>(stack->get_visible_child());
72 if (gen) {
73 if (gen->generate()) {
74 core.set_needs_save();
75 core.rebuild();
76 signal_generated().emit();
77 hide();
78 }
79 }
80 }
81 });
82 }
83
update_can_generate()84 void FootprintGeneratorWindow::update_can_generate()
85 {
86 bool sens = false;
87 {
88 auto w = dynamic_cast<FootprintGeneratorBase *>(stack->get_visible_child());
89 if (w)
90 sens = w->property_can_generate();
91 }
92 {
93 auto w = dynamic_cast<FootprintGeneratorFootag *>(stack->get_visible_child());
94 if (w)
95 sens = true;
96 }
97 generate_button->set_sensitive(sens);
98 }
99
create(Gtk::Window * p,CorePackage & c)100 FootprintGeneratorWindow *FootprintGeneratorWindow::create(Gtk::Window *p, CorePackage &c)
101 {
102 FootprintGeneratorWindow *w;
103 Glib::RefPtr<Gtk::Builder> x = Gtk::Builder::create();
104 x->add_from_resource(
105 "/org/horizon-eda/horizon/imp/footprint_generator/"
106 "footprint_generator.ui");
107 x->get_widget_derived("window", w, c);
108 w->set_transient_for(*p);
109 return w;
110 }
111 } // namespace horizon
112