[gnote] Fix blank first item in application menu (some envs)



commit 8d2ae0b191190b3e318f10e56b04e70701adf589
Author: Aurimas Černius <aurisc4 gmail com>
Date:   Sun Jun 16 20:23:50 2013 +0300

    Fix blank first item in application menu (some envs)
    
    Part of Bug 701967.

 src/actionmanager.cpp |   42 +++++++++++++++++++++++++-----------------
 src/actionmanager.hpp |   30 +++++++++++++++++-------------
 2 files changed, 42 insertions(+), 30 deletions(-)
---
diff --git a/src/actionmanager.cpp b/src/actionmanager.cpp
index 89f32c2..f91f98e 100644
--- a/src/actionmanager.cpp
+++ b/src/actionmanager.cpp
@@ -266,25 +266,26 @@ namespace gnote {
   {
     Glib::RefPtr<Gio::Menu> menu = Gio::Menu::create();
 
-    int pos = 0;
-    Glib::RefPtr<Gio::Menu> section = make_app_menu_section(APP_ACTION_NEW);
-    if(section != 0) {
-      menu->insert_section(pos++, "", section);
+    // append first section directly to menu, to avoid blank first item in some environments
+    std::pair<AppMenuItemMultiMap::const_iterator, AppMenuItemMultiMap::const_iterator>
+    range = m_app_menu_items.equal_range(APP_ACTION_NEW);
+    if(range.first != m_app_menu_items.end()) {
+      menu_append(menu, range.first, range.second);
     }
 
-    section = make_app_menu_section(APP_ACTION_MANAGE);
+    Glib::RefPtr<Gio::Menu> section = make_app_menu_section(APP_ACTION_MANAGE);
     if(section != 0) {
-      menu->insert_section(pos++, "", section);
+      menu->append_section("", section);
     }
 
     section = make_app_menu_section(APP_ACTION_HELP);
     if(section != 0) {
-      menu->insert_section(pos++, "", section);
+      menu->append_section("", section);
     }
 
     section = make_app_menu_section(APP_ACTION_LAST);
     if(section != 0) {
-      menu->insert_section(pos++, "", section);
+      menu->append_section("", section);
     }
 
     return menu;
@@ -297,21 +298,28 @@ namespace gnote {
 
     Glib::RefPtr<Gio::Menu> section;
     if(range.first != m_app_menu_items.end()) {
-      std::vector<const AppMenuItem*> menu_items;
-      for(AppMenuItemMultiMap::const_iterator iter = range.first; iter != range.second; ++iter) {
-        menu_items.push_back(&iter->second);
-      }
-      std::sort(menu_items.begin(), menu_items.end(), AppMenuItem::ptr_comparator());
-
       section = Gio::Menu::create();
-      for(std::vector<const AppMenuItem*>::iterator iter = menu_items.begin(); iter != menu_items.end(); 
++iter) {
-        section->append((*iter)->label, (*iter)->action_def);
-      }
+      menu_append(section, range.first, range.second);
     }
 
     return section;
   }
 
+  void ActionManager::menu_append(const Glib::RefPtr<Gio::Menu> & menu,
+                                  const AppMenuItemMultiMap::const_iterator & begin,
+                                  const AppMenuItemMultiMap::const_iterator & end) const
+  {
+    std::vector<const AppMenuItem*> menu_items;
+    for(AppMenuItemMultiMap::const_iterator iter = begin; iter != end; ++iter) {
+      menu_items.push_back(&iter->second);
+    }
+    std::sort(menu_items.begin(), menu_items.end(), AppMenuItem::ptr_comparator());
+
+    for(std::vector<const AppMenuItem*>::iterator iter = menu_items.begin(); iter != menu_items.end(); 
++iter) {
+      menu->append((*iter)->label, (*iter)->action_def);
+    }
+  }
+
   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);
diff --git a/src/actionmanager.hpp b/src/actionmanager.hpp
index f4b0b2f..0b9fa5c 100644
--- a/src/actionmanager.hpp
+++ b/src/actionmanager.hpp
@@ -71,19 +71,6 @@ public:
   virtual void remove_main_window_search_action(const std::string & name);
   virtual std::vector<Glib::RefPtr<Gtk::Action> > get_main_window_search_actions();
 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::UIManager> m_ui;
-  Glib::RefPtr<Gtk::ActionGroup> m_main_window_actions;
-
-  std::vector<Glib::RefPtr<Gio::SimpleAction> > m_app_actions;
-
   struct AppMenuItem
   {
     int order;
@@ -105,6 +92,23 @@ private:
     };
   };
   typedef std::multimap<int, AppMenuItem> AppMenuItemMultiMap;
+
+  void make_app_actions();
+  void make_app_menu_items();
+  Glib::RefPtr<Gio::Menu> make_app_menu_section(int section) const;
+  void menu_append(const Glib::RefPtr<Gio::Menu> & menu,
+                   const AppMenuItemMultiMap::const_iterator & begin,
+                   const AppMenuItemMultiMap::const_iterator & end) 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::UIManager> m_ui;
+  Glib::RefPtr<Gtk::ActionGroup> m_main_window_actions;
+
+  std::vector<Glib::RefPtr<Gio::SimpleAction> > m_app_actions;
+
   AppMenuItemMultiMap m_app_menu_items;
   std::map<int, Glib::RefPtr<Gtk::Action> > m_main_window_search_actions;
 };


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