[gnote] Refactor to use PopoverWidget all the way



commit 529b47a7b26172c259939184a7290918dbcd6b44
Author: Aurimas Černius <aurisc4 gmail com>
Date:   Mon Apr 1 00:05:26 2019 +0300

    Refactor to use PopoverWidget all the way

 src/mainwindowembeds.hpp  |  5 +++--
 src/notewindow.cpp        | 43 ++++++++++++++-----------------------------
 src/notewindow.hpp        |  4 ++--
 src/popoverwidgets.hpp    |  1 +
 src/recentchanges.cpp     | 41 ++++++++++++++++++++++-------------------
 src/recentchanges.hpp     |  4 ++--
 src/searchnoteswidget.cpp | 14 ++------------
 src/searchnoteswidget.hpp |  4 ++--
 8 files changed, 48 insertions(+), 68 deletions(-)
---
diff --git a/src/mainwindowembeds.hpp b/src/mainwindowembeds.hpp
index b5d123ae..9984782b 100644
--- a/src/mainwindowembeds.hpp
+++ b/src/mainwindowembeds.hpp
@@ -1,7 +1,7 @@
 /*
  * gnote
  *
- * Copyright (C) 2013,2015-2017 Aurimas Cernius
+ * Copyright (C) 2013,2015-2017,2019 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
@@ -25,6 +25,7 @@
 #include <gtkmm/widget.h>
 
 #include "mainwindowaction.hpp"
+#include "popoverwidgets.hpp"
 
 
 namespace gnote {
@@ -91,7 +92,7 @@ public:
 class HasActions
 {
 public:
-  virtual std::vector<Gtk::Widget*> get_popover_widgets() = 0;
+  virtual std::vector<PopoverWidget> get_popover_widgets() = 0;
   virtual std::vector<MainWindowAction::Ptr> get_widget_actions() = 0;
 
   sigc::signal<void> signal_popover_widgets_changed;
diff --git a/src/notewindow.cpp b/src/notewindow.cpp
index 8b76eac2..43333560 100644
--- a/src/notewindow.cpp
+++ b/src/notewindow.cpp
@@ -304,26 +304,21 @@ namespace gnote {
     return m_embeddable_toolbar;
   }
 
-  std::vector<Gtk::Widget*> NoteWindow::get_popover_widgets()
+  std::vector<PopoverWidget> NoteWindow::get_popover_widgets()
   {
-    std::vector<Gtk::Widget*> widgets;
-    std::map<int, Gtk::Widget*> widget_map;
     std::vector<PopoverWidget> popover_widgets;
     popover_widgets.reserve(20);
 
-    Gtk::Widget *new_note = manage(utils::create_popover_button("app.new-note", _("_New Note")));
-    widgets.push_back(new_note);
-    Gtk::Widget *new_window = manage(utils::create_popover_button("app.new-window", _("New _Window")));
-    widgets.push_back(new_window);
-    widgets.push_back(NULL);
-    Gtk::Widget *undo = manage(utils::create_popover_button("win.undo", _("_Undo")));
-    widgets.push_back(undo);
-    Gtk::Widget *redo = manage(utils::create_popover_button("win.redo", _("_Redo")));
-    widgets.push_back(redo);
-    widgets.push_back(NULL);
-
-    Gtk::Widget *link = manage(utils::create_popover_button("win.link", _("_Link to New Note")));
-    popover_widgets.push_back(PopoverWidget::create_for_note(2000, link));
+    Gtk::Widget *new_note = utils::create_popover_button("app.new-note", _("_New Note"));
+    popover_widgets.push_back(PopoverWidget(NOTE_SECTION_NEW, 1, new_note));
+    Gtk::Widget *new_window = utils::create_popover_button("app.new-window", _("New _Window"));
+    popover_widgets.push_back(PopoverWidget(NOTE_SECTION_NEW, 2, new_window));
+    Gtk::Widget *undo = utils::create_popover_button("win.undo", _("_Undo"));
+    popover_widgets.push_back(PopoverWidget(NOTE_SECTION_UNDO, 1, undo));
+    Gtk::Widget *redo = utils::create_popover_button("win.redo", _("_Redo"));
+    popover_widgets.push_back(PopoverWidget(NOTE_SECTION_UNDO, 2, redo));
+    Gtk::Widget *link = utils::create_popover_button("win.link", _("_Link to New Note"));
+    popover_widgets.push_back(PopoverWidget::create_for_note(LINK_ORDER, link));
     Gtk::Widget *important = utils::create_popover_button("win.important-note", _("_Important"));
     popover_widgets.push_back(PopoverWidget(NOTE_SECTION_FLAGS, IMPORTANT_ORDER, important));
 
@@ -334,20 +329,10 @@ namespace gnote {
       popover_widgets.insert(popover_widgets.end(), addin_widgets.begin(), addin_widgets.end());
     }
 
-    std::sort(popover_widgets.begin(), popover_widgets.end());
-    int last_section = 0;
-    for(auto & w : popover_widgets) {
-      // put separator between groups
-      if(w.section != last_section && widgets.size() > 0 && widgets.back() != NULL) {
-        widgets.push_back(NULL);
-      }
-      last_section = w.section;
-      widgets.push_back(w.widget);
-    }
-
-    widgets.push_back(utils::create_popover_button("win.delete-note", _("_Delete…")));
+    auto delete_button = utils::create_popover_button("win.delete-note", _("_Delete…"));
+    popover_widgets.push_back(PopoverWidget(NOTE_SECTION_ACTIONS, 1000, delete_button));
 
-    return widgets;
+    return popover_widgets;
   }
 
   std::vector<MainWindowAction::Ptr> NoteWindow::get_widget_actions()
diff --git a/src/notewindow.hpp b/src/notewindow.hpp
index f54a9abe..6e95b367 100644
--- a/src/notewindow.hpp
+++ b/src/notewindow.hpp
@@ -1,7 +1,7 @@
 /*
  * gnote
  *
- * Copyright (C) 2011-2017 Aurimas Cernius
+ * Copyright (C) 2011-2017,2019 Aurimas Cernius
  * Copyright (C) 2009 Hubert Figuiere
  *
  * This program is free software: you can redistribute it and/or modify
@@ -193,7 +193,7 @@ public:
     virtual void reference() const override;
     virtual void unreference() const override;
   };
-  virtual std::vector<Gtk::Widget*> get_popover_widgets() override;
+  virtual std::vector<PopoverWidget> get_popover_widgets() override;
   virtual std::vector<MainWindowAction::Ptr> get_widget_actions() override;
 
   void set_size(int width, int height)
diff --git a/src/popoverwidgets.hpp b/src/popoverwidgets.hpp
index 534617e6..5025b2f8 100644
--- a/src/popoverwidgets.hpp
+++ b/src/popoverwidgets.hpp
@@ -43,6 +43,7 @@ enum NoteActionOrder {
   SPELL_CHECK_ORDER = 200,
   IMPORTANT_ORDER = 300,
   // actions
+  LINK_ORDER = 50,
   EXPORT_TO_HTML_ORDER = 100,
   EXPORT_TO_GTG_ORDER = 200,
   INSERT_TIMESTAMP_ORDER = 300,
diff --git a/src/recentchanges.cpp b/src/recentchanges.cpp
index 6b983549..30d6909d 100644
--- a/src/recentchanges.cpp
+++ b/src/recentchanges.cpp
@@ -1,7 +1,7 @@
 /*
  * gnote
  *
- * Copyright (C) 2010-2018 Aurimas Cernius
+ * Copyright (C) 2010-2019 Aurimas Cernius
  * Copyright (C) 2010 Debarshi Ray
  * Copyright (C) 2009 Hubert Figuiere
  *
@@ -759,49 +759,52 @@ namespace gnote {
     HasActions *embed_with_actions = dynamic_cast<HasActions*>(currently_embedded());
     if(embed_with_actions) {
       if(m_window_menu_embedded == NULL) {
-        m_window_menu_embedded = make_window_menu(m_window_actions_button, 
embed_with_actions->get_popover_widgets());
+        m_window_menu_embedded = make_window_menu(m_window_actions_button, 
std::move(embed_with_actions->get_popover_widgets()));
       }
       m_window_menu_embedded->show_all();
     }
     else {
       if(m_window_menu_default == NULL) {
-        m_window_menu_default = make_window_menu(m_window_actions_button, std::vector<Gtk::Widget*>());
+        m_window_menu_default = make_window_menu(m_window_actions_button, std::vector<PopoverWidget>());
       }
       m_window_menu_default->show_all();
     }
   }
 
-  Gtk::PopoverMenu *NoteRecentChanges::make_window_menu(Gtk::Button *button, const std::vector<Gtk::Widget*> 
& items)
+  Gtk::PopoverMenu *NoteRecentChanges::make_window_menu(Gtk::Button *button, std::vector<PopoverWidget> && 
items)
   {
-    std::map<Glib::ustring, Gtk::Widget*> submenus;
+    std::sort(items.begin(), items.end());
     Gtk::PopoverMenu *menu = manage(new Gtk::PopoverMenu);
     Gtk::Box *menu_box = manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL));
     utils::set_common_popover_widget_props(*menu_box);
     if(items.size() > 0) {
-      FOREACH(Gtk::Widget *item, items) {
-        if(item) {
-          utils::PopoverSubmenu *submenu = dynamic_cast<utils::PopoverSubmenu*>(item);
+      auto iter = items.begin();
+      auto current_section = iter->section;
+      for(; iter != items.end() && iter->section != APP_CUSTOM_SECTION; ++iter) {
+          if(iter->section != current_section) {
+            current_section = iter->section;
+            menu_box->add(*manage(new Gtk::Separator));
+          }
+          menu_box->add(*manage(iter->widget));
+      }
+
+      menu->add(*menu_box);
+      for(; iter != items.end(); ++iter) {
+          utils::PopoverSubmenu *submenu = dynamic_cast<utils::PopoverSubmenu*>(iter->widget);
           if(submenu) {
-            submenus[submenu->name()] = item;
+            menu->add(*manage(iter->widget));
+            menu->child_property_submenu(*iter->widget) = submenu->name();
           }
           else {
-            menu_box->add(*manage(item));
+            ERR_OUT(_("Expected widget to be a sub-menu!"));
           }
-        }
-        else {
-          menu_box->add(*manage(new Gtk::Separator));
-        }
       }
     }
     else {
       menu_box->add(*manage(new Gtk::Label(_("No configured actions"))));
+      menu->add(*menu_box);
     }
 
-    menu->add(*menu_box);
-    for(auto & submenu : submenus) {
-      menu->add(*submenu.second);
-      menu->child_property_submenu(*submenu.second) = submenu.first;
-    }
     menu->set_relative_to(*button);
     menu->set_modal(true);
     menu->set_position(Gtk::POS_BOTTOM);
diff --git a/src/recentchanges.hpp b/src/recentchanges.hpp
index d6a59945..1ce5e1e5 100644
--- a/src/recentchanges.hpp
+++ b/src/recentchanges.hpp
@@ -1,7 +1,7 @@
 /*
  * gnote
  *
- * Copyright (C) 2010-2017 Aurimas Cernius
+ * Copyright (C) 2010-2017,2019 Aurimas Cernius
  * Copyright (C) 2010 Debarshi Ray
  * Copyright (C) 2009 Hubert Figuiere
  *
@@ -87,7 +87,7 @@ private:
   void on_search_button_toggled();
   void on_find_next_button_clicked();
   void on_find_prev_button_clicked();
-  Gtk::PopoverMenu *make_window_menu(Gtk::Button *button, const std::vector<Gtk::Widget*> & items);
+  Gtk::PopoverMenu *make_window_menu(Gtk::Button *button, std::vector<PopoverWidget> && items);
   void on_embedded_name_changed(const Glib::ustring & name);
   void on_settings_changed(const Glib::ustring & key);
   bool on_notes_widget_key_press(GdkEventKey*);
diff --git a/src/searchnoteswidget.cpp b/src/searchnoteswidget.cpp
index ced9d848..e206a6d1 100644
--- a/src/searchnoteswidget.cpp
+++ b/src/searchnoteswidget.cpp
@@ -1433,7 +1433,7 @@ void SearchNotesWidget::size_internals()
   }
 }
 
-std::vector<Gtk::Widget*> SearchNotesWidget::get_popover_widgets()
+std::vector<PopoverWidget> SearchNotesWidget::get_popover_widgets()
 {
   std::vector<PopoverWidget> popover_widgets;
   popover_widgets.reserve(20);
@@ -1441,17 +1441,7 @@ std::vector<Gtk::Widget*> SearchNotesWidget::get_popover_widgets()
   for(unsigned i = 0; i < popover_widgets.size(); ++i) {
     popover_widgets[i].secondary_order = i;
   }
-  std::sort(popover_widgets.begin(), popover_widgets.end());
-  std::vector<Gtk::Widget*> widgets;
-  int section = popover_widgets.size() ? popover_widgets.front().section : 0;
-  for(auto& widget : popover_widgets) {
-    if (section != widget.section) {
-      widgets.push_back(NULL);
-      section = widget.section;
-    }
-    widgets.push_back(widget.widget);
-  }
-  return widgets;
+  return popover_widgets;
 }
 
 std::vector<MainWindowAction::Ptr> SearchNotesWidget::get_widget_actions()
diff --git a/src/searchnoteswidget.hpp b/src/searchnoteswidget.hpp
index ddda1383..0121d182 100644
--- a/src/searchnoteswidget.hpp
+++ b/src/searchnoteswidget.hpp
@@ -1,7 +1,7 @@
 /*
  * gnote
  *
- * Copyright (C) 2010-2015,2017 Aurimas Cernius
+ * Copyright (C) 2010-2015,2017,2019 Aurimas Cernius
  * Copyright (C) 2010 Debarshi Ray
  * Copyright (C) 2009 Hubert Figuiere
  *
@@ -54,7 +54,7 @@ public:
   virtual void hint_size(int & width, int & height) override;
   virtual void size_internals() override;
   virtual void perform_search(const Glib::ustring & search_text) override;
-  virtual std::vector<Gtk::Widget*> get_popover_widgets() override;
+  virtual std::vector<PopoverWidget> get_popover_widgets() override;
   virtual std::vector<MainWindowAction::Ptr> get_widget_actions() override;
 
   void select_all_notes_notebook();


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