[gnote] Use popover for gear menu, first batch



commit 406aadb41c8bcbfb4438c620ee244a2d8da44e11
Author: Aurimas Černius <aurisc4 gmail com>
Date:   Sat Dec 5 17:57:25 2015 +0200

    Use popover for gear menu, first batch

 src/actionmanager.cpp     |   52 ++++++-----------------
 src/actionmanager.hpp     |   12 ++----
 src/iactionmanager.hpp    |    9 ++--
 src/mainwindowembeds.hpp  |    8 ++-
 src/notewindow.cpp        |   72 +++++++++-----------------------
 src/notewindow.hpp        |   15 ++----
 src/recentchanges.cpp     |  101 +++++++++++++++++++++-----------------------
 src/recentchanges.hpp     |   12 ++---
 src/searchnoteswidget.cpp |   12 +++--
 src/searchnoteswidget.hpp |    6 +-
 src/utils.cpp             |   12 +++++-
 src/utils.hpp             |    4 +-
 12 files changed, 129 insertions(+), 186 deletions(-)
---
diff --git a/src/actionmanager.cpp b/src/actionmanager.cpp
index a50d1c3..0868125 100644
--- a/src/actionmanager.cpp
+++ b/src/actionmanager.cpp
@@ -72,6 +72,9 @@ namespace gnote {
     populate_action_groups();
     make_app_actions();
     make_app_menu_items();
+
+    register_main_window_action("close-window");
+    register_main_window_action("delete-note");
   }
 
 
@@ -216,54 +219,27 @@ namespace gnote {
     return section;
   }
 
-  void ActionManager::add_main_window_search_action(const Glib::RefPtr<Gtk::Action> & action, int order)
-  {
-    add_main_window_action(m_main_window_search_actions, action, order);
-    signal_main_window_search_actions_changed();
-  }
-
-  void ActionManager::remove_main_window_search_action(const std::string & name)
-  {
-    remove_main_window_action(m_main_window_search_actions, name);
-    signal_main_window_search_actions_changed();
-  }
-
-  std::vector<Glib::RefPtr<Gtk::Action> > ActionManager::get_main_window_search_actions()
+  void ActionManager::register_main_window_action(const Glib::ustring & action)
   {
-    return get_main_window_actions(m_main_window_search_actions);
+    if(find_main_window_action(action) == 0) {
+      m_main_window_actions2.push_back(MainWindowAction::create(action));
+    }
   }
 
-  void ActionManager::add_main_window_action(std::map<int, Glib::RefPtr<Gtk::Action> > & actions,
-                                             const Glib::RefPtr<Gtk::Action> & action, int order)
+  std::vector<MainWindowAction::Ptr> ActionManager::get_main_window_actions() const
   {
-    std::map<int, Glib::RefPtr<Gtk::Action> >::iterator iter = actions.find(order);
-    while(iter != actions.end()) {
-      iter = actions.find(++order);
-    }
-    actions[order] = action;
+    return m_main_window_actions2;
   }
 
-  void ActionManager::remove_main_window_action(std::map<int, Glib::RefPtr<Gtk::Action> > & actions,
-    const std::string & name)
+  MainWindowAction::Ptr ActionManager::find_main_window_action(const Glib::ustring & name) const
   {
-    for(std::map<int, Glib::RefPtr<Gtk::Action> >::iterator iter = actions.begin();
-        iter != actions.end(); ++iter) {
-      if(iter->second->get_name() == name) {
-        actions.erase(iter);
-        break;
+    FOREACH(MainWindowAction::Ptr a, m_main_window_actions2) {
+      if(a->get_name() == name) {
+        return a;
       }
     }
-  }
 
-  std::vector<Glib::RefPtr<Gtk::Action> > ActionManager::get_main_window_actions(
-    std::map<int, Glib::RefPtr<Gtk::Action> > & actions)
-  {
-    std::vector<Glib::RefPtr<Gtk::Action> > res;
-    for(std::map<int, Glib::RefPtr<Gtk::Action> >::iterator iter = actions.begin();
-        iter != actions.end(); ++iter) {
-      res.push_back(iter->second);
-    }
-    return res;
+    return MainWindowAction::Ptr();
   }
 
 }
diff --git a/src/actionmanager.hpp b/src/actionmanager.hpp
index dffb33c..2925157 100644
--- a/src/actionmanager.hpp
+++ b/src/actionmanager.hpp
@@ -57,17 +57,13 @@ public:
   virtual void add_app_menu_item(int section, int order, const std::string & label,
                                  const std::string & action_def) override;
   Glib::RefPtr<Gio::Menu> get_app_menu() const;
-  virtual void add_main_window_search_action(const Glib::RefPtr<Gtk::Action> & action, int order) override;
-  virtual void remove_main_window_search_action(const std::string & name) override;
-  virtual std::vector<Glib::RefPtr<Gtk::Action> > get_main_window_search_actions() override;
+  virtual void register_main_window_action(const Glib::ustring & action) override;
+  virtual std::vector<MainWindowAction::Ptr> get_main_window_actions() const override;
+  virtual MainWindowAction::Ptr find_main_window_action(const Glib::ustring & name) const override;
 private:
   void make_app_actions();
   void make_app_menu_items();
   Glib::RefPtr<Gio::Menu> make_app_menu_section(int section) const;
-  void add_main_window_action(std::map<int, Glib::RefPtr<Gtk::Action> > & actions,
-                              const Glib::RefPtr<Gtk::Action> & action, int order);
-  void remove_main_window_action(std::map<int, Glib::RefPtr<Gtk::Action> > & actions, const std::string & 
name);
-  std::vector<Glib::RefPtr<Gtk::Action> > get_main_window_actions(std::map<int, Glib::RefPtr<Gtk::Action> > 
& actions);
 
   Glib::RefPtr<Gtk::ActionGroup> m_main_window_actions;
 
@@ -95,7 +91,7 @@ private:
   };
   typedef std::multimap<int, AppMenuItem> AppMenuItemMultiMap;
   AppMenuItemMultiMap m_app_menu_items;
-  std::map<int, Glib::RefPtr<Gtk::Action> > m_main_window_search_actions;
+  std::vector<MainWindowAction::Ptr> m_main_window_actions2;
 };
 
 
diff --git a/src/iactionmanager.hpp b/src/iactionmanager.hpp
index 6ac6725..3017778 100644
--- a/src/iactionmanager.hpp
+++ b/src/iactionmanager.hpp
@@ -26,6 +26,7 @@
 #include <gtkmm/uimanager.h>
 
 #include "base/singleton.hpp"
+#include "mainwindowaction.hpp"
 
 namespace gnote {
 
@@ -57,11 +58,9 @@ public:
   virtual Glib::RefPtr<Gio::SimpleAction> add_app_action(const std::string & name) = 0;
   virtual void add_app_menu_item(int section, int order, const std::string & label,
                                  const std::string & action_def) = 0;
-  virtual void add_main_window_search_action(const Glib::RefPtr<Gtk::Action> & action, int order) = 0;
-  virtual void remove_main_window_search_action(const std::string & name) = 0;
-  virtual std::vector<Glib::RefPtr<Gtk::Action> > get_main_window_search_actions() = 0;
-
-  sigc::signal<void> signal_main_window_search_actions_changed;
+  virtual void register_main_window_action(const Glib::ustring & action) = 0;
+  virtual std::vector<MainWindowAction::Ptr> get_main_window_actions() const = 0;
+  virtual MainWindowAction::Ptr find_main_window_action(const Glib::ustring & name) const = 0;
 };
 
 }
diff --git a/src/mainwindowembeds.hpp b/src/mainwindowembeds.hpp
index c306cc6..aa0d230 100644
--- a/src/mainwindowembeds.hpp
+++ b/src/mainwindowembeds.hpp
@@ -1,7 +1,7 @@
 /*
  * gnote
  *
- * Copyright (C) 2013 Aurimas Cernius
+ * Copyright (C) 2013,2015 Aurimas Cernius
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,6 +24,8 @@
 
 #include <gtkmm/widget.h>
 
+#include "mainwindowaction.hpp"
+
 
 namespace gnote {
 
@@ -87,8 +89,8 @@ public:
 class HasActions
 {
 public:
-  virtual std::vector<Glib::RefPtr<Gtk::Action> > get_widget_actions() = 0;
-  virtual sigc::signal<void> & signal_actions_changed() = 0;
+  virtual std::vector<Gtk::Widget*> get_popover_widgets() = 0;
+  virtual std::vector<MainWindowAction::Ptr> get_widget_actions() = 0;
 };
 
 }
diff --git a/src/notewindow.cpp b/src/notewindow.cpp
index f18b7cf..845a979 100644
--- a/src/notewindow.cpp
+++ b/src/notewindow.cpp
@@ -32,6 +32,7 @@
 #include <gtkmm/separatormenuitem.h>
 
 #include "debug.hpp"
+#include "iactionmanager.hpp"
 #include "iconmanager.hpp"
 #include "mainwindow.hpp"
 #include "note.hpp"
@@ -45,6 +46,7 @@
 #include "itagmanager.hpp"
 #include "notebooks/notebookmanager.hpp"
 #include "sharp/exception.hpp"
+#include "mainwindowaction.hpp"
 
 
 namespace gnote {
@@ -176,6 +178,12 @@ namespace gnote {
     if(parent) {
       parent->set_focus(*m_editor);
     }
+
+    // Don't allow deleting the "Start Here" note...
+    if(!m_note.is_special()) {
+      m_delete_note_slot = IActionManager::obj().find_main_window_action("delete-note")->signal_activate()
+        .connect(sigc::mem_fun(*this, &NoteWindow::on_delete_button_clicked));
+    }
   }
 
   void NoteWindow::background()
@@ -202,6 +210,7 @@ namespace gnote {
     }
 
     m_note.save();  // to update not title immediately in notes list
+    m_delete_note_slot.disconnect();
   }
 
   void NoteWindow::hint_size(int & width, int & height)
@@ -286,58 +295,24 @@ namespace gnote {
     return m_embeddable_toolbar;
   }
 
-  std::vector<Glib::RefPtr<Gtk::Action> > NoteWindow::get_widget_actions()
-  {
-    std::vector<Glib::RefPtr<Gtk::Action> > res;
-    for(std::map<int, Glib::RefPtr<Gtk::Action> >::iterator iter = m_widget_actions.begin();
-        iter != m_widget_actions.end(); ++iter) {
-      res.push_back(iter->second);
-    }
-
-    res.push_back(Glib::RefPtr<Gtk::Action>());
-    res.push_back(m_important_action);
-    if(m_delete_action) {
-      // Separator before delete
-      res.push_back(m_delete_action);
-    }
-    return res;
-  }
-
-  sigc::signal<void> & NoteWindow::signal_actions_changed()
-  {
-    return m_signal_actions_changed;
-  }
-
-  void NoteWindow::add_widget_action(const Glib::RefPtr<Gtk::Action> & action, int order)
+  std::vector<Gtk::Widget*> NoteWindow::get_popover_widgets()
   {
-    std::map<int, Glib::RefPtr<Gtk::Action> >::iterator iter = m_widget_actions.find(order);
-    while(iter != m_widget_actions.end()) {
-      iter = m_widget_actions.find(++order);
-    }
-    m_widget_actions[order] = action;
-    m_signal_actions_changed();
-    if(Glib::RefPtr<NonModifyingNoteAction>::cast_dynamic(action) == 0) {
-      action->set_sensitive(m_enabled);
-    }
+    std::vector<Gtk::Widget*> widgets;
+    widgets.push_back(utils::create_popover_button("win.delete-note", _("_Delete")));
+    return widgets;
   }
 
-  void NoteWindow::remove_widget_action(const std::string & name)
+  std::vector<MainWindowAction::Ptr> NoteWindow::get_widget_actions()
   {
-    for(std::map<int, Glib::RefPtr<Gtk::Action> >::iterator iter = m_widget_actions.begin();
-        iter != m_widget_actions.end(); ++iter) {
-      if(iter->second->get_name() == name) {
-        m_widget_actions.erase(iter);
-        break;
-      }
-    }
-    m_signal_actions_changed();
+    std::vector<MainWindowAction::Ptr> res;
+    IActionManager::obj().find_main_window_action("delete-note");
+    return res;
   }
 
-
     // Delete this Note.
     //
 
-  void NoteWindow::on_delete_button_clicked()
+  void NoteWindow::on_delete_button_clicked(const Glib::VariantBase&)
   {
     // Prompt for note deletion
     std::list<Note::Ptr> single_note_list;
@@ -426,13 +401,6 @@ namespace gnote {
     notebooks::NotebookManager::obj().signal_note_pin_status_changed
       .connect(sigc::mem_fun(*this, &NoteWindow::on_pin_status_changed));
 
-      // Don't allow deleting the "Start Here" note...
-    if(!m_note.is_special()) {
-      m_delete_action = Gtk::Action::create("delete-note", _("_Delete"), _("Delete this note"));
-      m_delete_action->signal_activate()
-        .connect(sigc::mem_fun(*this, &NoteWindow::on_delete_button_clicked));
-    }
-
     grid->property_margin_left() = 12;
     grid->show_all();
     return grid;
@@ -617,10 +585,10 @@ namespace gnote {
     embeddable_toolbar()->set_sensitive(m_enabled);
     if(m_global_keys)
       m_global_keys->enabled(m_enabled);
-    FOREACH(const Glib::RefPtr<Gtk::Action> & action, get_widget_actions()) {
+    FOREACH(const MainWindowAction::Ptr & action, get_widget_actions()) {
       // A list includes empty actions to mark separators, non-modifying actions are always enabled
       if(action != 0 && Glib::RefPtr<NonModifyingNoteAction>::cast_dynamic(action) == 0) {
-        action->set_sensitive(enable);
+        action->set_enabled(enable);
       }
     }
   }
diff --git a/src/notewindow.hpp b/src/notewindow.hpp
index 98faaf7..1c2a838 100644
--- a/src/notewindow.hpp
+++ b/src/notewindow.hpp
@@ -1,7 +1,7 @@
 /*
  * gnote
  *
- * Copyright (C) 2011-2014 Aurimas Cernius
+ * Copyright (C) 2011-2015 Aurimas Cernius
  * Copyright (C) 2009 Hubert Figuiere
  *
  * This program is free software: you can redistribute it and/or modify
@@ -197,10 +197,8 @@ public:
     virtual void reference() const override;
     virtual void unreference() const override;
   };
-  virtual std::vector<Glib::RefPtr<Gtk::Action> > get_widget_actions() override;
-  virtual sigc::signal<void> & signal_actions_changed() override;
-  void add_widget_action(const Glib::RefPtr<Gtk::Action> & action, int order);
-  void remove_widget_action(const std::string & name);
+  virtual std::vector<Gtk::Widget*> get_popover_widgets() override;
+  virtual std::vector<MainWindowAction::Ptr> get_widget_actions() override;
 
   void set_size(int width, int height)
     {
@@ -232,7 +230,7 @@ private:
   static Glib::RefPtr<Gio::Icon> get_icon_pin_active();
   static Glib::RefPtr<Gio::Icon> get_icon_pin_down();
 
-  void on_delete_button_clicked();
+  void on_delete_button_clicked(const Glib::VariantBase&);
   void on_selection_mark_set(const Gtk::TextIter&, const Glib::RefPtr<Gtk::TextMark>&);
   void on_populate_popup(Gtk::Menu*);
   Gtk::Grid *make_toolbar();
@@ -264,7 +262,7 @@ private:
   Gtk::ScrolledWindow          *m_editor_window;
   NoteFindHandler              m_find_handler;
   utils::CheckAction::Ptr       m_important_action;
-  Glib::RefPtr<Gtk::Action>     m_delete_action;
+  sigc::connection              m_delete_note_slot;
   Gtk::Grid                    *m_template_widget;
   Gtk::CheckButton             *m_save_size_check_button;
   Gtk::CheckButton             *m_save_selection_check_button;
@@ -274,9 +272,6 @@ private:
   utils::InterruptableTimeout  *m_mark_set_timeout;
   bool                         m_enabled;
 
-  std::map<int, Glib::RefPtr<Gtk::Action> > m_widget_actions;
-  sigc::signal<void> m_signal_actions_changed;
-
   Tag::Ptr m_template_tag;
   Tag::Ptr m_template_save_size_tag;
   Tag::Ptr m_template_save_selection_tag;
diff --git a/src/recentchanges.cpp b/src/recentchanges.cpp
index d838809..39f505f 100644
--- a/src/recentchanges.cpp
+++ b/src/recentchanges.cpp
@@ -32,6 +32,7 @@
 #include <gtkmm/stock.h>
 
 #include "debug.hpp"
+#include "iactionmanager.hpp"
 #include "ignote.hpp"
 #include "note.hpp"
 #include "notemanager.hpp"
@@ -39,7 +40,6 @@
 #include "recentchanges.hpp"
 #include "sharp/string.hpp"
 
-
 namespace gnote {
 
   NoteRecentChanges::NoteRecentChanges(NoteManager& m)
@@ -100,7 +100,13 @@ namespace gnote {
     m_keybinder.add_accelerator(sigc::mem_fun(*this, &NoteRecentChanges::close_window),
                                 GDK_KEY_Q, Gdk::CONTROL_MASK, (Gtk::AccelFlags)0);
 
-    m_window_menu_default = make_window_menu(m_window_actions_button, std::vector<Gtk::MenuItem*>());
+    FOREACH(MainWindowAction::Ptr action, IActionManager::obj().get_main_window_actions()) {
+      add_action(action);
+    }
+    IActionManager::obj().find_main_window_action("close-window")->signal_activate()
+      .connect(sigc::mem_fun(*this, &NoteRecentChanges::on_close_window));
+
+    m_window_menu_default = make_window_menu(m_window_actions_button, std::vector<Gtk::Widget*>());
     embed_widget(m_search_notes_widget);
   }
 
@@ -114,10 +120,10 @@ namespace gnote {
       delete m_entry_changed_timeout;
     }
     if(m_window_menu_embedded) {
-      delete m_window_menu_embedded;
+      gtk_widget_destroy(GTK_WIDGET(m_window_menu_embedded));
     }
     if(m_window_menu_default) {
-      delete m_window_menu_default;
+      gtk_widget_destroy(GTK_WIDGET(m_window_menu_default));
     }
   }
 
@@ -366,6 +372,12 @@ namespace gnote {
   }
 
 
+  void NoteRecentChanges::on_close_window(const Glib::VariantBase&)
+  {
+    close_window();
+  }
+
+
   bool NoteRecentChanges::on_delete(GdkEventAny *)
   {
     close_window();
@@ -513,10 +525,8 @@ namespace gnote {
 
     try {
       HasActions &has_actions = dynamic_cast<HasActions&>(widget);
-      m_current_embedded_actions_slot = has_actions.signal_actions_changed().connect(
-        boost::bind(sigc::mem_fun(*this, &NoteRecentChanges::on_main_window_actions_changed),
-                    &m_window_menu_embedded));
-      on_main_window_actions_changed(&m_window_menu_embedded);
+      std::vector<Gtk::Widget*> items = has_actions.get_popover_widgets();
+      m_window_menu_embedded = make_window_menu(m_window_actions_button, items);
     }
     catch(std::bad_cast&) {
     }
@@ -533,9 +543,18 @@ namespace gnote {
       m_embed_box.remove(wid);
 
       m_current_embedded_name_slot.disconnect();
-      m_current_embedded_actions_slot.disconnect();
+      try {
+        HasActions &has_actions = dynamic_cast<HasActions&>(widget);
+        FOREACH(MainWindowAction::Ptr action, has_actions.get_widget_actions()) {
+          if(action != 0) {
+            remove_action(action->get_name());
+          }
+        }
+      }
+      catch(std::bad_cast&) {
+      }
       if(m_window_menu_embedded) {
-        delete m_window_menu_embedded;
+        gtk_widget_destroy(GTK_WIDGET(m_window_menu_embedded));
         m_window_menu_embedded = NULL;
       }
     }
@@ -678,40 +697,33 @@ namespace gnote {
   {
     HasActions *embed_with_actions = dynamic_cast<HasActions*>(currently_embedded());
     if(embed_with_actions) {
-      utils::popup_menu(*m_window_menu_embedded, NULL);
+      gtk_widget_show_all(GTK_WIDGET(m_window_menu_embedded));
     }
     else {
-      utils::popup_menu(*m_window_menu_default, NULL);
+      gtk_widget_show_all(GTK_WIDGET(m_window_menu_default));
     }
   }
 
-  Gtk::Menu *NoteRecentChanges::make_window_menu(Gtk::Button *button, const std::vector<Gtk::MenuItem*> & 
items)
+  GtkPopoverMenu *NoteRecentChanges::make_window_menu(Gtk::Button *button, const std::vector<Gtk::Widget*> & 
items)
   {
-    Gtk::Menu *menu = new Gtk::Menu;
-    for(std::vector<Gtk::MenuItem*>::const_iterator iter = items.begin(); iter != items.end(); ++iter) {
-      menu->append(**iter);
-    }
-    if(items.size()) {
-      menu->append(*manage(new Gtk::SeparatorMenuItem));
+    GtkPopoverMenu *menu = GTK_POPOVER_MENU(gtk_popover_menu_new());
+    Gtk::Grid *grid = manage(new Gtk::Grid);
+    grid->property_margin() = 10;
+    int top = 0;
+    FOREACH(Gtk::Widget *item, items) {
+      grid->attach(*manage(item), 0, top++, 1, 1);
     }
-    Gtk::MenuItem *item = manage(new Gtk::MenuItem(_("_Close"), true));
-    item->add_accelerator("activate", get_accel_group(), GDK_KEY_W, Gdk::CONTROL_MASK, Gtk::ACCEL_VISIBLE);
-    item->add_accelerator("activate", get_accel_group(), GDK_KEY_Q, Gdk::CONTROL_MASK, Gtk::ACCEL_VISIBLE);
-    item->signal_activate().connect(sigc::mem_fun(*this, &NoteRecentChanges::close_window));
-    menu->append(*item);
-    menu->property_attach_widget() = button;
-    menu->show_all();
-    return menu;
-  }
 
-  std::vector<Gtk::MenuItem*> & NoteRecentChanges::make_menu_items(std::vector<Gtk::MenuItem*> & items,
-    const std::vector<Glib::RefPtr<Gtk::Action> > & actions)
-  {
-    FOREACH(Glib::RefPtr<Gtk::Action> action, actions) {
-      Gtk::MenuItem *item = manage(action ? action->create_menu_item() : new Gtk::SeparatorMenuItem);
-      items.push_back(item);
-    }
-    return items;
+    Gtk::Widget *close_item = manage(utils::create_popover_button("win.close-window", _("_Close")));
+    close_item->add_accelerator("activate", get_accel_group(), GDK_KEY_W, Gdk::CONTROL_MASK, 
Gtk::ACCEL_VISIBLE);
+    close_item->add_accelerator("activate", get_accel_group(), GDK_KEY_Q, Gdk::CONTROL_MASK, 
Gtk::ACCEL_VISIBLE);
+    grid->attach(*close_item, 0, top++, 1, 1);
+
+    gtk_container_add(GTK_CONTAINER(menu), GTK_WIDGET(grid->gobj()));
+    gtk_popover_set_relative_to(GTK_POPOVER(menu), GTK_WIDGET(button->gobj()));
+    gtk_popover_set_modal(GTK_POPOVER(menu), TRUE);
+    gtk_popover_set_position(GTK_POPOVER(menu), GTK_POS_BOTTOM);
+    return menu;
   }
 
   void NoteRecentChanges::on_embedded_name_changed(const std::string & name)
@@ -719,23 +731,6 @@ namespace gnote {
     set_title(name);
   }
 
-  void NoteRecentChanges::on_main_window_actions_changed(Gtk::Menu **menu)
-  {
-    if(*menu) {
-      delete *menu;
-      *menu = NULL;
-    }
-
-    HasActions *embed_with_actions = dynamic_cast<HasActions*>(currently_embedded());
-    if(embed_with_actions) {
-      if(!m_window_menu_embedded) {
-        std::vector<Gtk::MenuItem*> items;
-        m_window_menu_embedded = make_window_menu(m_window_actions_button,
-          make_menu_items(items, embed_with_actions->get_widget_actions()));
-      }
-    }
-  }
-
   void NoteRecentChanges::on_settings_changed(const Glib::ustring & key)
   {
     if(key == Preferences::OPEN_NOTES_IN_NEW_WINDOW) {
diff --git a/src/recentchanges.hpp b/src/recentchanges.hpp
index 3153ad1..7852cd0 100644
--- a/src/recentchanges.hpp
+++ b/src/recentchanges.hpp
@@ -26,6 +26,7 @@
 
 #include <string>
 
+#include <gtk/gtkpopovermenu.h>
 #include <gtkmm/alignment.h>
 #include <gtkmm/applicationwindow.h>
 #include <gtkmm/grid.h>
@@ -83,13 +84,11 @@ private:
   void on_search_button_toggled();
   void on_find_next_button_clicked();
   void on_find_prev_button_clicked();
-  Gtk::Menu *make_window_menu(Gtk::Button *button, const std::vector<Gtk::MenuItem*> & items);
-  std::vector<Gtk::MenuItem*> & make_menu_items(std::vector<Gtk::MenuItem*> & items,
-                                                const std::vector<Glib::RefPtr<Gtk::Action> > & actions);
+  GtkPopoverMenu *make_window_menu(Gtk::Button *button, const std::vector<Gtk::Widget*> & items);
   void on_embedded_name_changed(const std::string & name);
-  void on_main_window_actions_changed(Gtk::Menu **menu);
   void on_settings_changed(const Glib::ustring & key);
   bool on_notes_widget_key_press(GdkEventKey*);
+  void on_close_window(const Glib::VariantBase&);
 
   NoteManager        &m_note_manager;
   Gtk::Widget        *m_header_bar;
@@ -107,10 +106,9 @@ private:
   std::list<EmbeddableWidget*> m_embedded_widgets;
   bool                m_mapped;
   sigc::connection    m_current_embedded_name_slot;
-  sigc::connection    m_current_embedded_actions_slot;
   utils::InterruptableTimeout *m_entry_changed_timeout;
-  Gtk::Menu          *m_window_menu_embedded;
-  Gtk::Menu          *m_window_menu_default;
+  GtkPopoverMenu     *m_window_menu_embedded;
+  GtkPopoverMenu     *m_window_menu_default;
   utils::GlobalKeybinder m_keybinder;
   bool                m_open_notes_in_new_window;
   bool                m_close_note_on_escape;
diff --git a/src/searchnoteswidget.cpp b/src/searchnoteswidget.cpp
index 8c17252..d5c4800 100644
--- a/src/searchnoteswidget.cpp
+++ b/src/searchnoteswidget.cpp
@@ -1,7 +1,7 @@
 /*
  * gnote
  *
- * Copyright (C) 2010-2014 Aurimas Cernius
+ * Copyright (C) 2010-2015 Aurimas Cernius
  * Copyright (C) 2010 Debarshi Ray
  * Copyright (C) 2009 Hubert Figuiere
  *
@@ -1425,14 +1425,16 @@ void SearchNotesWidget::size_internals()
   }
 }
 
-std::vector<Glib::RefPtr<Gtk::Action> > SearchNotesWidget::get_widget_actions()
+std::vector<Gtk::Widget*> SearchNotesWidget::get_popover_widgets()
 {
-  return IActionManager::obj().get_main_window_search_actions();
+  std::vector<Gtk::Widget*> widgets;
+  return widgets;
 }
 
-sigc::signal<void> & SearchNotesWidget::signal_actions_changed()
+std::vector<MainWindowAction::Ptr> SearchNotesWidget::get_widget_actions()
 {
-  return IActionManager::obj().signal_main_window_search_actions_changed;
+  std::vector<MainWindowAction::Ptr> actions;
+  return actions;
 }
 
 void SearchNotesWidget::on_settings_changed(const Glib::ustring & key)
diff --git a/src/searchnoteswidget.hpp b/src/searchnoteswidget.hpp
index 995f329..011809f 100644
--- a/src/searchnoteswidget.hpp
+++ b/src/searchnoteswidget.hpp
@@ -1,7 +1,7 @@
 /*
  * gnote
  *
- * Copyright (C) 2010-2014 Aurimas Cernius
+ * Copyright (C) 2010-2015 Aurimas Cernius
  * Copyright (C) 2010 Debarshi Ray
  * Copyright (C) 2009 Hubert Figuiere
  *
@@ -54,8 +54,8 @@ public:
   virtual void hint_size(int & width, int & height) override;
   virtual void size_internals() override;
   virtual void perform_search(const std::string & search_text) override;
-  virtual std::vector<Glib::RefPtr<Gtk::Action> > get_widget_actions() override;
-  virtual sigc::signal<void> & signal_actions_changed() override;
+  virtual std::vector<Gtk::Widget*> get_popover_widgets() override;
+  virtual std::vector<MainWindowAction::Ptr> get_widget_actions() override;
 
   void select_all_notes_notebook();
   void new_note();
diff --git a/src/utils.cpp b/src/utils.cpp
index 2487b04..1217f31 100644
--- a/src/utils.cpp
+++ b/src/utils.cpp
@@ -1,7 +1,7 @@
 /*
  * gnote
  *
- * Copyright (C) 2010-2014 Aurimas Cernius
+ * Copyright (C) 2010-2015 Aurimas Cernius
  * Copyright (C) 2010 Debarshi Ray
  * Copyright (C) 2009 Hubert Figuiere
  *
@@ -273,6 +273,16 @@ namespace gnote {
     }
 
 
+    Gtk::Widget * create_popover_button(const Glib::ustring & action, const Glib::ustring & label)
+    {
+      GtkWidget *item = gtk_model_button_new();
+      gtk_actionable_set_action_name(GTK_ACTIONABLE(item), action.c_str());
+      gtk_button_set_label(GTK_BUTTON(item), label.c_str());
+      gtk_button_set_use_underline(GTK_BUTTON(item), TRUE);
+      return Glib::wrap(item);
+    }
+
+
     void GlobalKeybinder::add_accelerator(const sigc::slot<void> & handler, guint key, 
                                           Gdk::ModifierType modifiers, Gtk::AccelFlags flags)
     {
diff --git a/src/utils.hpp b/src/utils.hpp
index 7630724..c16036f 100644
--- a/src/utils.hpp
+++ b/src/utils.hpp
@@ -1,7 +1,7 @@
 /*
  * gnote
  *
- * Copyright (C) 2011-2013 Aurimas Cernius
+ * Copyright (C) 2011-2013,2015 Aurimas Cernius
  * Copyright (C) 2009 Hubert Figuiere
  *
  * This program is free software: you can redistribute it and/or modify
@@ -67,6 +67,8 @@ namespace gnote {
     void main_context_invoke(const sigc::slot<void> & slot);
     void main_context_call(const sigc::slot<void> & slot);
 
+    Gtk::Widget * create_popover_button(const Glib::ustring & action, const Glib::ustring & label);
+
     class GlobalKeybinder
     {
     public:


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]