[ekiga/ds-gtk-application] Main Window: Regenerate the window menu on contact selection.
- From: Damien Sandras <dsandras src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [ekiga/ds-gtk-application] Main Window: Regenerate the window menu on contact selection.
- Date: Tue, 4 Mar 2014 19:33:10 +0000 (UTC)
commit 153935d6d5754b758e819691377d3bd5688f36e9
Author: Damien Sandras <dsandras beip be>
Date: Tue Mar 4 20:31:13 2014 +0100
Main Window: Regenerate the window menu on contact selection.
It uses the new dynamic ActorMenu and ContactActorMenu stuff to expose
GIO Actions defined through the Action/Actor engine mechanism.
It is currently limited to call history contacts.
lib/engine/gui/gtk-frontend/main_window.cpp | 69 +++++++++++++++------------
1 files changed, 39 insertions(+), 30 deletions(-)
---
diff --git a/lib/engine/gui/gtk-frontend/main_window.cpp b/lib/engine/gui/gtk-frontend/main_window.cpp
index a585d55..b16685d 100644
--- a/lib/engine/gui/gtk-frontend/main_window.cpp
+++ b/lib/engine/gui/gtk-frontend/main_window.cpp
@@ -52,6 +52,7 @@
#include "menu-builder-tools.h"
#include "menu-builder-gtk.h"
#include "scoped-connections.h"
+#include "actor-menu.h"
#include <glib/gi18n.h>
#include <gdk/gdkkeysyms.h>
@@ -90,6 +91,12 @@ struct deviceStruct {
G_DEFINE_TYPE (EkigaMainWindow, ekiga_main_window, GM_TYPE_WINDOW);
+struct null_deleter
+{
+ void operator()(void const *) const
+ {
+ }
+};
struct _EkigaMainWindowPrivate
{
@@ -112,6 +119,8 @@ struct _EkigaMainWindowPrivate
GtkWidget *main_notebook;
GtkBuilder *builder;
+ boost::shared_ptr<Ekiga::ContactActorMenu> contact_menu;
+
/* Dialpad uri toolbar */
GtkWidget *uri_toolbar;
GtkWidget *entry;
@@ -547,29 +556,29 @@ on_history_selection_changed (G_GNUC_UNUSED GtkWidget* view,
gpointer self)
{
EkigaMainWindow *mw = EKIGA_MAIN_WINDOW (self);
- gint section;
- GtkWidget* menu = gtk_menu_new_from_model (G_MENU_MODEL (gtk_builder_get_object (mw->priv->builder,
"contact")));
-
- section = gtk_notebook_get_current_page (GTK_NOTEBOOK (mw->priv->main_notebook));
-
- if (section == mw->priv->call_history_page_number) {
-
- MenuBuilderGtk builder (menu);
- gtk_widget_set_sensitive (menu, TRUE);
-
- if (call_history_view_gtk_populate_menu_for_selected (CALL_HISTORY_VIEW_GTK
(mw->priv->call_history_view), builder)) {
-
- gtk_widget_show_all (builder.menu);
- } else {
+ History::Contact *contact = NULL;
+ GtkBuilder *builder = NULL;
- gtk_widget_set_sensitive (menu, FALSE);
- g_object_ref_sink (builder.menu);
- g_object_unref (builder.menu);
- }
- } else {
+ call_history_view_gtk_get_selected (CALL_HISTORY_VIEW_GTK (mw->priv->call_history_view),
+ &contact);
- gtk_widget_set_sensitive (menu, FALSE);
- gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu), NULL);
+ if (contact == NULL) {
+ mw->priv->contact_menu->set_data ();
+ g_menu_remove (G_MENU (gtk_builder_get_object (mw->priv->builder, "menubar")), 0);
+ }
+ else {
+ mw->priv->contact_menu->set_data (Ekiga::ContactPtr (contact, null_deleter ()),
+ contact->get_uri ());
+ builder = gtk_builder_new ();
+ gtk_builder_add_from_string (builder,
+ Ekiga::ActorMenu::get_xml_menu ("action",
+ mw->priv->contact_menu->as_xml (),
+ true).c_str (),
+ -1, NULL);
+ g_menu_prepend_submenu (G_MENU (gtk_builder_get_object (mw->priv->builder, "menubar")),
+ _("Contact"),
+ G_MENU_MODEL (gtk_builder_get_object (builder, "action")));
+ g_object_unref (builder);
}
}
@@ -915,14 +924,8 @@ ekiga_main_window_init_menu (EkigaMainWindow *mw)
"<?xml version='1.0'?>"
"<interface>"
" <menu id='menubar'>"
- " <section id='action'>"
- " </section>"
" <section>"
" <item>"
- " <attribute name='label' translatable='yes'>_Aontact</attribute>"
- " <attribute name='action'>win.clear</attribute>"
- " </item>"
- " <item>"
" <attribute name='label' translatable='yes'>_Add Contact</attribute>"
" <attribute name='action'>win.add</attribute>"
" </item>"
@@ -943,16 +946,19 @@ ekiga_main_window_init_menu (EkigaMainWindow *mw)
mw->priv->builder = gtk_builder_new ();
gtk_builder_add_from_string (mw->priv->builder, win_menu, -1, NULL);
- g_action_map_add_action (G_ACTION_MAP (mw),
+ g_action_map_add_action (G_ACTION_MAP (g_application_get_default ()),
g_settings_create_action (mw->priv->video_devices_settings->get_g_settings (),
"enable-preview"));
- g_action_map_add_action (G_ACTION_MAP (mw),
+ g_action_map_add_action (G_ACTION_MAP (g_application_get_default ()),
g_settings_create_action (mw->priv->user_interface_settings->get_g_settings (),
"panel-section"));
- g_action_map_add_action_entries (G_ACTION_MAP (mw),
+ g_action_map_add_action_entries (G_ACTION_MAP (g_application_get_default ()),
win_entries, G_N_ELEMENTS (win_entries),
mw);
+
+ gtk_widget_insert_action_group (GTK_WIDGET (mw), "win",
+ G_ACTION_GROUP (g_application_get_default ()));
}
@@ -1267,6 +1273,9 @@ gm_main_window_new (GmApplication *app)
ekiga_main_window_init_gui (mw);
+ mw->priv->contact_menu =
+ Ekiga::ContactActorMenuPtr (Ekiga::ContactActorMenu::create (*mw->priv->contact_core));
+
return GTK_WIDGET(mw);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]