Horizon
generic_combo_box.hpp
1 #pragma once
2 #include <gtkmm.h>
3 
4 namespace horizon {
5 template <typename T> class GenericComboBox : public Gtk::ComboBox {
6 public:
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 
65 private:
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