1 #include "unit_preview.hpp"
2 #include "pool/ipool.hpp"
3 #include "canvas/canvas.hpp"
4 #include "util/util.hpp"
5 #include "util/gtk_util.hpp"
6 #include "util/sqlite.hpp"
7 #include "common/object_descr.hpp"
8 #include "preview_canvas.hpp"
9 #include "pool/unit.hpp"
10 
11 namespace horizon {
12 
UnitPreview(class IPool & p)13 UnitPreview::UnitPreview(class IPool &p) : Gtk::Box(Gtk::ORIENTATION_VERTICAL, 0), pool(p)
14 {
15     auto symbol_sel_box = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL, 4));
16     symbol_sel_box->property_margin() = 8;
17     {
18         auto la = Gtk::manage(new Gtk::Label("Symbol"));
19         la->get_style_context()->add_class("dim-label");
20         symbol_sel_box->pack_start(*la, false, false, 0);
21     }
22     combo_symbol = Gtk::manage(new Gtk::ComboBoxText);
23     combo_symbol->signal_changed().connect(sigc::mem_fun(*this, &UnitPreview::handle_symbol_sel));
24     symbol_sel_box->pack_start(*combo_symbol, true, true, 0);
25 
26     {
27         goto_symbol_button =
28                 create_goto_button(ObjectType::SYMBOL, [this] { return UUID(combo_symbol->get_active_id()); });
29         symbol_sel_box->pack_start(*goto_symbol_button, false, false, 0);
30     }
31 
32     pack_start(*symbol_sel_box, false, false, 0);
33 
34     {
35         auto sep = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL));
36         sep->show();
37         pack_start(*sep, false, false, 0);
38     }
39 
40     canvas_symbol = Gtk::manage(new PreviewCanvas(pool, false));
41     canvas_symbol->show();
42     pack_start(*canvas_symbol, true, true, 0);
43 
44 
45     load(nullptr);
46 }
47 
load(const Unit * u)48 void UnitPreview::load(const Unit *u)
49 {
50     unit = u;
51 
52     for (auto it : goto_buttons) {
53         it->set_sensitive(unit);
54     }
55     combo_symbol->remove_all();
56     if (!unit) {
57         return;
58     }
59 
60     SQLite::Query q(pool.get_db(), "SELECT uuid, name FROM symbols WHERE unit=? ORDER BY name");
61     q.bind(1, unit->uuid);
62     bool have_symbol = false;
63     while (q.step()) {
64         UUID uu = q.get<std::string>(0);
65         std::string name = q.get<std::string>(1);
66         combo_symbol->append((std::string)uu, name);
67         have_symbol = true;
68     }
69     if (goto_symbol_button)
70         goto_symbol_button->set_sensitive(have_symbol);
71 
72     combo_symbol->set_active(0);
73 }
74 
handle_symbol_sel()75 void UnitPreview::handle_symbol_sel()
76 {
77     canvas_symbol->clear();
78     if (!unit)
79         return;
80     if (combo_symbol->get_active_row_number() == -1)
81         return;
82 
83     canvas_symbol->load(ObjectType::SYMBOL, UUID(combo_symbol->get_active_id()));
84 }
85 } // namespace horizon
86