summaryrefslogtreecommitdiff
path: root/src/nautilus-view.c
diff options
context:
space:
mode:
authorCosimo Cecchi <cosimoc@gnome.org>2015-01-21 05:58:59 -0800
committerCarlos Soriano <csoriano@gnome.org>2015-01-24 02:06:04 +0100
commit6e6d6490d702c119b59b9d20b5e97c56d31cfdd7 (patch)
treede31100794961908103f95d3ff896d4df5781850 /src/nautilus-view.c
parent1ecc3d558466f1420d3dbe059abc4c8e8c078d9c (diff)
downloadnautilus-6e6d6490d702c119b59b9d20b5e97c56d31cfdd7.tar.gz
view: refactor code to add extension action
Make this simpler to follow. Also handle the case where a submenu defines an item with the same name as one of the above menus.
Diffstat (limited to 'src/nautilus-view.c')
-rw-r--r--src/nautilus-view.c182
1 files changed, 95 insertions, 87 deletions
diff --git a/src/nautilus-view.c b/src/nautilus-view.c
index 2e45de06c..f093a345c 100644
--- a/src/nautilus-view.c
+++ b/src/nautilus-view.c
@@ -3728,20 +3728,64 @@ get_menu_icon_for_file (NautilusFile *file,
return pixbuf;
}
-typedef struct
+static GList *
+get_extension_selection_menu_items (NautilusView *view)
{
- NautilusMenuItem *item;
+ NautilusWindow *window;
+ GList *items;
+ GList *providers;
+ GList *l;
GList *selection;
- GAction *action;
-} ExtensionActionCallbackData;
-static void
-extension_action_callback_data_free (ExtensionActionCallbackData *data)
+ window = nautilus_view_get_window (view);
+ selection = nautilus_view_get_selection (view);
+ providers = nautilus_module_get_extensions_for_type (NAUTILUS_TYPE_MENU_PROVIDER);
+ items = NULL;
+
+ for (l = providers; l != NULL; l = l->next) {
+ NautilusMenuProvider *provider;
+ GList *file_items;
+
+ provider = NAUTILUS_MENU_PROVIDER (l->data);
+ file_items = nautilus_menu_provider_get_file_items (provider,
+ GTK_WIDGET (window),
+ selection);
+ items = g_list_concat (items, file_items);
+ }
+
+ nautilus_module_extension_list_free (providers);
+
+ return items;
+}
+
+static GList *
+get_extension_background_menu_items (NautilusView *view)
{
- g_object_unref (data->item);
- nautilus_file_list_free (data->selection);
+ NautilusWindow *window;
+ NautilusFile *file;
+ GList *items;
+ GList *providers;
+ GList *l;
- g_free (data);
+ window = nautilus_view_get_window (view);
+ providers = nautilus_module_get_extensions_for_type (NAUTILUS_TYPE_MENU_PROVIDER);
+ file = nautilus_window_slot_get_file (view->details->slot);
+ items = NULL;
+
+ for (l = providers; l != NULL; l = l->next) {
+ NautilusMenuProvider *provider;
+ GList *file_items;
+
+ provider = NAUTILUS_MENU_PROVIDER (l->data);
+ file_items = nautilus_menu_provider_get_background_items (provider,
+ GTK_WIDGET (window),
+ file);
+ items = g_list_concat (items, file_items);
+ }
+
+ nautilus_module_extension_list_free (providers);
+
+ return items;
}
static void
@@ -3749,54 +3793,43 @@ extension_action_callback (GSimpleAction *action,
GVariant *state,
gpointer user_data)
{
- ExtensionActionCallbackData *data;
-
- data = user_data;
- nautilus_menu_item_activate (data->item);
+ NautilusMenuItem *item = user_data;
+ nautilus_menu_item_activate (item);
}
static void
-add_extension_action (NautilusView *view,
+add_extension_action (NautilusView *view,
NautilusMenuItem *item,
- gchar *prefix)
+ const char *action_name)
{
- char *name, *parsed_name;
gboolean sensitive;
- GAction *action;
- ExtensionActionCallbackData *data;
+ GSimpleAction *action;
g_object_get (item,
- "name", &name,
"sensitive", &sensitive,
NULL);
- parsed_name = nautilus_escape_action_name (name, prefix);
- action = G_ACTION (g_simple_action_new (parsed_name, NULL));
-
- data = g_new0 (ExtensionActionCallbackData, 1);
- data->item = g_object_ref (item);
- data->action = action;
-
+ action = g_simple_action_new (action_name, NULL);
g_signal_connect_data (action, "activate",
G_CALLBACK (extension_action_callback),
- data,
- (GClosureNotify) extension_action_callback_data_free, 0);
+ g_object_ref (item),
+ (GClosureNotify) g_object_unref, 0);
- g_action_map_add_action (G_ACTION_MAP (view->details->view_action_group), action);
- g_simple_action_set_enabled (G_SIMPLE_ACTION (action), sensitive);
+ g_action_map_add_action (G_ACTION_MAP (view->details->view_action_group),
+ G_ACTION (action));
+ g_simple_action_set_enabled (action, sensitive);
- g_free (name);
- g_free (parsed_name);
g_object_unref (action);
}
static GMenu *
build_menu_for_extension_menu_items (NautilusView *view,
- GList *menu_items,
- gchar *prefix)
+ const gchar *extension_prefix,
+ GList *menu_items)
{
GList *l;
GMenu *gmenu;
+ gint idx = 0;
gmenu = g_menu_new ();
@@ -3804,7 +3837,8 @@ build_menu_for_extension_menu_items (NautilusView *view,
NautilusMenuItem *item;
NautilusMenu *menu;
GMenuItem *menu_item;
- char *name, *label, *parsed_name, *detailed_action_name;
+ char *name, *label;
+ char *extension_id, *prefix, *parsed_name, *detailed_action_name;
item = NAUTILUS_MENU_ITEM (l->data);
@@ -3814,8 +3848,11 @@ build_menu_for_extension_menu_items (NautilusView *view,
"name", &name,
NULL);
- add_extension_action (view, item, prefix);
+ extension_id = g_strdup_printf ("%s_%d", extension_prefix, idx);
+ prefix = g_strdup_printf ("extension_%s_", extension_id);
parsed_name = nautilus_escape_action_name (name, prefix);
+ add_extension_action (view, item, parsed_name);
+
detailed_action_name = g_strconcat ("view.", parsed_name, NULL);
menu_item = g_menu_item_new (label, detailed_action_name);
@@ -3824,7 +3861,7 @@ build_menu_for_extension_menu_items (NautilusView *view,
GMenu *children_menu;
children = nautilus_menu_get_items (menu);
- children_menu = build_menu_for_extension_menu_items (view, children, prefix);
+ children_menu = build_menu_for_extension_menu_items (view, extension_id, children);
g_menu_item_set_submenu (menu_item, G_MENU_MODEL (children_menu));
nautilus_menu_item_list_free (children);
@@ -3832,8 +3869,11 @@ build_menu_for_extension_menu_items (NautilusView *view,
}
g_menu_append_item (gmenu, menu_item);
+ idx++;
+ g_free (extension_id);
g_free (parsed_name);
+ g_free (prefix);
g_free (detailed_action_name);
g_free (name);
g_free (label);
@@ -3845,13 +3885,13 @@ build_menu_for_extension_menu_items (NautilusView *view,
static void
add_extension_menu_items (NautilusView *view,
+ const gchar *extension_prefix,
GList *menu_items,
- GMenu *insertion_menu,
- gchar *prefix)
+ GMenu *insertion_menu)
{
GMenu *menu;
- menu = build_menu_for_extension_menu_items (view, menu_items, prefix);
+ menu = build_menu_for_extension_menu_items (view, extension_prefix, menu_items);
nautilus_gmenu_merge (insertion_menu,
menu,
"extensions",
@@ -3864,56 +3904,24 @@ static void
update_extensions_menus (NautilusView *view)
{
GList *selection_items, *background_items;
- NautilusWindow *window;
- NautilusFile *file;
- GList *providers;
- GList *l;
- GList *selection;
- gchar *prefix;
- int index;
- window = nautilus_view_get_window (view);
- providers = nautilus_module_get_extensions_for_type (NAUTILUS_TYPE_MENU_PROVIDER);
- selection = nautilus_view_get_selection (view);
- file = nautilus_window_slot_get_file (view->details->slot);
-
- index = 0;
- for (l = providers; l != NULL; l = l->next) {
- NautilusMenuProvider *provider;
-
- provider = NAUTILUS_MENU_PROVIDER (l->data);
- background_items = nautilus_menu_provider_get_background_items (provider,
- GTK_WIDGET (window),
- file);
- selection_items = nautilus_menu_provider_get_file_items (provider,
- GTK_WIDGET (window),
- selection);
- if (selection_items != NULL) {
- /* Make sure actions names are unique */
- prefix = g_strdup_printf ("extension_selection_%i", index);
- add_extension_menu_items (view,
- selection_items,
- view->details->selection_menu,
- prefix);
- nautilus_menu_item_list_free (selection_items);
- g_free (prefix);
- }
-
- if (background_items != NULL) {
- /* Make sure actions names are unique */
- prefix = g_strdup_printf ("extension_background_%i", index);
- add_extension_menu_items (view,
- selection_items,
- view->details->selection_menu,
- prefix);
- nautilus_menu_item_list_free (background_items);
- g_free (prefix);
- }
-
- index++;
+ selection_items = get_extension_selection_menu_items (view);
+ if (selection_items != NULL) {
+ add_extension_menu_items (view,
+ "selection",
+ selection_items,
+ view->details->selection_menu);
+ nautilus_menu_item_list_free (selection_items);
}
- nautilus_module_extension_list_free (providers);
+ background_items = get_extension_background_menu_items (view);
+ if (background_items != NULL) {
+ add_extension_menu_items (view,
+ "background",
+ background_items,
+ view->details->background_menu);
+ nautilus_menu_item_list_free (background_items);
+ }
}
static char *