[ekiga/ds-gtk-application] ActorMenu: Added support for added/removed Actor signals.
- From: Damien Sandras <dsandras src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [ekiga/ds-gtk-application] ActorMenu: Added support for added/removed Actor signals.
- Date: Sun, 16 Mar 2014 16:52:59 +0000 (UTC)
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]