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