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