[ekiga/ds-gtk-application] ActorMenu: Improved code.



commit 75cf3d0fce06bdb7e8170fdc6c2ef0616901d11e
Author: Damien Sandras <dsandras beip be>
Date:   Sun Mar 16 18:08:32 2014 +0100

    ActorMenu: Improved code.

 lib/engine/gui/gtk-core/actor-menu.cpp |   94 +++++++++++++++-----------------
 lib/engine/gui/gtk-core/actor-menu.h   |    2 +
 2 files changed, 46 insertions(+), 50 deletions(-)
---
diff --git a/lib/engine/gui/gtk-core/actor-menu.cpp b/lib/engine/gui/gtk-core/actor-menu.cpp
index ae9e5c0..b30de9c 100644
--- a/lib/engine/gui/gtk-core/actor-menu.cpp
+++ b/lib/engine/gui/gtk-core/actor-menu.cpp
@@ -77,7 +77,6 @@ Ekiga::ActorMenu::~ActorMenu ()
 void
 Ekiga::ActorMenu::add_gio_actions ()
 {
-  GSimpleAction *action = NULL;
   ActionMap::const_iterator it;
 
   for (it = obj.actions.begin(); it != obj.actions.end(); ++it) {
@@ -85,14 +84,8 @@ Ekiga::ActorMenu::add_gio_actions ()
     if (!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);
+      Ekiga::Action *a = dynamic_cast<Ekiga::Action *> (it->second.get ());
+      add_action (a);
     }
   }
 }
@@ -101,7 +94,6 @@ 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);
@@ -110,19 +102,29 @@ Ekiga::ActorMenu::add_gio_action (const std::string & name)
       && !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);
+    Ekiga::Action *a = dynamic_cast<Ekiga::Action *> (it->second.get ());
+    add_action (a);
   }
 }
 
 
 void
+Ekiga::ActorMenu::add_action (Ekiga::Action *a)
+{
+  GSimpleAction *action = NULL;
+
+  action = g_simple_action_new (a->get_name ().c_str (), NULL);
+  g_object_set_data (G_OBJECT (action), "action", a);
+  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 ()),
@@ -196,28 +198,12 @@ Ekiga::ContactActorMenu::ContactActorMenu (Ekiga::Actor & _obj) : ActorMenu (_ob
 void
 Ekiga::ContactActorMenu::add_gio_actions ()
 {
-  GSimpleAction *action = NULL;
   ActionMap::const_iterator it;
 
   for (it = obj.actions.begin(); it != obj.actions.end(); ++it) {
 
     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);
-    }
+    add_action (a);
   }
 }
 
@@ -225,7 +211,6 @@ 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);
@@ -235,21 +220,30 @@ Ekiga::ContactActorMenu::add_gio_action (const std::string & name)
                                                  it->first.c_str ())) {
 
     Ekiga::ContactAction *a = dynamic_cast<Ekiga::ContactAction *> (it->second.get ());
+    add_action (a);
+  }
+}
 
-    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::add_action (Ekiga::Action *_action)
+{
+  GSimpleAction *action = NULL;
+  Ekiga::ContactAction *a = dynamic_cast<Ekiga::ContactAction *> (_action);
+
+  if (!a || !a->can_run_with_data (contact, uri)) {
+    g_action_map_remove_action (G_ACTION_MAP (g_application_get_default ()),
+                                a->get_name ().c_str ());
+  }
+  else if (a && a->can_run_with_data (contact, uri)) {
+    action = g_simple_action_new (a->get_name ().c_str (), NULL);
+    g_object_set_data (G_OBJECT (action), "action", a);
+    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);
   }
 }
 
diff --git a/lib/engine/gui/gtk-core/actor-menu.h b/lib/engine/gui/gtk-core/actor-menu.h
index dd5caa0..04b4686 100644
--- a/lib/engine/gui/gtk-core/actor-menu.h
+++ b/lib/engine/gui/gtk-core/actor-menu.h
@@ -75,6 +75,7 @@ namespace Ekiga {
     ActorMenu (Actor & obj);
     virtual void add_gio_actions ();
     virtual void add_gio_action (const std::string & name);
+    virtual void add_action (Action *a);
     virtual void remove_gio_action (const std::string & name);
 
     Actor & obj;
@@ -95,6 +96,7 @@ namespace Ekiga {
     ContactActorMenu (Actor & obj);
     void add_gio_actions ();
     void add_gio_action (const std::string & name);
+    void add_action (Action *a);
 
     ContactPtr contact;
     std::string uri;


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