[gthumb] postpone the creation of the menus in the export and list tool buttons



commit e8fc229947405bd618522bf6033a1e9d925711d5
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Tue Oct 25 15:03:55 2011 +0200

    postpone the creation of the menus in the export and list tool buttons

 extensions/export_tools/callbacks.c |   26 ++++++++++++--
 extensions/list_tools/callbacks.c   |   38 +++++++++++++++-----
 gthumb/gth-toggle-menu-action.c     |   65 +++++++++++++++++++++++++++++++++-
 gthumb/gth-toggle-menu-action.h     |   11 +++++-
 4 files changed, 124 insertions(+), 16 deletions(-)
---
diff --git a/extensions/export_tools/callbacks.c b/extensions/export_tools/callbacks.c
index 7346793..fd8e716 100644
--- a/extensions/export_tools/callbacks.c
+++ b/extensions/export_tools/callbacks.c
@@ -48,6 +48,7 @@ static const char *ui_info =
 typedef struct {
 	GthBrowser     *browser;
 	GtkActionGroup *action_group;
+	gboolean        menu_initialized;
 } BrowserData;
 
 
@@ -58,6 +59,23 @@ browser_data_free (BrowserData *data)
 }
 
 
+static void
+export_tools_show_menu_func (GtkAction *action,
+			     gpointer   user_data)
+{
+	BrowserData *data = user_data;
+	GtkWidget   *menu;
+
+	if (data->menu_initialized)
+		return;
+
+	data->menu_initialized = TRUE;
+
+	menu = gtk_ui_manager_get_widget (gth_browser_get_ui_manager (data->browser), "/ExportPopup");
+	g_object_set (action, "menu", menu, NULL);
+}
+
+
 void
 export_tools__gth_browser_construct_cb (GthBrowser *browser)
 {
@@ -82,7 +100,12 @@ export_tools__gth_browser_construct_cb (GthBrowser *browser)
 			       /*"tooltip",  _("Export files"),*/
 			       "is-important", TRUE,
 			       NULL);
+	gth_toggle_menu_action_set_show_menu_func (GTH_TOGGLE_MENU_ACTION (action),
+						   export_tools_show_menu_func,
+						   data,
+						   NULL);
 	gtk_action_group_add_action (data->action_group, action);
+	g_object_unref (action);
 
 	gtk_ui_manager_insert_action_group (gth_browser_get_ui_manager (browser), data->action_group, 0);
 
@@ -92,8 +115,5 @@ export_tools__gth_browser_construct_cb (GthBrowser *browser)
 		g_clear_error (&error);
 	}
 
-	g_object_set (action, "menu",  gtk_ui_manager_get_widget (gth_browser_get_ui_manager (browser), "/ExportPopup"), NULL);
-	g_object_unref (action);
-
 	g_object_set_data_full (G_OBJECT (browser), BROWSER_DATA_KEY, data, (GDestroyNotify) browser_data_free);
 }
diff --git a/extensions/list_tools/callbacks.c b/extensions/list_tools/callbacks.c
index 21ed87d..368ac79 100644
--- a/extensions/list_tools/callbacks.c
+++ b/extensions/list_tools/callbacks.c
@@ -82,6 +82,7 @@ typedef struct {
 	GthBrowser     *browser;
 	GtkActionGroup *action_group;
 	gulong          scripts_changed_id;
+	gboolean        menu_initialized;
 } BrowserData;
 
 
@@ -217,6 +218,29 @@ scripts_changed_cb (GthScriptFile *script_file,
 }
 
 
+static void
+list_tools_show_menu_func (GtkAction *action,
+		           gpointer   user_data)
+{
+	BrowserData *data = user_data;
+	GtkWidget   *menu;
+
+	if (data->menu_initialized)
+		return;
+
+	data->menu_initialized = TRUE;
+
+	menu = gtk_ui_manager_get_widget (gth_browser_get_ui_manager (data->browser), "/ListToolsPopup");
+	g_object_set (action, "menu", menu, NULL);
+	update_scripts_menu (data);
+
+	data->scripts_changed_id = g_signal_connect (gth_script_file_get (),
+				                     "changed",
+				                     G_CALLBACK (scripts_changed_cb),
+				                     data);
+}
+
+
 void
 list_tools__gth_browser_construct_cb (GthBrowser *browser)
 {
@@ -244,7 +268,12 @@ list_tools__gth_browser_construct_cb (GthBrowser *browser)
 			       "tooltip",  _("Batch tools for multiple files"),
 			       "is-important", TRUE,
 			       NULL);
+	gth_toggle_menu_action_set_show_menu_func (GTH_TOGGLE_MENU_ACTION (action),
+						   list_tools_show_menu_func,
+						   data,
+						   NULL);
 	gtk_action_group_add_action (data->action_group, action);
+	g_object_unref (action);
 
 	gtk_ui_manager_insert_action_group (gth_browser_get_ui_manager (browser), data->action_group, 0);
 
@@ -253,16 +282,7 @@ list_tools__gth_browser_construct_cb (GthBrowser *browser)
 		g_clear_error (&error);
 	}
 
-	g_object_set (action, "menu",  gtk_ui_manager_get_widget (gth_browser_get_ui_manager (browser), "/ListToolsPopup"), NULL);
-	g_object_unref (action);
-
 	g_object_set_data_full (G_OBJECT (browser), BROWSER_DATA_KEY, data, (GDestroyNotify) browser_data_free);
-
-	update_scripts_menu (data);
-	data->scripts_changed_id = g_signal_connect (gth_script_file_get (),
-				                     "changed",
-				                     G_CALLBACK (scripts_changed_cb),
-				                     data);
 }
 
 
diff --git a/gthumb/gth-toggle-menu-action.c b/gthumb/gth-toggle-menu-action.c
index abb6985..3400290 100644
--- a/gthumb/gth-toggle-menu-action.c
+++ b/gthumb/gth-toggle-menu-action.c
@@ -37,7 +37,10 @@ static gpointer parent_class = NULL;
 
 
 struct _GthToggleMenuActionPrivate {
-	GtkWidget *menu;
+	GtkWidget       *menu;
+	GthShowMenuFunc  show_menu_func;
+	gpointer         show_menu_data;
+	GDestroyNotify   show_menu_data_destroy;
 };
 
 
@@ -45,7 +48,8 @@ static void
 gth_toggle_menu_action_init (GthToggleMenuAction *self)
 {
 	self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTH_TYPE_TOGGLE_MENU_ACTION, GthToggleMenuActionPrivate);
-	self->priv->menu = NULL;
+	self->priv->menu = gtk_menu_new ();
+	g_object_ref_sink (self->priv->menu);
 }
 
 
@@ -92,6 +96,47 @@ gth_toggle_menu_action_get_property (GObject    *object,
 
 
 static void
+tool_item_show_menu_cb (GthToggleMenuToolButton *button,
+			gpointer                 user_data)
+{
+	GthToggleMenuAction *self = user_data;
+
+	self->priv->show_menu_func (GTK_ACTION (self), self->priv->show_menu_data);
+}
+
+
+static GtkWidget *
+gth_toggle_menu_action_create_tool_item (GtkAction *action)
+{
+	GthToggleMenuAction *self = GTH_TOGGLE_MENU_ACTION (action);
+	GtkWidget           *tool_item;
+
+	tool_item = g_object_new (GTH_TYPE_TOGGLE_MENU_TOOL_BUTTON, NULL);
+	if (self->priv->show_menu_func != NULL)
+		g_signal_connect (tool_item,
+				  "show_menu",
+				  G_CALLBACK (tool_item_show_menu_cb),
+				  self);
+
+	return tool_item;
+}
+
+
+static void
+gth_toggle_menu_action_finalize (GObject *base)
+{
+	GthToggleMenuAction *self = GTH_TOGGLE_MENU_ACTION (base);
+
+	if (self->priv->show_menu_data_destroy != NULL)
+		self->priv->show_menu_data_destroy (self->priv->show_menu_data);
+	if (self->priv->menu != NULL)
+		g_object_unref (self->priv->menu);
+
+	G_OBJECT_CLASS (parent_class)->finalize (base);
+}
+
+
+static void
 gth_toggle_menu_action_class_init (GthToggleMenuActionClass *klass)
 {
 	GObjectClass   *object_class;
@@ -103,9 +148,11 @@ gth_toggle_menu_action_class_init (GthToggleMenuActionClass *klass)
 	object_class = (GObjectClass *) klass;
 	object_class->set_property = gth_toggle_menu_action_set_property;
 	object_class->get_property = gth_toggle_menu_action_get_property;
+	object_class->finalize = gth_toggle_menu_action_finalize;
 
 	action_class = (GtkActionClass *) klass;
 	action_class->toolbar_item_type = GTH_TYPE_TOGGLE_MENU_TOOL_BUTTON;
+	action_class->create_tool_item = gth_toggle_menu_action_create_tool_item;
 
 	/* properties */
 
@@ -122,6 +169,20 @@ gth_toggle_menu_action_class_init (GthToggleMenuActionClass *klass)
 G_DEFINE_TYPE (GthToggleMenuAction, gth_toggle_menu_action, GTK_TYPE_TOGGLE_ACTION)
 
 
+void
+gth_toggle_menu_action_set_show_menu_func (GthToggleMenuAction *self,
+					   GthShowMenuFunc      func,
+					   gpointer             data,
+					   GDestroyNotify       destroy)
+{
+	self->priv->show_menu_func = func;
+	if (self->priv->show_menu_data_destroy != NULL)
+		self->priv->show_menu_data_destroy (self->priv->show_menu_data);
+	self->priv->show_menu_data = data;
+	self->priv->show_menu_data_destroy = destroy;
+}
+
+
 GtkWidget *
 gth_toggle_menu_action_get_menu (GthToggleMenuAction *self)
 {
diff --git a/gthumb/gth-toggle-menu-action.h b/gthumb/gth-toggle-menu-action.h
index f23ce9c..9753ce6 100644
--- a/gthumb/gth-toggle-menu-action.h
+++ b/gthumb/gth-toggle-menu-action.h
@@ -26,6 +26,9 @@
 
 G_BEGIN_DECLS
 
+typedef void (*GthShowMenuFunc) (GtkAction *action,
+				 gpointer   user_data);
+
 #define GTH_TYPE_TOGGLE_MENU_ACTION            (gth_toggle_menu_action_get_type ())
 #define GTH_TOGGLE_MENU_ACTION(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTH_TYPE_TOGGLE_MENU_ACTION, GthToggleMenuAction))
 #define GTH_TOGGLE_MENU_ACTION_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GTH_TYPE_TOGGLE_MENU_ACTION, GthToggleMenuActionClass))
@@ -46,8 +49,12 @@ struct _GthToggleMenuActionClass {
 	GtkToggleActionClass parent_class;
 };
 
-GType       gth_toggle_menu_action_get_type (void) G_GNUC_CONST;
-GtkWidget * gth_toggle_menu_action_get_menu (GthToggleMenuAction *action);
+GType       gth_toggle_menu_action_get_type           (void) G_GNUC_CONST;
+void        gth_toggle_menu_action_set_show_menu_func (GthToggleMenuAction *action,
+						       GthShowMenuFunc      func,
+						       gpointer             data,
+						       GDestroyNotify       destroy);
+GtkWidget * gth_toggle_menu_action_get_menu           (GthToggleMenuAction *action);
 
 G_END_DECLS
 



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