[gnote] Update backlinks for popover



commit a1f75189c14ca646d31303688bbe8f9b3db7d877
Author: Aurimas Černius <aurisc4 gmail com>
Date:   Sat Jan 2 20:17:53 2016 +0200

    Update backlinks for popover

 src/addins/backlinks/Makefile.am             |    1 -
 src/addins/backlinks/backlinkmenuitem.cpp    |  107 --------------------------
 src/addins/backlinks/backlinkmenuitem.hpp    |   72 -----------------
 src/addins/backlinks/backlinks.desktop.in.in |    4 +-
 src/addins/backlinks/backlinksnoteaddin.cpp  |   90 ++++++++++++++--------
 src/addins/backlinks/backlinksnoteaddin.hpp  |   13 +--
 6 files changed, 66 insertions(+), 221 deletions(-)
---
diff --git a/src/addins/backlinks/Makefile.am b/src/addins/backlinks/Makefile.am
index bf462a9..389b779 100644
--- a/src/addins/backlinks/Makefile.am
+++ b/src/addins/backlinks/Makefile.am
@@ -12,7 +12,6 @@ addins_DATA = $(desktop_files)
 
 
 backlinks_la_SOURCES = backlinksnoteaddin.hpp backlinksnoteaddin.cpp \
-       backlinkmenuitem.hpp backlinkmenuitem.cpp \
        $(NULL)
 
 EXTRA_DIST = $(desktop_in_files)
diff --git a/src/addins/backlinks/backlinks.desktop.in.in b/src/addins/backlinks/backlinks.desktop.in.in
index 0182168..c5fa5f6 100644
--- a/src/addins/backlinks/backlinks.desktop.in.in
+++ b/src/addins/backlinks/backlinks.desktop.in.in
@@ -4,8 +4,10 @@ _Name=Backlinks
 _Description=See which notes link to the one you're currently viewing.
 _Authors=Hubert Figuiere and Tomboy Project
 Category=Tools
-Version=0.3
+Version=0.4
 DefaultEnabled=true
 Module=backlinks
 LibgnoteRelease= LIBGNOTE_RELEASE@
 LibgnoteVersionInfo= LIBGNOTE_VERSION_INFO@
+[Actions]
+actions_string=backlinks-open-note
diff --git a/src/addins/backlinks/backlinksnoteaddin.cpp b/src/addins/backlinks/backlinksnoteaddin.cpp
index 91de10a..1a20a42 100644
--- a/src/addins/backlinks/backlinksnoteaddin.cpp
+++ b/src/addins/backlinks/backlinksnoteaddin.cpp
@@ -1,7 +1,7 @@
 /*
  * gnote
  *
- * Copyright (C) 2010-2011,2013-2014 Aurimas Cernius
+ * Copyright (C) 2010-2011,2013-2014,2016 Aurimas Cernius
  * Copyright (C) 2009 Hubert Figuiere
  *
  * This program is free software: you can redistribute it and/or modify
@@ -19,12 +19,14 @@
  */
 
 #include <glibmm/i18n.h>
+#include <gtkmm/modelbutton.h>
 
 #include "sharp/string.hpp"
 #include "backlinksnoteaddin.hpp"
-#include "backlinkmenuitem.hpp"
 #include "iactionmanager.hpp"
+#include "mainwindow.hpp"
 #include "notemanager.hpp"
+#include "preferences.hpp"
 #include "utils.hpp"
 
 namespace backlinks {
@@ -53,56 +55,80 @@ void BacklinksNoteAddin::shutdown ()
 
 void BacklinksNoteAddin::on_note_opened ()
 {
-  Glib::RefPtr<Gtk::Action> action = BacklinkAction::create(
-    sigc::mem_fun(*this, &BacklinksNoteAddin::update_menu));
-  add_note_action(action, gnote::BACKLINKS_ORDER);
+  register_main_window_action_callback("backlinks-open-note",
+    sigc::mem_fun(*this, &BacklinksNoteAddin::on_open_note));
 }
 
-void BacklinksNoteAddin::update_menu(Gtk::Menu *menu)
+void BacklinksNoteAddin::on_open_note(const Glib::VariantBase & param)
 {
-  //
-  // Clear out the old list
-  //
-  std::vector<Gtk::Widget*> menu_items = menu->get_children();
-  for(std::vector<Gtk::Widget*>::reverse_iterator iter = menu_items.rbegin();
-      iter != menu_items.rend(); ++iter) {
-    menu->remove(**iter);
+  Glib::ustring uri = Glib::VariantBase::cast_dynamic<Glib::Variant<Glib::ustring>>(param).get();
+  gnote::NoteBase::Ptr note = get_note()->manager().find_by_uri(uri);
+  if(note) {
+    gnote::MainWindow::present_in_new_window(static_pointer_cast<gnote::Note>(note),
+      gnote::Preferences::obj().get_schema_settings(gnote::Preferences::SCHEMA_GNOTE)->
+        get_boolean(gnote::Preferences::ENABLE_CLOSE_NOTE_ON_ESCAPE));
   }
+}
+
+std::map<int, Gtk::Widget*> BacklinksNoteAddin::get_actions_popover_widgets() const
+{
+  auto widgets = NoteAddin::get_actions_popover_widgets();
+  auto menu_button = gnote::utils::create_popover_submenu_button("backlinks-menu", _("What links here?"));
+  gnote::utils::add_item_to_ordered_map(widgets, gnote::BACKLINKS_ORDER, menu_button);
+
+  auto submenu = gnote::utils::create_popover_submenu("backlinks-menu");
+  update_menu(submenu);
+  gnote::utils::add_item_to_ordered_map(widgets, 100000, submenu);
 
-  //
-  // Build a new list
-  //
-  std::list<BacklinkMenuItem*> items;
+  return widgets;
+}
+
+void BacklinksNoteAddin::update_menu(Gtk::Grid *menu) const
+{
+  std::list<Gtk::Widget*> items;
   get_backlink_menu_items(items);
-  for(std::list<BacklinkMenuItem*>::iterator iter = items.begin();
-      iter != items.end(); ++iter) {
-    BacklinkMenuItem * item(*iter);
-    item->show_all();
-    menu->append (*item);
+  int top = 0;
+  auto sub = manage(new Gtk::Grid);
+  gnote::utils::set_common_popover_widget_props(*sub);
+  int subtop = 0;
+  for(auto item : items) {
+    dynamic_cast<Gtk::ModelButton*>(item)->property_inverted() = true;
+    sub->attach(*item, 0, subtop++, 1, 1);
   }
 
   // If nothing was found, add in a "dummy" item
-  if(menu->get_children().size() == 0) {
-    Gtk::MenuItem *blank_item = manage(new Gtk::MenuItem(_("(none)")));
-    blank_item->set_sensitive(false);
-    blank_item->show_all ();
-    menu->append(*blank_item);
+  if(subtop == 0) {
+    Gtk::Widget *blank_item = manage(gnote::utils::create_popover_button("win.backlinks-nonexistent", 
_("(none)")));
+    sub->attach(*blank_item, 0, subtop++, 1, 1);
   }
+  menu->attach(*sub, 0, top++, 1, 1);
+
+  sub = manage(new Gtk::Grid);
+  gnote::utils::set_common_popover_widget_props(*sub);
+  subtop = 0;
+  auto back = gnote::utils::create_popover_submenu_button("main", _("_Back"));
+  dynamic_cast<Gtk::ModelButton*>(back)->property_inverted() = true;
+  sub->attach(*back, 0, subtop++, 1, 1);
+  menu->attach(*sub, 0, top++, 1, 1);
 }
 
 
-void BacklinksNoteAddin::get_backlink_menu_items(std::list<BacklinkMenuItem*> & items)
+void BacklinksNoteAddin::get_backlink_menu_items(std::list<Gtk::Widget*> & items) const
 {
   gnote::NoteBase::List notes = get_note()->manager().get_notes_linking_to(get_note()->get_title());
   FOREACH(const gnote::NoteBase::Ptr & note, notes) {
     if(note != get_note()) { // don't match ourself
-      BacklinkMenuItem *item = manage(new BacklinkMenuItem(note, get_note()->get_title()));
-
-      items.push_back(item);
+      auto button = manage(gnote::utils::create_popover_button("win.backlinks-open-note", 
note->get_title()));
+      gtk_actionable_set_action_target_value(GTK_ACTIONABLE(button->gobj()),
+        Glib::Variant<Glib::ustring>::create(note->uri()).gobj());
+      items.push_back(button);
     }
   }
 
-  items.sort();
+  items.sort([](Gtk::Widget *x, Gtk::Widget *y)
+    {
+      return dynamic_cast<Gtk::ModelButton*>(x)->get_label() < 
dynamic_cast<Gtk::ModelButton*>(y)->get_label();
+    });
 }
 
 
diff --git a/src/addins/backlinks/backlinksnoteaddin.hpp b/src/addins/backlinks/backlinksnoteaddin.hpp
index 6bdf35c..6075fba 100644
--- a/src/addins/backlinks/backlinksnoteaddin.hpp
+++ b/src/addins/backlinks/backlinksnoteaddin.hpp
@@ -1,7 +1,7 @@
 /*
  * gnote
  *
- * Copyright (C) 2010,2013 Aurimas Cernius
+ * Copyright (C) 2010,2013,2016 Aurimas Cernius
  * Copyright (C) 2009 Hubert Figuiere
  *
  * This program is free software: you can redistribute it and/or modify
@@ -23,12 +23,7 @@
 
 #include <list>
 
-#include <gtkmm/imagemenuitem.h>
-#include <gtkmm/menu.h>
-
-#include "base/macros.hpp"
 #include "sharp/dynamicmodule.hpp"
-#include "note.hpp"
 #include "noteaddin.hpp"
 
 namespace backlinks {
@@ -57,9 +52,11 @@ public:
   virtual void initialize() override;
   virtual void shutdown() override;
   virtual void on_note_opened() override;
+  virtual std::map<int, Gtk::Widget*> get_actions_popover_widgets() const override;
 private:
-  void update_menu(Gtk::Menu *menu);
-  void get_backlink_menu_items(std::list<BacklinkMenuItem*> & items);
+  void on_open_note(const Glib::VariantBase & param);
+  void update_menu(Gtk::Grid *menu) const;
+  void get_backlink_menu_items(std::list<Gtk::Widget*> & items) const;
   bool check_note_has_match(const gnote::Note::Ptr &, const std::string &);
 };
 


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