[gnote] Update readonly addin for popover



commit ee2cf90fc8047b02a0efc2895ce00b7f04c1da7a
Author: Aurimas Černius <aurisc4 gmail com>
Date:   Fri Jan 8 23:46:53 2016 +0200

    Update readonly addin for popover

 src/addins/readonly/readonly.desktop.in.in |    3 +
 src/addins/readonly/readonlynoteaddin.cpp  |   71 ++++++++++++----------------
 src/addins/readonly/readonlynoteaddin.hpp  |    9 ++-
 3 files changed, 39 insertions(+), 44 deletions(-)
---
diff --git a/src/addins/readonly/readonly.desktop.in.in b/src/addins/readonly/readonly.desktop.in.in
index 9ad2e63..40ebc43 100644
--- a/src/addins/readonly/readonly.desktop.in.in
+++ b/src/addins/readonly/readonly.desktop.in.in
@@ -9,3 +9,6 @@ DefaultEnabled=false
 Module=readonly
 LibgnoteRelease= LIBGNOTE_RELEASE@
 LibgnoteVersionInfo= LIBGNOTE_VERSION_INFO@
+[Actions]
+actions_bool=readonly-toggle
+non_modifying_actions=readonly-toggle
diff --git a/src/addins/readonly/readonlynoteaddin.cpp b/src/addins/readonly/readonlynoteaddin.cpp
index 00b28d7..5a9d81f 100644
--- a/src/addins/readonly/readonlynoteaddin.cpp
+++ b/src/addins/readonly/readonlynoteaddin.cpp
@@ -1,7 +1,7 @@
 /*
  * gnote
  *
- * Copyright (C) 2013 Aurimas Cernius
+ * Copyright (C) 2013,2016 Aurimas Cernius
  * Copyright (C) 2010 Debarshi Ray
  *
  * This program is free software: you can redistribute it and/or modify
@@ -20,6 +20,7 @@
 
 #include <glibmm/i18n.h>
 
+#include "debug.hpp"
 #include "iactionmanager.hpp"
 #include "itagmanager.hpp"
 #include "notewindow.hpp"
@@ -27,36 +28,6 @@
 #include "tag.hpp"
 
 
-namespace {
-  class ReadOnlyAction
-    : public gnote::utils::CheckAction
-    , public gnote::NoteWindow::NonModifyingNoteAction
-  {
-  public:
-    typedef Glib::RefPtr<ReadOnlyAction> Ptr;
-    static Ptr create()
-      {
-        return Ptr(new ReadOnlyAction);
-      }
-    virtual void reference() const override
-    {
-      gnote::utils::CheckAction::reference();
-    }
-    virtual void unreference() const override
-    {
-      gnote::utils::CheckAction::unreference();
-    }
-  private:
-    ReadOnlyAction()
-      : gnote::utils::CheckAction("ReadOnlyAction")
-    {
-      set_label(_("Read Only"));
-      set_tooltip(_("Make this note read-only"));
-    }
-  };
-}
-
-
 namespace readonly {
 
 DECLARE_MODULE(ReadOnlyModule);
@@ -88,24 +59,42 @@ void ReadOnlyNoteAddin::shutdown()
 
 void ReadOnlyNoteAddin::on_note_opened()
 {
-  m_action = ReadOnlyAction::create();
-  add_note_action(m_action, gnote::READ_ONLY_ORDER);
-  m_action->signal_activate().connect(
-    sigc::mem_fun(*this, &ReadOnlyNoteAddin::on_menu_item_toggled));
+  get_window()->signal_foregrounded.connect(sigc::mem_fun(*this, &ReadOnlyNoteAddin::on_foreground));
+  get_window()->signal_backgrounded.connect(sigc::mem_fun(*this, &ReadOnlyNoteAddin::on_background));
+}
+
+std::map<int, Gtk::Widget*> ReadOnlyNoteAddin::get_actions_popover_widgets() const
+{
+  auto widgets = NoteAddin::get_actions_popover_widgets();
+  auto button = gnote::utils::create_popover_button("win.readonly-toggle", _("Read Only"));
+  gnote::utils::add_item_to_ordered_map(widgets, gnote::READ_ONLY_ORDER, button);
+  return widgets;
+}
 
+void ReadOnlyNoteAddin::on_foreground()
+{
+  auto action = get_window()->host()->find_action("readonly-toggle");
   gnote::ITagManager & m = gnote::ITagManager::obj();
   const gnote::Tag::Ptr ro_tag = m.get_or_create_system_tag("read-only");
-  if(get_note()->contains_tag(ro_tag)) {
-    ReadOnlyAction::Ptr::cast_dynamic(m_action)->checked(true);
-    on_menu_item_toggled();
-  }
+
+  m_readonly_toggle_cid = action->signal_change_state()
+    .connect(sigc::mem_fun(*this, &ReadOnlyNoteAddin::on_menu_item_toggled));
+  action->change_state(Glib::Variant<bool>::create(get_note()->contains_tag(ro_tag)));
+}
+
+void ReadOnlyNoteAddin::on_background()
+{
+  m_readonly_toggle_cid.disconnect();
 }
 
-void ReadOnlyNoteAddin::on_menu_item_toggled()
+void ReadOnlyNoteAddin::on_menu_item_toggled(const Glib::VariantBase & state)
 {
   gnote::ITagManager & m = gnote::ITagManager::obj();
   const gnote::Tag::Ptr ro_tag = m.get_or_create_system_tag("read-only");
-  if(ReadOnlyAction::Ptr::cast_dynamic(m_action)->checked()) {
+  bool read_only = Glib::VariantBase::cast_dynamic<Glib::Variant<bool>>(state).get();
+  auto action = get_window()->host()->find_action("readonly-toggle");
+  action->set_state(state);
+  if(read_only) {
     get_note()->enabled(false);
     get_note()->add_tag(ro_tag);
   }
diff --git a/src/addins/readonly/readonlynoteaddin.hpp b/src/addins/readonly/readonlynoteaddin.hpp
index e346004..27615d2 100644
--- a/src/addins/readonly/readonlynoteaddin.hpp
+++ b/src/addins/readonly/readonlynoteaddin.hpp
@@ -1,7 +1,7 @@
 /*
  * gnote
  *
- * Copyright (C) 2013 Aurimas Cernius
+ * Copyright (C) 2013,2016 Aurimas Cernius
  * Copyright (C) 2010 Debarshi Ray
  *
  * This program is free software: you can redistribute it and/or modify
@@ -47,11 +47,14 @@ 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:
   ReadOnlyNoteAddin();
-  void on_menu_item_toggled();
+  void on_menu_item_toggled(const Glib::VariantBase & state);
+  void on_foreground();
+  void on_background();
 
-  Glib::RefPtr<Gtk::Action> m_action;
+  sigc::connection m_readonly_toggle_cid;
 };
 
 }


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