[gthumb/ext] added ability to add files to catalogs from the context menu
- From: Paolo Bacchilega <paobac src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gthumb/ext] added ability to add files to catalogs from the context menu
- Date: Thu, 29 Oct 2009 19:31:33 +0000 (UTC)
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]