1 #pragma once
2 
3 #include <gtkmm.h>
4 
5 #include "keychain_container.h"
6 
7 struct CallbackData {
8     std::string label;
9     std::function<void()> callback;
10 };
11 
12 class AppMenu : public Gtk::MenuButton {
13 public:
AppMenu(std::initializer_list<CallbackData> action_callbacks)14     AppMenu(std::initializer_list<CallbackData> action_callbacks) : Gtk::MenuButton() {
15         auto menu_button_pixbuf =
16             Gdk::Pixbuf::create_from_resource("/org/gtk/gonepass/gonepass-icon.png", 36, -1);
17         auto menu_button_icon = Gtk::manage(new Gtk::Image(menu_button_pixbuf));
18         set_image(*menu_button_icon);
19         set_menu(menu);
20 
21         for (auto&& item_def : action_callbacks) {
22             auto new_item = Gtk::manage(new Gtk::MenuItem(item_def.label, true));
23             new_item->signal_activate().connect(item_def.callback);
24             menu.append(*new_item);
25             new_item->show();
26             vault_items_start++;
27         }
28 
29         auto seperator_item = Gtk::manage(new Gtk::SeparatorMenuItem());
30         menu.append(*seperator_item);
31         seperator_item->show();
32         vault_items_start;
33     }
34 
addVault(std::string title,std::function<void ()> activateCallback)35     void addVault(std::string title, std::function<void()> activateCallback) {
36         auto new_menu_item = Gtk::manage(new Gtk::RadioMenuItem(menu_group, title));
37         new_menu_item->signal_activate().connect(activateCallback);
38         menu.append(*new_menu_item);
39         new_menu_item->show();
40         new_menu_item->set_active(true);
41     }
42 
prependVault(std::string title,std::function<void ()> activateCallback)43     void prependVault(std::string title, std::function<void()> activateCallback) {
44         auto new_menu_item = Gtk::manage(new Gtk::RadioMenuItem(menu_group, title));
45         new_menu_item->signal_activate().connect(activateCallback);
46         menu.insert(*new_menu_item, vault_items_start);
47         new_menu_item->show();
48         new_menu_item->set_active(true);
49     }
50 
51 private:
52     Gtk::Menu menu;
53     int vault_items_start = 1;
54     Gtk::RadioMenuItem::Group menu_group;
55 };
56