[ekiga/ds-gtk-application] ActorMenu: Added support for added/removed Actor signals.



commit e8efd92de2425865c3d8adcf0806207bd2ebb2b9
Author: Damien Sandras <dsandras beip be>
Date:   Sun Mar 16 17:48:35 2014 +0100

    ActorMenu: Added support for added/removed Actor signals.
    
    This allows ContactActorMenu objects to be modified dynamically.

 lib/engine/gui/gtk-core/actor-menu.cpp |   74 ++++++++++++++++++++++++++++++--
 lib/engine/gui/gtk-core/actor-menu.h   |   13 +++--
 2 files changed, 78 insertions(+), 9 deletions(-)
---
diff --git a/lib/engine/gui/gtk-core/actor-menu.cpp b/lib/engine/gui/gtk-core/actor-menu.cpp
index 7cb28bf..ae9e5c0 100644
--- a/lib/engine/gui/gtk-core/actor-menu.cpp
+++ b/lib/engine/gui/gtk-core/actor-menu.cpp
@@ -57,8 +57,10 @@ action_activated (GSimpleAction *a,
 
 
 
-Ekiga::ActorMenu::ActorMenu (const Ekiga::Actor & _obj) : obj (_obj)
+Ekiga::ActorMenu::ActorMenu (Ekiga::Actor & _obj) : obj (_obj)
 {
+  obj.action_added.connect (boost::bind (&Ekiga::ActorMenu::add_gio_action, this, _1));
+  obj.action_removed.connect (boost::bind (&Ekiga::ActorMenu::remove_gio_action, this, _1));
 }
 
 
@@ -96,6 +98,38 @@ Ekiga::ActorMenu::add_gio_actions ()
 }
 
 
+void
+Ekiga::ActorMenu::add_gio_action (const std::string & name)
+{
+  GSimpleAction *action = NULL;
+  ActionMap::const_iterator it;
+
+  it = obj.actions.find (name);
+
+  if (it != obj.actions.end ()
+      && !g_action_map_lookup_action (G_ACTION_MAP (g_application_get_default ()),
+                                      it->first.c_str ())) {
+
+    action = g_simple_action_new (it->first.c_str (), NULL);
+    g_object_set_data (G_OBJECT (action), "action", it->second.get ());
+    g_action_map_add_action (G_ACTION_MAP (g_application_get_default ()),
+                             G_ACTION (action));
+    g_signal_connect (action, "activate",
+                      G_CALLBACK (action_activated),
+                      (gpointer) this);
+    g_object_unref (action);
+  }
+}
+
+
+void
+Ekiga::ActorMenu::remove_gio_action (const std::string & name)
+{
+  g_action_map_remove_action (G_ACTION_MAP (g_application_get_default ()),
+                              name.c_str ());
+}
+
+
 const std::string
 Ekiga::ActorMenu::get_xml_menu (const std::string & id,
                                 const std::string & content,
@@ -111,7 +145,7 @@ Ekiga::ActorMenu::get_xml_menu (const std::string & id,
 
 
 Ekiga::ActorMenu *
-Ekiga::ActorMenu::create (const Ekiga::Actor & obj)
+Ekiga::ActorMenu::create (Ekiga::Actor & obj)
 {
   Ekiga::ActorMenu *m = new Ekiga::ActorMenu (obj);
   m->add_gio_actions ();
@@ -154,7 +188,7 @@ Ekiga::ActorMenu::as_xml (const std::string & id)
 }
 
 
-Ekiga::ContactActorMenu::ContactActorMenu (const Ekiga::Actor & _obj) : ActorMenu (_obj)
+Ekiga::ContactActorMenu::ContactActorMenu (Ekiga::Actor & _obj) : ActorMenu (_obj)
 {
 }
 
@@ -189,6 +223,38 @@ Ekiga::ContactActorMenu::add_gio_actions ()
 
 
 void
+Ekiga::ContactActorMenu::add_gio_action (const std::string & name)
+{
+  GSimpleAction *action = NULL;
+  ActionMap::const_iterator it;
+
+  it = obj.actions.find (name);
+
+  if (it != obj.actions.end ()
+      && !g_action_map_lookup_action (G_ACTION_MAP (g_application_get_default ()),
+                                                 it->first.c_str ())) {
+
+    Ekiga::ContactAction *a = dynamic_cast<Ekiga::ContactAction *> (it->second.get ());
+
+    if (!a || !a->can_run_with_data (contact, uri)) {
+      g_action_map_remove_action (G_ACTION_MAP (g_application_get_default ()),
+                                  it->first.c_str ());
+    }
+    else if (a && a->can_run_with_data (contact, uri)) {
+      action = g_simple_action_new (it->first.c_str (), NULL);
+      g_object_set_data (G_OBJECT (action), "action", it->second.get ());
+      g_action_map_add_action (G_ACTION_MAP (g_application_get_default ()),
+                               G_ACTION (action));
+      g_signal_connect (action, "activate",
+                        G_CALLBACK (action_activated),
+                        (gpointer) this);
+      g_object_unref (action);
+    }
+  }
+}
+
+
+void
 Ekiga::ContactActorMenu::set_data (Ekiga::ContactPtr _contact,
                                    const std::string & _uri)
 {
@@ -232,7 +298,7 @@ Ekiga::ContactActorMenu::as_xml (const std::string & id)
 
 
 Ekiga::ContactActorMenu *
-Ekiga::ContactActorMenu::create (const Ekiga::Actor & obj)
+Ekiga::ContactActorMenu::create (Ekiga::Actor & obj)
 {
   Ekiga::ContactActorMenu *m = new Ekiga::ContactActorMenu (obj);
   m->add_gio_actions ();
diff --git a/lib/engine/gui/gtk-core/actor-menu.h b/lib/engine/gui/gtk-core/actor-menu.h
index 92c086a..dd5caa0 100644
--- a/lib/engine/gui/gtk-core/actor-menu.h
+++ b/lib/engine/gui/gtk-core/actor-menu.h
@@ -60,7 +60,7 @@ namespace Ekiga {
   {
   public:
 
-    static ActorMenu* create (const Actor & obj);
+    static ActorMenu* create (Actor & obj);
 
     ~ActorMenu ();
 
@@ -72,17 +72,19 @@ namespace Ekiga {
                                            bool full);
 
   protected:
-    ActorMenu (const Actor & obj);
+    ActorMenu (Actor & obj);
     virtual void add_gio_actions ();
+    virtual void add_gio_action (const std::string & name);
+    virtual void remove_gio_action (const std::string & name);
 
-    const Actor & obj;
+    Actor & obj;
   };
 
   class ContactActorMenu : public ActorMenu
   {
   public:
 
-    static ContactActorMenu* create (const Actor & obj);
+    static ContactActorMenu* create (Actor & obj);
 
     void set_data (ContactPtr _contact = ContactPtr (),
                    const std::string & _uri = "");
@@ -90,8 +92,9 @@ namespace Ekiga {
     const std::string as_xml (const std::string & id = "");
 
   protected:
-    ContactActorMenu (const Actor & obj);
+    ContactActorMenu (Actor & obj);
     void add_gio_actions ();
+    void add_gio_action (const std::string & name);
 
     ContactPtr contact;
     std::string uri;


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