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