[gthumb/ext] added ability to add files to catalogs from the context menu



commit 8f833db712a46fead570dd3bd001ebb7c80bae0b
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Thu Oct 29 20:28:56 2009 +0100

    added ability to add files to catalogs from the context menu
    
    the catalog list is show as a submenu of the "add to catalog"
    item, if no catalog is present the original "add to catalog..."
    item is used.

 extensions/catalogs/actions.c            |   18 ++
 extensions/catalogs/actions.h            |    3 +
 extensions/catalogs/callbacks.c          |  325 ++++++++++++++++++++++++++++--
 extensions/catalogs/callbacks.h          |    1 +
 extensions/catalogs/dlg-add-to-catalog.c |  142 +++++++++----
 extensions/catalogs/dlg-add-to-catalog.h |    3 +
 extensions/catalogs/main.c               |    1 +
 gthumb/gth-browser.c                     |    3 +
 gthumb/gth-main-default-hooks.c          |    7 +
 9 files changed, 444 insertions(+), 59 deletions(-)
---
diff --git a/extensions/catalogs/actions.c b/extensions/catalogs/actions.c
index eef9dbb..a10472f 100644
--- a/extensions/catalogs/actions.c
+++ b/extensions/catalogs/actions.c
@@ -377,3 +377,21 @@ gth_browser_activate_action_go_to_container (GtkAction  *action,
 	_g_object_list_unref (file_list);
 	_gtk_tree_path_list_free (items);
 }
+
+
+void
+gth_browser_add_to_catalog (GthBrowser *browser,
+  			    GFile      *catalog)
+{
+	GList *items;
+	GList *file_list = NULL;
+
+	items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
+	file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
+
+	if (file_list != NULL)
+		add_to_catalog (browser, catalog, file_list);
+
+	_g_object_list_unref (file_list);
+	_gtk_tree_path_list_free (items);
+}
diff --git a/extensions/catalogs/actions.h b/extensions/catalogs/actions.h
index 82f76a6..7f625cd 100644
--- a/extensions/catalogs/actions.h
+++ b/extensions/catalogs/actions.h
@@ -35,4 +35,7 @@ DEFINE_ACTION(gth_browser_activate_action_catalog_remove)
 DEFINE_ACTION(gth_browser_activate_action_catalog_rename)
 DEFINE_ACTION(gth_browser_activate_action_go_to_container)
 
+void gth_browser_add_to_catalog (GthBrowser *browser,
+				 GFile      *catalog);
+
 #endif /* ACTIONS_H */
diff --git a/extensions/catalogs/callbacks.c b/extensions/catalogs/callbacks.c
index c8983f9..2a66485 100644
--- a/extensions/catalogs/callbacks.c
+++ b/extensions/catalogs/callbacks.c
@@ -37,11 +37,19 @@ static const char *fixed_ui_info =
 "  <popup name='FileListPopup'>"
 "    <placeholder name='Folder_Actions2'>"
 "      <menuitem action='Edit_AddToCatalog'/>"
+"      <menu action='Edit_QuickAddToCatalog'>"
+"        <separator name='CatalogListSeparator'/>"
+"        <menuitem action='Edit_QuickAddToCatalogOther'/>"
+"      </menu>"
 "    </placeholder>"
 "  </popup>"
 "  <popup name='FilePopup'>"
 "    <placeholder name='Folder_Actions2'>"
 "      <menuitem action='Edit_AddToCatalog'/>"
+"      <menu action='Edit_QuickAddToCatalog'>"
+"        <separator name='CatalogListSeparator'/>"
+"        <menuitem action='Edit_QuickAddToCatalogOther'/>"
+"      </menu>"
 "    </placeholder>"
 "  </popup>"
 "</ui>";
@@ -81,12 +89,18 @@ static const gchar *folder_popup_ui_info =
 
 
 static GtkActionEntry catalog_action_entries[] = {
+	{ "Edit_QuickAddToCatalog", GTK_STOCK_ADD, N_("_Add to Catalog") },
 
         { "Go_FileContainer", GTK_STOCK_JUMP_TO,
           N_("Open _Folder"), "<alt>End",
           N_("Go to the folder that contains the selected file"),
           G_CALLBACK (gth_browser_activate_action_go_to_container) },
 
+        { "Edit_QuickAddToCatalogOther", NULL,
+	  N_("Other..."), NULL,
+	  N_("Choose another catalog"),
+	  G_CALLBACK (gth_browser_activate_action_edit_add_to_catalog) },
+
 	{ "Edit_AddToCatalog", GTK_STOCK_ADD,
 	  N_("_Add to Catalog..."), NULL,
 	  N_("Add selected images to a catalog"),
@@ -121,15 +135,22 @@ static guint catalog_action_entries_size = G_N_ELEMENTS (catalog_action_entries)
 
 
 typedef struct {
+	GthBrowser     *browser;
 	GtkActionGroup *actions;
 	guint           folder_popup_merge_id;
 	guint           vfs_merge_id;
+	gboolean        catalog_menu_loaded;
+	guint           monitor_events;
 } BrowserData;
 
 
 static void
 browser_data_free (BrowserData *data)
 {
+	if (data->monitor_events != 0) {
+		g_signal_handler_disconnect (gth_main_get_default_monitor (), data->monitor_events);
+		data->monitor_events = 0;
+	}
 	g_free (data);
 }
 
@@ -141,6 +162,21 @@ catalogs__initialize_cb (void)
 }
 
 
+static void
+monitor_folder_changed_cb (GthMonitor      *monitor,
+			   GFile           *parent,
+			   GList           *list,
+			   GthMonitorEvent  event,
+			   gpointer         user_data)
+{
+	BrowserData *data = user_data;
+
+	if (event == GTH_MONITOR_EVENT_CHANGED)
+		return;
+	data->catalog_menu_loaded = FALSE;
+}
+
+
 void
 catalogs__gth_browser_construct_cb (GthBrowser *browser)
 {
@@ -150,6 +186,7 @@ catalogs__gth_browser_construct_cb (GthBrowser *browser)
 	g_return_if_fail (GTH_IS_BROWSER (browser));
 
 	data = g_new0 (BrowserData, 1);
+	data->browser = browser;
 
 	data->actions = gtk_action_group_new ("Catalog Actions");
 	gtk_action_group_set_translation_domain (data->actions, NULL);
@@ -164,6 +201,11 @@ catalogs__gth_browser_construct_cb (GthBrowser *browser)
 		g_error_free (error);
 	}
 
+	data->monitor_events = g_signal_connect (gth_main_get_default_monitor (),
+						 "folder_changed",
+						 G_CALLBACK (monitor_folder_changed_cb),
+						 data);
+
 	g_object_set_data_full (G_OBJECT (browser), BROWSER_DATA_KEY, data, (GDestroyNotify) browser_data_free);
 }
 
@@ -191,6 +233,275 @@ catalogs__gth_browser_update_sensitivity_cb (GthBrowser *browser)
 }
 
 
+GthCatalog *
+catalogs__gth_catalog_load_from_data_cb (const void *buffer)
+{
+	if ((buffer == NULL)
+	    || (strcmp (buffer, "") == 0)
+	    || (strncmp (buffer, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<catalog ", 48) == 0))
+	{
+		return gth_catalog_new ();
+	}
+	else
+		return NULL;
+}
+
+
+/* -- update_catalog_menu -- */
+
+
+typedef struct _CatalogListData CatalogListData;
+
+
+struct _CatalogListData {
+	CatalogListData *parent;
+	BrowserData     *data;
+	GthFileSource   *file_source;
+	GFile           *root;
+	GtkWidget       *list_menu;
+	GtkWidget       *file_menu;
+	GList           *children;
+	GList           *current_child;
+};
+
+
+static void
+catalog_list_data_free (CatalogListData *list_data)
+{
+	g_list_free (list_data->children);
+	g_object_unref (list_data->root);
+	g_object_unref (list_data->file_source);
+	g_free (list_data);
+}
+
+
+static void catalog_list_load_current_child (CatalogListData *list_data);
+
+
+static void
+catalog_list_load_next_child (CatalogListData *list_data)
+{
+	if (list_data == NULL)
+		return;
+	list_data->current_child = list_data->current_child->next;
+	catalog_list_load_current_child (list_data);
+}
+
+
+static void load_catalog_list (CatalogListData *list_data);
+
+
+static void
+catalog_list_load_current_child (CatalogListData *list_data)
+{
+	if (list_data->current_child == NULL) {
+		catalog_list_load_next_child (list_data->parent);
+		catalog_list_data_free (list_data);
+		return;
+	}
+
+	load_catalog_list ((CatalogListData *) list_data->current_child->data);
+}
+
+
+static int
+sort_catalogs (gconstpointer a,
+               gconstpointer b)
+{
+	GthFileData *file_data_a = (GthFileData *) a;
+	GthFileData *file_data_b = (GthFileData *) b;
+
+	if (g_file_info_get_attribute_boolean (file_data_a->info, "gthumb::no-child") != g_file_info_get_attribute_boolean (file_data_b->info, "gthumb::no-child"))
+		return g_file_info_get_attribute_boolean (file_data_a->info, "gthumb::no-child") ? 1 : -1;
+	else
+		return g_utf8_collate (g_file_info_get_display_name (file_data_a->info),
+				       g_file_info_get_display_name (file_data_b->info));
+}
+
+
+static void
+catalog_item_activate_cb (GtkMenuItem *menuitem,
+			  gpointer     user_data)
+{
+	GthBrowser *browser = user_data;
+	char       *uri;
+	GFile      *file;
+
+	if (gtk_menu_item_get_submenu (menuitem) != NULL)
+		return;
+
+	uri = g_object_get_data (G_OBJECT (menuitem), "uri");
+	file = g_file_new_for_uri (uri);
+	gth_browser_add_to_catalog (browser, file);
+
+	g_object_unref (file);
+}
+
+
+static GtkWidget *
+insert_menu_item (CatalogListData *list_data,
+		  GtkWidget       *menu,
+		  GthFileData     *file_data,
+		  int              pos)
+{
+	GtkWidget *item;
+	GtkWidget *image;
+
+	item = gtk_image_menu_item_new_with_label (g_file_info_get_display_name (file_data->info));
+	image = gtk_image_new_from_gicon (g_file_info_get_icon (file_data->info), GTK_ICON_SIZE_MENU);
+	gtk_widget_show (image);
+	gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
+	gtk_widget_show (item);
+	gtk_menu_shell_insert (GTK_MENU_SHELL (menu), item, pos);
+	g_object_set_data_full (G_OBJECT (item), "uri", g_file_get_uri (file_data->file), g_free);
+	g_signal_connect (item, "activate", G_CALLBACK (catalog_item_activate_cb), list_data->data->browser);
+
+	return item;
+}
+
+
+static void
+catalog_list_ready (GthFileSource *file_source,
+		    GList         *files,
+		    GError        *error,
+		    gpointer       user_data)
+{
+	CatalogListData *list_data = user_data;
+	GList           *ordered;
+	int              pos;
+	GList           *scan;
+	GFile           *root;
+
+	ordered = g_list_sort (gth_file_data_list_dup (files), sort_catalogs);
+	pos = 0;
+	for (scan = ordered; scan; scan = scan->next) {
+		GthFileData *file_data = scan->data;
+		GtkWidget   *list_item;
+		GtkWidget   *file_item;
+
+		if (g_file_info_get_is_hidden (file_data->info))
+			continue;
+
+		list_item = insert_menu_item (list_data, list_data->list_menu, file_data, pos);
+		file_item = insert_menu_item (list_data, list_data->file_menu, file_data, pos);
+
+		if (! g_file_info_get_attribute_boolean (file_data->info, "gthumb::no-child")) {
+			CatalogListData *child;
+
+			child = g_new0 (CatalogListData, 1);
+			child->parent = list_data;
+			child->data = list_data->data;
+			child->file_source = g_object_ref (list_data->file_source);
+			child->root = g_file_dup (file_data->file);
+			child->list_menu = gtk_menu_new ();
+			child->file_menu = gtk_menu_new ();
+			list_data->children = g_list_prepend (list_data->children, child);
+
+			gtk_menu_item_set_submenu (GTK_MENU_ITEM (list_item), child->list_menu);
+			gtk_menu_item_set_submenu (GTK_MENU_ITEM (file_item), child->file_menu);
+		}
+
+		pos++;
+	}
+
+	root = g_file_new_for_uri ("catalog:///");
+	if (g_file_equal (list_data->root, root)) {
+		GtkUIManager *ui;
+
+		ui = gth_browser_get_ui_manager (list_data->data->browser);
+		if (ordered != NULL) {
+			gtk_widget_show (gtk_ui_manager_get_widget (ui, "/FileListPopup/Folder_Actions2/Edit_QuickAddToCatalog"));
+			gtk_widget_show (gtk_ui_manager_get_widget (ui, "/FileListPopup/Folder_Actions2/Edit_QuickAddToCatalog/CatalogListSeparator"));
+			gtk_widget_hide (gtk_ui_manager_get_widget (ui, "/FileListPopup/Folder_Actions2/Edit_AddToCatalog"));
+
+			gtk_widget_show (gtk_ui_manager_get_widget (ui, "/FilePopup/Folder_Actions2/Edit_QuickAddToCatalog"));
+			gtk_widget_show (gtk_ui_manager_get_widget (ui, "/FilePopup/Folder_Actions2/Edit_QuickAddToCatalog/CatalogListSeparator"));
+			gtk_widget_hide (gtk_ui_manager_get_widget (ui, "/FilePopup/Folder_Actions2/Edit_AddToCatalog"));
+		}
+		else {
+			gtk_widget_hide (gtk_ui_manager_get_widget (ui, "/FileListPopup/Folder_Actions2/Edit_QuickAddToCatalog"));
+			gtk_widget_show (gtk_ui_manager_get_widget (ui, "/FileListPopup/Folder_Actions2/Edit_AddToCatalog"));
+
+			gtk_widget_hide (gtk_ui_manager_get_widget (ui, "/FilePopup/Folder_Actions2/Edit_QuickAddToCatalog"));
+			gtk_widget_show (gtk_ui_manager_get_widget (ui, "/FilePopup/Folder_Actions2/Edit_AddToCatalog"));
+		}
+	}
+	else if (ordered == NULL) {
+		GtkWidget *item;
+
+		item = gtk_menu_item_new_with_label (_("(Empty)"));
+		gtk_widget_show (item);
+		gtk_widget_set_sensitive (item, FALSE);
+		gtk_menu_shell_insert (GTK_MENU_SHELL (list_data->list_menu), item, pos);
+
+		item = gtk_menu_item_new_with_label (_("(Empty)"));
+		gtk_widget_show (item);
+		gtk_widget_set_sensitive (item, FALSE);
+		gtk_menu_shell_insert (GTK_MENU_SHELL (list_data->file_menu), item, pos);
+	}
+
+	g_object_unref (root);
+	_g_object_list_unref (ordered);
+
+	list_data->children = g_list_reverse (list_data->children);
+	list_data->current_child = list_data->children;
+	catalog_list_load_current_child (list_data);
+}
+
+
+static void
+load_catalog_list (CatalogListData *list_data)
+{
+	gth_file_source_list (list_data->file_source,
+			      list_data->root,
+			      GFILE_STANDARD_ATTRIBUTES,
+			      catalog_list_ready,
+			      list_data);
+}
+
+
+static void
+update_catalog_menu (BrowserData *data)
+{
+	CatalogListData *list_data;
+	GtkWidget       *list_menu;
+	GtkWidget       *file_menu;
+	GtkWidget       *separator;
+
+	list_menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (gtk_ui_manager_get_widget (gth_browser_get_ui_manager (data->browser), "/FileListPopup/Folder_Actions2/Edit_QuickAddToCatalog")));
+	separator = gtk_ui_manager_get_widget (gth_browser_get_ui_manager (data->browser), "/FileListPopup/Folder_Actions2/Edit_QuickAddToCatalog/CatalogListSeparator");
+	_gtk_container_remove_children (GTK_CONTAINER (list_menu), NULL, separator);
+
+	file_menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (gtk_ui_manager_get_widget (gth_browser_get_ui_manager (data->browser), "/FilePopup/Folder_Actions2/Edit_QuickAddToCatalog")));
+	separator = gtk_ui_manager_get_widget (gth_browser_get_ui_manager (data->browser), "/FilePopup/Folder_Actions2/Edit_QuickAddToCatalog/CatalogListSeparator");
+	_gtk_container_remove_children (GTK_CONTAINER (file_menu), NULL, separator);
+
+	list_data = g_new0 (CatalogListData, 1);
+	list_data->data = data;
+	list_data->file_source = g_object_new (GTH_TYPE_FILE_SOURCE_CATALOGS, NULL);
+	list_data->root = g_file_new_for_uri ("catalog:///");
+	list_data->list_menu = list_menu;
+	list_data->file_menu = file_menu;
+
+	load_catalog_list (list_data);
+}
+
+
+void
+catalogs__gth_browser_file_list_popup_before_cb (GthBrowser *browser)
+{
+	BrowserData *data;
+
+	data = g_object_get_data (G_OBJECT (browser), BROWSER_DATA_KEY);
+	g_return_if_fail (data != NULL);
+
+	if (! data->catalog_menu_loaded) {
+		data->catalog_menu_loaded = TRUE;
+		update_catalog_menu (data);
+	}
+}
+
+
 void
 catalogs__gth_browser_folder_tree_popup_before_cb (GthBrowser    *browser,
 						   GthFileSource *file_source,
@@ -232,20 +543,6 @@ catalogs__gth_browser_folder_tree_popup_before_cb (GthBrowser    *browser,
 }
 
 
-GthCatalog *
-catalogs__gth_catalog_load_from_data_cb (const void *buffer)
-{
-	if ((buffer == NULL)
-	    || (strcmp (buffer, "") == 0)
-	    || (strncmp (buffer, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<catalog ", 48) == 0))
-	{
-		return gth_catalog_new ();
-	}
-	else
-		return NULL;
-}
-
-
 void
 catalogs__gth_browser_load_location_after_cb (GthBrowser   *browser,
 					      GthFileData  *location_data,
diff --git a/extensions/catalogs/callbacks.h b/extensions/catalogs/callbacks.h
index 76a44a4..01c6f41 100644
--- a/extensions/catalogs/callbacks.h
+++ b/extensions/catalogs/callbacks.h
@@ -29,6 +29,7 @@
 void catalogs__initialize_cb                           (void);
 void catalogs__gth_browser_construct_cb                (GthBrowser    *browser);
 void catalogs__gth_browser_update_sensitivity_cb       (GthBrowser    *browser);
+void catalogs__gth_browser_file_list_popup_before_cb   (GthBrowser    *browser);
 void catalogs__gth_browser_folder_tree_popup_before_cb (GthBrowser    *browser,
 							GthFileSource *file_source,
 					                GFile         *folder);
diff --git a/extensions/catalogs/dlg-add-to-catalog.c b/extensions/catalogs/dlg-add-to-catalog.c
index c74451b..c7977b8 100644
--- a/extensions/catalogs/dlg-add-to-catalog.c
+++ b/extensions/catalogs/dlg-add-to-catalog.c
@@ -31,15 +31,34 @@
 
 typedef struct {
 	GthBrowser    *browser;
-	GtkBuilder    *builder;
+	GtkWidget     *parent_window;
 	GtkWidget     *dialog;
-	GtkWidget     *source_tree;
 	GList         *files;
-	GthFileData   *selected_catalog;
-	GthFileSource *file_source;
+	gboolean       view_destination;
+	GFile         *catalog_file;
 	GthCatalog    *catalog;
 	char          *buffer;
 	gsize          length;
+} AddData;
+
+
+static void
+add_data_free (AddData *add_data)
+{
+	g_free (add_data->buffer);
+	_g_object_unref (add_data->catalog);
+	_g_object_list_unref (add_data->files);
+	_g_object_unref (add_data->catalog_file);
+	g_free (add_data);
+}
+
+
+typedef struct {
+	GthBrowser *browser;
+	GtkBuilder *builder;
+	GtkWidget  *dialog;
+	GtkWidget  *source_tree;
+	AddData    *add_data;
 } DialogData;
 
 
@@ -47,28 +66,30 @@ static void
 destroy_cb (GtkWidget  *widget,
 	    DialogData *data)
 {
-	g_free (data->buffer);
-	_g_object_unref (data->catalog);
-	_g_object_list_unref (data->files);
-	_g_object_unref (data->selected_catalog);
 	g_object_unref (data->builder);
-	g_object_unref (data->file_source);
 	g_free (data);
 }
 
 
-static GthFileData *
+static GFile *
 get_selected_catalog (DialogData *data)
 {
-	GthFileData *file_data = NULL;
+	GthFileData *file_data;
+	GFile       *file;
 
 	file_data = gth_folder_tree_get_selected_or_parent (GTH_FOLDER_TREE (data->source_tree));
 	if ((file_data != NULL) && ! g_file_info_get_attribute_boolean (file_data->info, "gthumb::no-child")) {
 		_g_object_unref (file_data);
 		file_data = NULL;
 	}
+	if (file_data != NULL)
+		file = g_object_ref (file_data->file);
+	else
+		file = NULL;
+
+	_g_object_unref (file_data);
 
-	return file_data;
+	return file;
 }
 
 
@@ -78,22 +99,25 @@ catalog_save_done_cb (void     *buffer,
 		      GError   *error,
 		      gpointer  user_data)
 {
-	DialogData *data = user_data;
+	AddData *add_data = user_data;
 
 	if (error != NULL) {
-		_gtk_error_dialog_from_gerror_show (GTK_WINDOW (data->dialog), _("Could not add the files to the catalog"), &error);
+		_gtk_error_dialog_from_gerror_show (GTK_WINDOW (add_data->parent_window), _("Could not add the files to the catalog"), &error);
 		return;
 	}
 
 	gth_monitor_folder_changed (gth_main_get_default_monitor (),
-				    data->selected_catalog->file,
-				    data->files,
+				    add_data->catalog_file,
+				    add_data->files,
 				    GTH_MONITOR_EVENT_CREATED);
 
-	if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("view_destination_checkbutton"))))
-		gth_browser_go_to (data->browser, data->selected_catalog->file, NULL);
+	if (add_data->view_destination)
+		gth_browser_go_to (add_data->browser, add_data->catalog_file, NULL);
+
+	if (add_data->dialog != NULL)
+		gtk_widget_destroy (add_data->dialog);
 
-	gtk_widget_destroy (data->dialog);
+	add_data_free (add_data);
 }
 
 
@@ -102,48 +126,56 @@ catalog_ready_cb (GObject  *catalog,
 		  GError   *error,
 		  gpointer  user_data)
 {
-	DialogData *data = user_data;
-	GList      *scan;
-	GFile      *gio_file;
+	AddData *add_data = user_data;
+	GList   *scan;
+	GFile   *gio_file;
 
 	if (error != NULL) {
-		_gtk_error_dialog_from_gerror_show (GTK_WINDOW (data->dialog), _("Could not add the files to the catalog"), &error);
+		_gtk_error_dialog_from_gerror_show (GTK_WINDOW (add_data->parent_window), _("Could not add the files to the catalog"), &error);
 		return;
 	}
 
-	data->catalog = (GthCatalog *) catalog;
+	add_data->catalog = (GthCatalog *) catalog;
 
-	for (scan = data->files; scan; scan = scan->next) {
+	for (scan = add_data->files; scan; scan = scan->next) {
 		GthFileData *file_to_add = scan->data;
-		gth_catalog_insert_file (data->catalog, -1, file_to_add->file);
+		gth_catalog_insert_file (add_data->catalog, -1, file_to_add->file);
 	}
 
-	data->buffer = gth_catalog_to_data (data->catalog, &data->length);
-	gio_file = gth_catalog_file_to_gio_file (data->selected_catalog->file);
+	add_data->buffer = gth_catalog_to_data (add_data->catalog, &add_data->length);
+	gio_file = gth_catalog_file_to_gio_file (add_data->catalog_file);
 	g_write_file_async (gio_file,
-			    data->buffer,
-			    data->length,
+			    add_data->buffer,
+			    add_data->length,
 			    G_PRIORITY_DEFAULT,
 			    NULL,
 			    catalog_save_done_cb,
-			    data);
+			    add_data);
 
 	g_object_unref (gio_file);
 }
 
 
 static void
+add_data_exec (AddData *add_data)
+{
+	gth_catalog_load_from_file (add_data->catalog_file,
+				    NULL,
+				    catalog_ready_cb,
+				    add_data);
+}
+
+
+static void
 add_button_clicked_cb (GtkWidget  *widget,
 		       DialogData *data)
 {
-	data->selected_catalog = get_selected_catalog (data);
-	if (data->selected_catalog == NULL)
+	data->add_data->catalog_file = get_selected_catalog (data);
+	if (data->add_data->catalog_file == NULL)
 		return;
 
-	gth_catalog_load_from_file (data->selected_catalog->file,
-				    NULL,
-				    catalog_ready_cb,
-				    data);
+	data->add_data->view_destination = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("view_destination_checkbutton")));
+	add_data_exec (data->add_data);
 }
 
 
@@ -160,12 +192,13 @@ static void
 source_tree_selection_changed_cb (GtkTreeSelection *treeselection,
                                   gpointer          user_data)
 {
-	DialogData  *data = user_data;
-	GthFileData *file_data;
+	DialogData *data = user_data;
+	GFile      *selected_catalog;
 
-	file_data = get_selected_catalog (data);
-	gtk_widget_set_sensitive (GTK_WIDGET (GET_WIDGET ("add_button")), file_data != NULL);
-	_g_object_unref (file_data);
+	selected_catalog = get_selected_catalog (data);
+	gtk_widget_set_sensitive (GTK_WIDGET (GET_WIDGET ("add_button")), selected_catalog != NULL);
+
+	_g_object_unref (selected_catalog);
 }
 
 
@@ -344,11 +377,13 @@ dlg_add_to_catalog (GthBrowser *browser,
 	data = g_new0 (DialogData, 1);
 	data->browser = browser;
 	data->builder = _gtk_builder_new_from_file ("add-to-catalog.ui", "catalogs");
-	data->files = _g_object_list_ref (list);
-	data->file_source = g_object_new (GTH_TYPE_FILE_SOURCE_CATALOGS, NULL);
-
 	data->dialog = _gtk_builder_get_widget (data->builder, "add_to_catalog_dialog");
 
+	data->add_data = g_new0 (AddData, 1);
+	data->add_data->browser = browser;
+	data->add_data->parent_window = data->add_data->dialog = data->dialog;
+	data->add_data->files = _g_object_list_ref (list);
+
 	base = g_file_new_for_uri ("catalog:///");
 	data->source_tree = gth_source_tree_new (base);
 	g_object_unref (base);
@@ -398,3 +433,20 @@ dlg_add_to_catalog (GthBrowser *browser,
 	gtk_window_set_modal (GTK_WINDOW (data->dialog), TRUE);
 	gtk_widget_show (data->dialog);
 }
+
+
+void
+add_to_catalog (GthBrowser *browser,
+		GFile      *catalog,
+		GList      *list)
+{
+	AddData *add_data;
+
+	add_data = g_new0 (AddData, 1);
+	add_data->browser = browser;
+	add_data->parent_window = (GtkWidget *) browser;
+	add_data->catalog_file = g_object_ref (catalog);
+	add_data->files = _g_object_list_ref (list);
+
+	add_data_exec (add_data);
+}
diff --git a/extensions/catalogs/dlg-add-to-catalog.h b/extensions/catalogs/dlg-add-to-catalog.h
index e66a7ee..d9a4794 100644
--- a/extensions/catalogs/dlg-add-to-catalog.h
+++ b/extensions/catalogs/dlg-add-to-catalog.h
@@ -28,6 +28,9 @@
 
 void   dlg_add_to_catalog              (GthBrowser *browser,
 					GList      *list);
+void   add_to_catalog                  (GthBrowser *browser,
+					GFile      *catalog,
+					GList      *list);
 void   dlg_move_to_catalog_directory   (GthBrowser *browser,
 					char       *catalog_path);
 
diff --git a/extensions/catalogs/main.c b/extensions/catalogs/main.c
index af11b1f..71c60f2 100644
--- a/extensions/catalogs/main.c
+++ b/extensions/catalogs/main.c
@@ -46,6 +46,7 @@ gthumb_extension_activate (void)
 	gth_hook_add_callback ("initialize", 10, G_CALLBACK (catalogs__initialize_cb), NULL);
 	gth_hook_add_callback ("gth-browser-construct", 10, G_CALLBACK (catalogs__gth_browser_construct_cb), NULL);
 	gth_hook_add_callback ("gth-browser-update-sensitivity", 10, G_CALLBACK (catalogs__gth_browser_update_sensitivity_cb), NULL);
+	gth_hook_add_callback ("gth-browser-file-list-popup-before", 10, G_CALLBACK (catalogs__gth_browser_file_list_popup_before_cb), NULL);
 	gth_hook_add_callback ("gth-browser-folder-tree-popup-before", 10, G_CALLBACK (catalogs__gth_browser_folder_tree_popup_before_cb), NULL);
 	gth_hook_add_callback ("gth-browser-load-location-after", 10, G_CALLBACK (catalogs__gth_browser_load_location_after_cb), NULL);
 }
diff --git a/gthumb/gth-browser.c b/gthumb/gth-browser.c
index 860227b..63c5c8c 100644
--- a/gthumb/gth-browser.c
+++ b/gthumb/gth-browser.c
@@ -2931,6 +2931,9 @@ gth_file_list_button_press_cb  (GtkWidget      *widget,
 			gth_file_selection_select (GTH_FILE_SELECTION (file_view), pos);
 		}
 
+		gth_hook_invoke ("gth-browser-file-list-popup-before", browser);
+		gtk_ui_manager_ensure_update (browser->priv->ui);
+
 		gtk_menu_popup (GTK_MENU (browser->priv->file_list_popup),
 				NULL,
 				NULL,
diff --git a/gthumb/gth-main-default-hooks.c b/gthumb/gth-main-default-hooks.c
index 7cdf5ce..d304dd4 100644
--- a/gthumb/gth-main-default-hooks.c
+++ b/gthumb/gth-main-default-hooks.c
@@ -109,6 +109,13 @@ gth_main_register_default_hooks (void)
 	gth_hook_register ("gth-browser-load-location-after", 3);
 
 	/**
+	 * Called before displaying the file list popup menu.
+	 *
+	 * @browser (GthBrowser*): the relative window.
+	 **/
+	gth_hook_register ("gth-browser-file-list-popup-before", 1);
+
+	/**
 	 * Called before displaying the folder tree popup menu.
 	 *
 	 * @browser (GthBrowser*): the relative window.



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