[gthumb] postpone the creation of the menus in the export and list tool buttons
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] postpone the creation of the menus in the export and list tool buttons
- Date: Tue, 25 Oct 2011 14:56:40 +0000 (UTC)
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]