Horizon
Loading...
Searching...
No Matches
generic_combo_box.hpp
1#pragma once
2#include <gtkmm.h>
3
4namespace horizon {
5template <typename T> class GenericComboBox : public Gtk::ComboBox {
6public:
7 GenericComboBox() : Gtk::ComboBox()
8 {
9 store = Gtk::ListStore::create(list_columns);
10 set_model(store);
11 cr_text = Gtk::manage(new Gtk::CellRendererText);
12 pack_start(*cr_text, true);
13 add_attribute(cr_text->property_text(), list_columns.value);
14
15 signal_changed().connect([this] {
16 auto it = get_active();
17 if (store->iter_is_valid(it)) {
18 Gtk::TreeModel::Row row = *it;
19 set_tooltip_text(row[list_columns.value]);
20 }
21 else {
22 set_has_tooltip(false);
23 }
24 });
25 }
26
27 Gtk::CellRendererText &get_cr_text()
28 {
29 return *cr_text;
30 }
31
32 bool set_active_key(const T &key)
33 {
34 for (const auto &it : store->children()) {
35 Gtk::TreeModel::Row row = *it;
36 if (row[list_columns.key] == key) {
37 set_active(it);
38 return true;
39 }
40 }
41 return false;
42 }
43
44 const T get_active_key() const
45 {
46 if (get_active_row_number() == -1)
47 return T();
48 const auto it = get_active();
49 Gtk::TreeModel::Row row = *it;
50 return row.get_value(list_columns.key);
51 }
52
53 void remove_all()
54 {
55 store->clear();
56 }
57
58 void append(const T &key, const Glib::ustring &value)
59 {
60 Gtk::TreeModel::Row row = *store->append();
61 row[list_columns.key] = key;
62 row[list_columns.value] = value;
63 }
64
65private:
66 class ListColumns : public Gtk::TreeModelColumnRecord {
67 public:
68 ListColumns()
69 {
70 Gtk::TreeModelColumnRecord::add(key);
71 Gtk::TreeModelColumnRecord::add(value);
72 }
73 Gtk::TreeModelColumn<T> key;
74 Gtk::TreeModelColumn<Glib::ustring> value;
75 };
76 ListColumns list_columns;
77
78 Glib::RefPtr<Gtk::ListStore> store;
79 Gtk::CellRendererText *cr_text = nullptr;
80};
81} // namespace horizon
Definition generic_combo_box.hpp:5