Horizon
action_button.hpp
1 #pragma once
2 #include <gtkmm.h>
3 #include "imp/action.hpp"
4 
5 namespace horizon {
6 
8 public:
9  typedef sigc::signal<void, ActionToolID> type_signal_action;
10  type_signal_action signal_action()
11  {
12  return s_signal_action;
13  }
14 
15  virtual void update_key_sequences();
16  virtual void add_action(ActionToolID act) = 0;
17  virtual void set_keep_primary_action(bool keep)
18  {
19  }
20 
21  virtual ~ActionButtonBase()
22  {
23  }
24 
25 protected:
26  ActionButtonBase(const std::map<ActionToolID, ActionConnection> &k);
27 
28  type_signal_action s_signal_action;
29  std::map<ActionToolID, Gtk::Label *> key_labels;
30  const std::map<ActionToolID, ActionConnection> &keys;
31 };
32 
33 class ActionButton : public Gtk::Overlay, public ActionButtonBase {
34 public:
35  ActionButton(ActionToolID action, const std::map<ActionToolID, ActionConnection> &k);
36 
37  void update_key_sequences() override;
38  void add_action(ActionToolID act) override;
39  void set_keep_primary_action(bool keep) override;
40 
41 private:
42  const ActionToolID action_orig;
43  ActionToolID action;
44  Gtk::Button *button = nullptr;
45  Gtk::MenuButton *menu_button = nullptr;
46  Gtk::Menu menu;
47  int button_current = -1;
48  Gtk::MenuItem &add_menu_item(ActionToolID act);
49  void set_primary_action(ActionToolID act);
50  bool keep_primary_action = false;
51 };
52 
53 class ActionButtonMenu : public Gtk::Button, public ActionButtonBase {
54 public:
55  ActionButtonMenu(const char *icon_name, const std::map<ActionToolID, ActionConnection> &k);
56 
57  void add_action(ActionToolID act) override;
58 
59 private:
60  Gtk::Menu menu;
61  int button_current = -1;
62  Gtk::MenuItem &add_menu_item(ActionToolID act);
63 };
64 
65 
66 } // namespace horizon
horizon::ActionButtonMenu
Definition: action_button.hpp:53
horizon::ActionButtonBase
Definition: action_button.hpp:7
horizon::ActionButton
Definition: action_button.hpp:33