[gthumb] added a gear menu and a manager to modify it dynamically
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] added a gear menu and a manager to modify it dynamically
- Date: Sat, 9 Nov 2013 20:03:43 +0000 (UTC)
commit f69fe955ef3b76529db1dc70af1b9da2c95bf6d3
Author: Paolo Bacchilega <paobac src gnome org>
Date: Mon Oct 14 18:35:21 2013 +0200
added a gear menu and a manager to modify it dynamically
extensions/file_manager/callbacks.c | 21 +++
extensions/search/callbacks.c | 10 ++
gthumb/Makefile.am | 2 +
gthumb/gth-browser-actions-callbacks.c | 70 ++++++++++
gthumb/gth-browser-actions-callbacks.h | 7 +
gthumb/gth-browser-actions-entries.h | 9 ++
gthumb/gth-browser.c | 42 ++++++
gthumb/gth-browser.h | 10 ++
gthumb/gth-menu-manager.c | 220 ++++++++++++++++++++++++++++++++
gthumb/gth-menu-manager.h | 67 ++++++++++
gthumb/gthumb.gresource.xml | 1 +
gthumb/resources/Makefile.am | 1 +
gthumb/resources/gears-menu.ui | 36 +++++
13 files changed, 496 insertions(+), 0 deletions(-)
---
diff --git a/extensions/file_manager/callbacks.c b/extensions/file_manager/callbacks.c
index 689ca07..de578cd 100644
--- a/extensions/file_manager/callbacks.c
+++ b/extensions/file_manager/callbacks.c
@@ -122,6 +122,11 @@ static const char *browser_vfs_ui_info =
"</ui>";
+static const GthMenuEntry browser_vfs_entries[] = {
+ { N_("Create _Folder"), "win.create-folder", "<Ctrl><Shift>N" }
+};
+
+
static const char *folder_popup_ui_info =
"<ui>"
" <popup name='FolderListPopup'>"
@@ -701,6 +706,7 @@ file_manager_update_ui (BrowserData *data,
data->browser_merge_id = 0;
}
+#if 0
if (GTH_IS_FILE_SOURCE_VFS (gth_browser_get_location_source (browser))
&& (gth_window_get_current_page (GTH_WINDOW (browser)) == GTH_BROWSER_PAGE_BROWSER))
{
@@ -718,6 +724,21 @@ file_manager_update_ui (BrowserData *data,
gtk_ui_manager_remove_ui (gth_browser_get_ui_manager (browser), data->browser_vfs_merge_id);
data->browser_vfs_merge_id = 0;
}
+#endif
+
+ if (GTH_IS_FILE_SOURCE_VFS (gth_browser_get_location_source (browser))
+ && (gth_window_get_current_page (GTH_WINDOW (browser)) == GTH_BROWSER_PAGE_BROWSER))
+ {
+ if (data->browser_vfs_merge_id == 0) {
+ data->browser_vfs_merge_id = gth_menu_manager_append_entries
(gth_browser_get_menu_manager (browser, GTH_BROWSER_MENU_MANAGER_GEARS_FOLDER_ACTIONS),
+ browser_vfs_entries,
+ G_N_ELEMENTS
(browser_vfs_entries));
+ }
+ }
+ else if (data->browser_vfs_merge_id != 0) {
+ gth_menu_manager_remove_entries (gth_browser_get_menu_manager (browser,
GTH_BROWSER_MENU_MANAGER_GEARS_FOLDER_ACTIONS), data->browser_vfs_merge_id);
+ data->browser_vfs_merge_id = 0;
+ }
}
diff --git a/extensions/search/callbacks.c b/extensions/search/callbacks.c
index 079e6ec..dedbb26 100644
--- a/extensions/search/callbacks.c
+++ b/extensions/search/callbacks.c
@@ -100,6 +100,16 @@ search__gth_browser_construct_cb (GthBrowser *browser)
g_error_free (error);
}
+ {
+ GtkWidget *button;
+
+ button = gtk_button_new_from_icon_name ("edit-find-symbolic", GTK_ICON_SIZE_MENU);
+ gtk_activatable_set_use_action_appearance (GTK_ACTIVATABLE (button), FALSE);
+ gtk_activatable_set_related_action (GTK_ACTIVATABLE (button), gtk_action_group_get_action
(data->find_action, "Edit_Find"));
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (gth_browser_get_headerbar_section (browser,
GTH_BROWSER_HEADER_SECTION_BROWSER_COMMANDS)), button, FALSE, FALSE, 0);
+ }
+
g_object_set_data_full (G_OBJECT (browser), BROWSER_DATA_KEY, data, (GDestroyNotify)
browser_data_free);
}
diff --git a/gthumb/Makefile.am b/gthumb/Makefile.am
index 7c810e7..e35c9e5 100644
--- a/gthumb/Makefile.am
+++ b/gthumb/Makefile.am
@@ -84,6 +84,7 @@ PUBLIC_HEADER_FILES = \
gth-main.h \
gth-menu-action.h \
gth-menu-button.h \
+ gth-menu-manager.h \
gth-metadata.h \
gth-metadata-chooser.h \
gth-metadata-provider.h \
@@ -226,6 +227,7 @@ gthumb_SOURCES = \
gth-main-default-types.c \
gth-menu-action.c \
gth-menu-button.c \
+ gth-menu-manager.c \
gth-metadata.c \
gth-metadata-chooser.c \
gth-metadata-provider.c \
diff --git a/gthumb/gth-browser-actions-callbacks.c b/gthumb/gth-browser-actions-callbacks.c
index f721b22..2b49afb 100644
--- a/gthumb/gth-browser-actions-callbacks.c
+++ b/gthumb/gth-browser-actions-callbacks.c
@@ -467,3 +467,73 @@ gth_browser_activate_action_help_shortcuts (GtkAction *action,
{
show_help_dialog (GTK_WINDOW (data), "gthumb-shortcuts");
}
+
+
+/* -- GAction callbacks -- */
+
+
+void
+gth_browser_activate_save (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
+{
+ GthBrowser *browser = user_data;
+ GtkWidget *viewer_page;
+
+ viewer_page = gth_browser_get_viewer_page (browser);
+ if (viewer_page == NULL)
+ return;
+
+ gth_viewer_page_save (GTH_VIEWER_PAGE (viewer_page), NULL, NULL, browser);
+}
+
+
+void
+gth_browser_activate_save_as (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
+{
+ GthBrowser *browser = user_data;
+ GtkWidget *viewer_page;
+
+ viewer_page = gth_browser_get_viewer_page (browser);
+ if (viewer_page == NULL)
+ return;
+
+ gth_viewer_page_save_as (GTH_VIEWER_PAGE (viewer_page), NULL, NULL);
+}
+
+
+void
+gth_browser_activate_revert_to_saved (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
+{
+ GthBrowser *browser = user_data;
+ GtkWidget *viewer_page;
+
+ viewer_page = gth_browser_get_viewer_page (browser);
+ if (viewer_page == NULL)
+ return;
+
+ gth_viewer_page_revert (GTH_VIEWER_PAGE (viewer_page));
+}
+
+void
+gth_browser_activate_close (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
+{
+ GthBrowser *browser = user_data;
+
+ gth_window_close (GTH_WINDOW (browser));
+}
+
+
+void
+gth_browser_activate_quit (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
+{
+
+}
diff --git a/gthumb/gth-browser-actions-callbacks.h b/gthumb/gth-browser-actions-callbacks.h
index 5f18b5b..57df734 100644
--- a/gthumb/gth-browser-actions-callbacks.h
+++ b/gthumb/gth-browser-actions-callbacks.h
@@ -25,6 +25,7 @@
#include <gtk/gtk.h>
#define DEFINE_ACTION(x) void x (GtkAction *action, gpointer data);
+#define ACTION_CALLBACK(x) void x (GSimpleAction *action, GVariant *parameter, gpointer user_data);
DEFINE_ACTION(gth_browser_activate_action_bookmarks_add)
DEFINE_ACTION(gth_browser_activate_action_bookmarks_edit)
@@ -68,4 +69,10 @@ DEFINE_ACTION(gth_browser_activate_action_browser_tools)
DEFINE_ACTION(gth_browser_activate_action_viewer_tools)
DEFINE_ACTION(gth_browser_activate_action_view_shrink_wrap)
+ACTION_CALLBACK (gth_browser_activate_save)
+ACTION_CALLBACK (gth_browser_activate_save_as)
+ACTION_CALLBACK (gth_browser_activate_revert_to_saved)
+ACTION_CALLBACK (gth_browser_activate_close)
+ACTION_CALLBACK (gth_browser_activate_quit)
+
#endif /* GTH_BROWSER_ACTIONS_CALLBACK_H */
diff --git a/gthumb/gth-browser-actions-entries.h b/gthumb/gth-browser-actions-entries.h
index 51d245c..7d7db79 100644
--- a/gthumb/gth-browser-actions-entries.h
+++ b/gthumb/gth-browser-actions-entries.h
@@ -27,6 +27,15 @@
#include "gth-stock.h"
#include "gtk-utils.h"
+static const GActionEntry gth_browser_actions[] = {
+ { "save", gth_browser_activate_save },
+ { "save-as", gth_browser_activate_save_as },
+ { "revert-to-saved", gth_browser_activate_revert_to_saved },
+ { "close", gth_browser_activate_close },
+ { "quit", gth_browser_activate_quit },
+};
+
+
static GthActionEntryExt gth_browser_action_entries[] = {
{ "FileMenu", NULL, N_("_File") },
{ "EditMenu", NULL, N_("_Edit") },
diff --git a/gthumb/gth-browser.c b/gthumb/gth-browser.c
index 7ad4852..90536e5 100644
--- a/gthumb/gth-browser.c
+++ b/gthumb/gth-browser.c
@@ -119,6 +119,7 @@ struct _GthBrowserPrivate {
GtkWidget *list_extra_widget;
GtkWidget *file_properties;
GtkWidget *header_sections[GTH_BROWSER_N_HEADER_SECTIONS];
+ GthMenuManager *menu_managers[GTH_BROWSER_N_MENU_MANAGERS];
GtkWidget *thumbnail_list;
@@ -307,6 +308,18 @@ monitor_event_data_unref (MonitorEventData *monitor_data)
static void
+_gth_browser_enable_action (GthBrowser *browser,
+ const char *action_name,
+ gboolean enabled)
+{
+ GAction *action;
+
+ action = g_action_map_lookup_action (G_ACTION_MAP (browser), action_name);
+ g_object_set (action, "enabled", enabled, NULL);
+}
+
+
+static void
_gth_browser_set_action_sensitive (GthBrowser *browser,
const char *action_name,
gboolean sensitive)
@@ -631,6 +644,10 @@ gth_browser_update_sensitivity (GthBrowser *browser)
_gth_browser_set_action_sensitive (browser, "View_Sidebar", gth_window_get_current_page (GTH_WINDOW
(browser)) == GTH_BROWSER_PAGE_BROWSER);
_gth_browser_set_action_sensitive (browser, "View_Reload", gth_window_get_current_page (GTH_WINDOW
(browser)) == GTH_BROWSER_PAGE_BROWSER);
+ _gth_browser_enable_action (browser, "save", viewer_can_save && modified);
+ _gth_browser_enable_action (browser, "save-as", viewer_can_save);
+ _gth_browser_enable_action (browser, "revert-to-saved", viewer_can_save && modified);
+
gth_sidebar_update_sensitivity (GTH_SIDEBAR (browser->priv->file_properties));
if (browser->priv->viewer_page != NULL)
@@ -2715,7 +2732,10 @@ static void
gth_browser_finalize (GObject *object)
{
GthBrowser *browser = GTH_BROWSER (object);
+ int i;
+ for (i = 0; i < GTH_BROWSER_N_MENU_MANAGERS; i++)
+ _g_object_unref (browser->priv->menu_managers[i]);
browser_state_free (&browser->priv->state);
_g_object_unref (browser->priv->browser_settings);
_g_object_unref (browser->priv->messages_settings);
@@ -4395,6 +4415,9 @@ gth_browser_init (GthBrowser *browser)
browser->priv->desktop_interface_settings = g_settings_new (GNOME_DESKTOP_INTERFACE_SCHEMA);
browser->priv->file_properties_on_the_right = g_settings_get_boolean
(browser->priv->browser_settings, PREF_BROWSER_PROPERTIES_ON_THE_RIGHT);
+ for (i = 0; i < GTH_BROWSER_N_MENU_MANAGERS; i++)
+ browser->priv->menu_managers[i] = NULL;
+
browser_state_init (&browser->priv->state);
/* find a suitable size for the window */
@@ -4601,6 +4624,25 @@ gth_browser_init (GthBrowser *browser)
gtk_header_bar_pack_end (GTK_HEADER_BAR (header_bar),
browser->priv->header_sections[GTH_BROWSER_HEADER_SECTION_VIEWER_TOOLS]);
gtk_header_bar_pack_end (GTK_HEADER_BAR (header_bar),
browser->priv->header_sections[GTH_BROWSER_HEADER_SECTION_VIEWER_PROPERTIES]);
+ /* gears menu */
+
+ {
+ GtkBuilder *builder;
+ GMenuModel *menu;
+ GtkWidget *gears_menu_button;
+
+ builder = _gtk_builder_new_from_resource ("gears-menu.ui");
+ menu = G_MENU_MODEL (gtk_builder_get_object (builder, "menu"));
+ gears_menu_button = gtk_menu_button_new ();
+ gtk_container_add (GTK_CONTAINER (gears_menu_button), gtk_image_new_from_icon_name
("emblem-system-symbolic", GTK_ICON_SIZE_MENU));
+ gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (gears_menu_button), menu);
+ gtk_widget_show_all (gears_menu_button);
+ gtk_header_bar_pack_end (GTK_HEADER_BAR (header_bar), gears_menu_button);
+
+ browser->priv->menu_managers[GTH_BROWSER_MENU_MANAGER_GEARS] = gth_menu_manager_new
(G_MENU (menu));
+ browser->priv->menu_managers[GTH_BROWSER_MENU_MANAGER_GEARS_FOLDER_ACTIONS] =
gth_menu_manager_new (G_MENU (gtk_builder_get_object (builder, "folder-actions")));
+ }
+
/* browser navigation */
button = gtk_button_new_from_icon_name ("go-previous-symbolic", GTK_ICON_SIZE_MENU);
diff --git a/gthumb/gth-browser.h b/gthumb/gth-browser.h
index 09f71e5..09c8373 100644
--- a/gthumb/gth-browser.h
+++ b/gthumb/gth-browser.h
@@ -25,6 +25,7 @@
#include "gth-file-source.h"
#include "gth-file-store.h"
#include "gth-icon-cache.h"
+#include "gth-menu-manager.h"
#include "gth-task.h"
#include "gth-window.h"
#include "typedefs.h"
@@ -65,6 +66,12 @@ typedef enum { /*< skip >*/
GTH_BROWSER_N_HEADER_SECTIONS
} GthBrowserHeaderSection;
+typedef enum { /*< skip >*/
+ GTH_BROWSER_MENU_MANAGER_GEARS,
+ GTH_BROWSER_MENU_MANAGER_GEARS_FOLDER_ACTIONS,
+ GTH_BROWSER_N_MENU_MANAGERS
+} GthBrowserMenuManager;
+
typedef enum {
GTH_ACTION_GO_TO,
GTH_ACTION_GO_BACK,
@@ -123,6 +130,9 @@ GtkWidget * gth_browser_get_statusbar (GthBrowser *browser);
GtkWidget * gth_browser_get_filterbar (GthBrowser *browser);
GtkWidget * gth_browser_get_headerbar_section (GthBrowser *browser,
GthBrowserHeaderSection section);
+GthMenuManager * gth_browser_get_menu_manager (GthBrowser *browser,
+ GthBrowserMenuManager
+ manager);
GtkWidget * gth_browser_get_file_list (GthBrowser *browser);
GtkWidget * gth_browser_get_file_list_view (GthBrowser *browser);
GtkWidget * gth_browser_get_thumbnail_list (GthBrowser *browser);
diff --git a/gthumb/gth-menu-manager.c b/gthumb/gth-menu-manager.c
new file mode 100644
index 0000000..a4afd6a
--- /dev/null
+++ b/gthumb/gth-menu-manager.c
@@ -0,0 +1,220 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * GThumb
+ *
+ * Copyright (C) 2009 The Free Software Foundation, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+#include <gtk/gtk.h>
+#include "gtk-utils.h"
+#include "glib-utils.h"
+#include "gth-menu-manager.h"
+
+
+/* Properties */
+enum {
+ PROP_0,
+ PROP_MENU
+};
+
+struct _GthMenuManagerPrivate {
+ GMenu *menu;
+ guint last_id;
+ GHashTable *items;
+};
+
+
+G_DEFINE_TYPE (GthMenuManager, gth_menu_manager, G_TYPE_OBJECT)
+
+
+static void
+gth_menu_manager_finalize (GObject *object)
+{
+ GthMenuManager *self;
+
+ self = GTH_MENU_MANAGER (object);
+
+ _g_object_unref (self->priv->menu);
+ g_hash_table_destroy (self->priv->items);
+
+ G_OBJECT_CLASS (gth_menu_manager_parent_class)->finalize (object);
+}
+
+
+static void
+gth_menu_manager_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GthMenuManager *self;
+
+ self = GTH_MENU_MANAGER (object);
+
+ switch (property_id) {
+ case PROP_MENU:
+ _g_object_unref (self->priv->menu);
+ self->priv->menu = g_value_dup_object (value);
+ break;
+ default:
+ break;
+ }
+}
+
+
+static void
+gth_menu_manager_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GthMenuManager *self;
+
+ self = GTH_MENU_MANAGER (object);
+
+ switch (property_id) {
+ case PROP_MENU:
+ g_value_set_object (value, self->priv->menu);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+
+static void
+gth_menu_manager_class_init (GthMenuManagerClass *klass)
+{
+ GObjectClass *object_class;
+
+ g_type_class_add_private (klass, sizeof (GthMenuManagerPrivate));
+
+ object_class = (GObjectClass*) klass;
+ object_class->set_property = gth_menu_manager_set_property;
+ object_class->get_property = gth_menu_manager_get_property;
+ object_class->finalize = gth_menu_manager_finalize;
+
+ /* properties */
+
+ g_object_class_install_property (object_class,
+ PROP_MENU,
+ g_param_spec_object ("menu",
+ "Menu",
+ "The menu to modify",
+ G_TYPE_MENU,
+ G_PARAM_READWRITE));
+}
+
+
+static void
+gth_menu_manager_init (GthMenuManager *self)
+{
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTH_TYPE_MENU_MANAGER, GthMenuManagerPrivate);
+ self->priv->items = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify)
_g_string_list_free);
+ self->priv->last_id = 1;
+ self->priv->menu = NULL;
+}
+
+
+GthMenuManager *
+gth_menu_manager_new (GMenu *menu)
+{
+ return g_object_new (GTH_TYPE_MENU_MANAGER, "menu", menu, NULL);
+}
+
+
+guint
+gth_menu_manager_append_entries (GthMenuManager *menu_manager,
+ const GthMenuEntry *entries,
+ int n_entries)
+{
+ guint merge_id;
+ GList *items;
+ int i;
+
+ merge_id = menu_manager->priv->last_id++;
+ items = NULL;
+ for (i = 0; i < n_entries; i++) {
+ const GthMenuEntry *entry = entries + i;
+ GMenuItem *item;
+
+ item = g_menu_item_new (_(entry->label), entry->detailed_action);
+ if (entry->accel != NULL)
+ g_menu_item_set_attribute (item, "accel", "s", entry->accel, NULL);
+ g_menu_append_item (menu_manager->priv->menu, item);
+
+ items = g_list_prepend (items, g_strdup (entry->detailed_action));
+ }
+
+ items = g_list_reverse (items);
+ g_hash_table_insert (menu_manager->priv->items, GINT_TO_POINTER (merge_id), items);
+
+ return merge_id;
+}
+
+
+static int
+_g_menu_model_get_item_position_from_action (GMenuModel *model,
+ const char *action)
+{
+ int i;
+
+ for (i = 0; i < g_menu_model_get_n_items (model); i++) {
+ char *item_action = NULL;
+
+ if (g_menu_model_get_item_attribute (model,
+ i,
+ G_MENU_ATTRIBUTE_ACTION,
+ "s",
+ &item_action))
+ {
+ if (g_strcmp0 (item_action, action) == 0) {
+ g_free (item_action);
+ return i;
+ }
+ }
+
+ g_free (item_action);
+ }
+
+ return -1;
+}
+
+
+void
+gth_menu_manager_remove_entries (GthMenuManager *menu_manager,
+ guint merge_id)
+{
+ GList *items;
+ GList *scan;
+
+ items = g_hash_table_lookup (menu_manager->priv->items, GINT_TO_POINTER (merge_id));
+ g_return_if_fail (items != NULL);
+
+ for (scan = items; scan; scan = scan->next) {
+ char *detailed_action = scan->data;
+ int pos;
+
+ pos = _g_menu_model_get_item_position_from_action (G_MENU_MODEL (menu_manager->priv->menu),
detailed_action);
+ if (pos >= 0)
+ g_menu_remove (menu_manager->priv->menu, pos);
+ }
+
+ g_hash_table_remove (menu_manager->priv->items, GINT_TO_POINTER (merge_id));
+}
diff --git a/gthumb/gth-menu-manager.h b/gthumb/gth-menu-manager.h
new file mode 100644
index 0000000..26a926f
--- /dev/null
+++ b/gthumb/gth-menu-manager.h
@@ -0,0 +1,67 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * GThumb
+ *
+ * Copyright (C) 2013 Free Software Foundation, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GTH_MENU_MANAGER_H
+#define GTH_MENU_MANAGER_H
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define GTH_TYPE_MENU_MANAGER (gth_menu_manager_get_type ())
+#define GTH_MENU_MANAGER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GTH_TYPE_MENU_MANAGER,
GthMenuManager))
+#define GTH_MENU_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GTH_TYPE_MENU_MANAGER,
GthMenuManagerClass))
+#define GTH_IS_MENU_MANAGER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GTH_TYPE_MENU_MANAGER))
+#define GTH_IS_MENU_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GTH_TYPE_MENU_MANAGER))
+#define GTH_MENU_MANAGER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GTH_TYPE_MENU_MANAGER,
GthMenuManagerClass))
+
+typedef struct {
+ const char *label;
+ const char *detailed_action;
+ const char *accel;
+} GthMenuEntry;
+
+typedef struct _GthMenuManager GthMenuManager;
+typedef struct _GthMenuManagerPrivate GthMenuManagerPrivate;
+typedef struct _GthMenuManagerClass GthMenuManagerClass;
+
+struct _GthMenuManager
+{
+ GObject __parent;
+ GthMenuManagerPrivate *priv;
+};
+
+struct _GthMenuManagerClass
+{
+ GObjectClass __parent_class;
+};
+
+GType gth_menu_manager_get_type (void) G_GNUC_CONST;
+GthMenuManager * gth_menu_manager_new (GMenu *menu);
+guint gth_menu_manager_append_entries (GthMenuManager *menu_manager,
+ const GthMenuEntry *entries,
+ int n_entries);
+void gth_menu_manager_remove_entries (GthMenuManager *menu_manager,
+ guint merge_id);
+
+G_END_DECLS
+
+#endif /* GTH_MENU_MANAGER_H */
diff --git a/gthumb/gthumb.gresource.xml b/gthumb/gthumb.gresource.xml
index f4864e5..8dc8dbf 100644
--- a/gthumb/gthumb.gresource.xml
+++ b/gthumb/gthumb.gresource.xml
@@ -2,6 +2,7 @@
<gresources>
<gresource prefix="/org/gnome/gThumb">
<file compressed="true">resources/app-menu.ui</file>
+ <file compressed="true">resources/gears-menu.ui</file>
<file compressed="true">resources/gthumb.css</file>
<file compressed="true">resources/message-dialog.ui</file>
</gresource>
diff --git a/gthumb/resources/Makefile.am b/gthumb/resources/Makefile.am
index 5f420d3..2d5a6c7 100644
--- a/gthumb/resources/Makefile.am
+++ b/gthumb/resources/Makefile.am
@@ -1,5 +1,6 @@
EXTRA_DIST = \
app-menu.ui \
+ gears-menu.ui \
gthumb.css \
message-dialog.ui
diff --git a/gthumb/resources/gears-menu.ui b/gthumb/resources/gears-menu.ui
new file mode 100644
index 0000000..943a281
--- /dev/null
+++ b/gthumb/resources/gears-menu.ui
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<interface>
+ <!-- interface-requires gtk+ 3.0 -->
+ <menu id="menu">
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Save</attribute>
+ <attribute name="action">win.save</attribute>
+ <attribute name="accel"><![CDATA[<Ctrl>S]]></attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Save _As</attribute>
+ <attribute name="action">win.save-as</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Revert</attribute>
+ <attribute name="action">win.revert-to-saved</attribute>
+ <attribute name="accel"><![CDATA[F4]]></attribute>
+ </item>
+ </section>
+ <section id="folder-actions">
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Close _All Windows</attribute>
+ <attribute name="action">app.quit</attribute>
+ <attribute name="accel"><![CDATA[<Ctrl>Q]]></attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Close</attribute>
+ <attribute name="action">win.close</attribute>
+ <attribute name="accel"><![CDATA[<Ctrl>W]]></attribute>
+ </item>
+ </section>
+ </menu>
+</interface>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]