[gthumb/ext: 3/15] update the extra widget after changing the catalog metadata



commit 948e09ed21d2d603a54ad55841121cfcef2fa8c4
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Tue Dec 8 00:03:03 2009 +0100

    update the extra widget after changing the catalog metadata

 extensions/catalogs/actions.c                  |    9 +++-
 extensions/catalogs/callbacks.c                |   65 ++++++++++++++++++----
 extensions/catalogs/callbacks.h                |   25 +++++----
 extensions/catalogs/dlg-catalog-properties.c   |    7 ++-
 extensions/catalogs/gth-catalog.c              |   37 +++++++++++++
 extensions/catalogs/gth-catalog.h              |   68 ++++++++++++-----------
 extensions/catalogs/gth-file-source-catalogs.c |   14 +----
 extensions/catalogs/main.c                     |    1 +
 extensions/search/callbacks.c                  |   68 +++++++++++++++---------
 extensions/search/callbacks.h                  |   19 ++++---
 extensions/search/gth-search-task.c            |    2 +-
 extensions/search/main.c                       |    1 +
 gthumb/gth-browser.c                           |   42 ++++++++-------
 gthumb/gth-browser.h                           |    3 +-
 gthumb/gth-main-default-hooks.c                |    7 +++
 15 files changed, 239 insertions(+), 129 deletions(-)
---
diff --git a/extensions/catalogs/actions.c b/extensions/catalogs/actions.c
index 0360db0..402d289 100644
--- a/extensions/catalogs/actions.c
+++ b/extensions/catalogs/actions.c
@@ -359,7 +359,14 @@ void
 gth_browser_activate_action_catalog_properties (GtkAction  *action,
 						GthBrowser *browser)
 {
-	dlg_catalog_properties (browser, gth_browser_get_location_data (browser));  /* FIXME */
+	GthFolderTree *folder_tree;
+	GthFileData   *file_data;
+
+	folder_tree = GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser));
+	file_data = gth_folder_tree_get_selected (folder_tree);
+	dlg_catalog_properties (browser, file_data);
+
+	g_object_unref (file_data);
 }
 
 
diff --git a/extensions/catalogs/callbacks.c b/extensions/catalogs/callbacks.c
index 26e27b5..68204b7 100644
--- a/extensions/catalogs/callbacks.c
+++ b/extensions/catalogs/callbacks.c
@@ -26,6 +26,7 @@
 #include <glib-object.h>
 #include <gthumb.h>
 #include <gth-catalog.h>
+#include "dlg-catalog-properties.h"
 #include "gth-file-source-catalogs.h"
 #include "actions.h"
 
@@ -86,6 +87,8 @@ static const gchar *folder_popup_ui_info =
 "      <separator/>"
 "      <menuitem action='Catalog_Remove'/>"
 "      <menuitem action='Catalog_Rename'/>"
+"      <separator/>"
+"      <menuitem action='Catalog_Properties'/>"
 "    </placeholder>"
 "  </popup>"
 "</ui>";
@@ -132,7 +135,12 @@ static GtkActionEntry catalog_action_entries[] = {
 	{ "Catalog_Rename", NULL,
 	  N_("Rena_me"), NULL,
 	  NULL,
-	  G_CALLBACK (gth_browser_activate_action_catalog_rename) }
+	  G_CALLBACK (gth_browser_activate_action_catalog_rename) },
+
+	{ "Catalog_Properties", GTK_STOCK_PROPERTIES,
+	  NULL, NULL,
+	  NULL,
+	  G_CALLBACK (gth_browser_activate_action_catalog_properties) }
 };
 static guint catalog_action_entries_size = G_N_ELEMENTS (catalog_action_entries);
 
@@ -566,7 +574,7 @@ static void
 properties_button_clicked_cb (GtkButton  *button,
 			      GthBrowser *browser)
 {
-	gth_browser_activate_action_catalog_properties (NULL, browser);
+	dlg_catalog_properties (browser, gth_browser_get_location_data (browser));
 }
 
 
@@ -592,16 +600,53 @@ catalogs__gth_browser_load_location_after_cb (GthBrowser   *browser,
 				g_error_free (error);
 			}
 		}
+	}
+	else {
+		if (data->vfs_merge_id != 0) {
+			gtk_ui_manager_remove_ui (gth_browser_get_ui_manager (browser), data->vfs_merge_id);
+			data->vfs_merge_id = 0;
+		}
+	}
+}
+
+
+void
+catalogs__gth_browser_update_extra_widget_cb (GthBrowser *browser)
+{
+	BrowserData *data;
+	GthFileData *location_data;
+
+	data = g_object_get_data (G_OBJECT (browser), BROWSER_DATA_KEY);
+
+	location_data = gth_browser_get_location_data (browser);
+	if (GTH_IS_FILE_SOURCE_CATALOGS (gth_browser_get_location_source (browser))) {
+		GtkWidget *extra_widget;
+		GString   *name;
+		GObject   *metadata;
+
+		extra_widget = gth_browser_get_list_extra_widget (browser);
+
+		name = g_string_new ("");
+		if (g_file_info_get_display_name (location_data->info) != NULL)
+			g_string_append (name, g_file_info_get_display_name (location_data->info));
+		metadata = g_file_info_get_attribute_object (location_data->info, "general::event-date");
+		if (metadata != NULL) {
+			if (g_strcmp0 (name->str, "") != 0)
+				g_string_append (name, " - ");
+			g_string_append (name, gth_metadata_get_formatted (GTH_METADATA (metadata)));
+		}
+		gth_embedded_dialog_set_primary_text (GTH_EMBEDDED_DIALOG (extra_widget), name->str);
+
+		g_string_free (name, TRUE);
 
 		if (data->properties_button == NULL) {
-			data->properties_button = gtk_button_new_from_stock (GTK_STOCK_PROPERTIES);
+			data->properties_button = gtk_button_new ();
+			gtk_container_add (GTK_CONTAINER (data->properties_button), gtk_image_new_from_stock (GTK_STOCK_PROPERTIES, GTK_ICON_SIZE_BUTTON));
 			g_object_add_weak_pointer (G_OBJECT (data->properties_button), (gpointer *)&data->properties_button);
 			gtk_button_set_relief (GTK_BUTTON (data->properties_button), GTK_RELIEF_NONE);
-			GTK_WIDGET_SET_FLAGS (data->properties_button, GTK_CAN_DEFAULT);
-			gtk_widget_show (data->properties_button);
-			gedit_message_area_add_action_widget (GEDIT_MESSAGE_AREA (gth_browser_get_list_extra_widget (browser)),
-							      data->properties_button,
-							      _RESPONSE_PROPERTIES);
+			gtk_widget_set_tooltip_text (data->properties_button, _("Properties"));
+			gtk_widget_show_all (data->properties_button);
+			gedit_message_area_add_action_widget (GEDIT_MESSAGE_AREA (extra_widget), data->properties_button, _RESPONSE_PROPERTIES);
 			g_signal_connect (data->properties_button,
 					  "clicked",
 					  G_CALLBACK (properties_button_clicked_cb),
@@ -611,9 +656,5 @@ catalogs__gth_browser_load_location_after_cb (GthBrowser   *browser,
 	else {
 		if (GTH_IS_FILE_SOURCE_VFS (gth_browser_get_location_source (browser)))
 			gedit_message_area_add_button (GEDIT_MESSAGE_AREA (gth_browser_get_list_extra_widget (browser)), _("Organize..."), _RESPONSE_ORGANIZE);
-		if (data->vfs_merge_id != 0) {
-			gtk_ui_manager_remove_ui (gth_browser_get_ui_manager (browser), data->vfs_merge_id);
-			data->vfs_merge_id = 0;
-		}
 	}
 }
diff --git a/extensions/catalogs/callbacks.h b/extensions/catalogs/callbacks.h
index 5ed9dfb..8a0b794 100644
--- a/extensions/catalogs/callbacks.h
+++ b/extensions/catalogs/callbacks.h
@@ -26,17 +26,18 @@
 #include <gthumb.h>
 #include "gth-catalog.h"
 
-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_file_popup_before_cb        (GthBrowser    *browser);
-void catalogs__gth_browser_folder_tree_popup_before_cb (GthBrowser    *browser,
-							GthFileSource *file_source,
-					                GFile         *folder);
-GthCatalog * catalogs__gth_catalog_load_from_data_cb   (const void    *buffer);
-void         catalogs__gth_browser_load_location_after_cb (GthBrowser   *browser,
-					                   GFile        *location,
-					                   const GError *error);
+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_file_popup_before_cb           (GthBrowser    *browser);
+void catalogs__gth_browser_folder_tree_popup_before_cb    (GthBrowser    *browser,
+							   GthFileSource *file_source,
+					                   GFile         *folder);
+GthCatalog * catalogs__gth_catalog_load_from_data_cb      (const void    *buffer);
+void         catalogs__gth_browser_load_location_after_cb (GthBrowser    *browser,
+					                   GFile         *location,
+					                   const GError  *error);
+void         catalogs__gth_browser_update_extra_widget_cb (GthBrowser    *browser);
 
 #endif /* CALLBACKS_H */
diff --git a/extensions/catalogs/dlg-catalog-properties.c b/extensions/catalogs/dlg-catalog-properties.c
index f611c23..f19398d 100644
--- a/extensions/catalogs/dlg-catalog-properties.c
+++ b/extensions/catalogs/dlg-catalog-properties.c
@@ -70,7 +70,10 @@ catalog_saved_cb (void     *buffer,
 			gth_monitor_file_renamed (gth_main_get_default_monitor (),
 						  data->original_file,
 						  data->file_data->file);
+
 		}
+		gth_catalog_update_metadata (data->catalog, data->file_data);
+		gth_monitor_metadata_changed (gth_main_get_default_monitor (), data->file_data);
 	}
 	else
 		_gtk_error_dialog_from_gerror_show (GTK_WINDOW (data->browser), _("Could not save the catalog"), &error);
@@ -157,10 +160,10 @@ catalog_ready_cb (GObject  *object,
 	data->catalog = g_object_ref (object);
 	gtk_entry_set_text (GTK_ENTRY (GET_WIDGET ("name_entry")), gth_catalog_get_display_name (data->file_data->file));
 	gth_time_selector_set_value (GTH_TIME_SELECTOR (data->time_selector), gth_catalog_get_date (data->catalog));
-
 	gth_hook_invoke ("dlg-catalog-properties", data->builder, data->file_data, data->catalog);
-
 	gtk_widget_show (data->dialog);
+
+	g_object_unref (object);
 }
 
 
diff --git a/extensions/catalogs/gth-catalog.c b/extensions/catalogs/gth-catalog.c
index e1fa0fc..2b51be1 100644
--- a/extensions/catalogs/gth-catalog.c
+++ b/extensions/catalogs/gth-catalog.c
@@ -807,3 +807,40 @@ gth_catalog_load_from_file (GFile         *file,
 
 	g_object_unref (gio_file);
 }
+
+
+void
+gth_catalog_update_metadata (GthCatalog  *catalog,
+			     GthFileData *file_data)
+{
+	const char *sort_type;
+	gboolean    sort_inverse;
+
+	sort_type = gth_catalog_get_order (catalog, &sort_inverse);
+	if (sort_type != NULL) {
+		g_file_info_set_attribute_string (file_data->info, "sort::type", sort_type);
+		g_file_info_set_attribute_boolean (file_data->info, "sort::inverse", sort_inverse);
+	}
+
+	if (gth_datetime_valid (gth_catalog_get_date (catalog))) {
+		GObject *metadata;
+		char    *raw;
+		char    *formatted;
+
+		metadata = (GObject *) gth_metadata_new ();
+		raw = gth_datetime_to_exif_date (gth_catalog_get_date (catalog));
+		formatted = gth_datetime_strftime (gth_catalog_get_date (catalog), "%x");
+		g_object_set (metadata,
+			      "id", "general::event-date",
+			      "raw", raw,
+			      "formatted", formatted,
+			      NULL);
+		g_file_info_set_attribute_object (file_data->info, "general::event-date", metadata);
+
+		g_free (formatted);
+		g_free (raw);
+		g_object_unref (metadata);
+	}
+	else
+		g_file_info_remove_attribute (file_data->info, "general::event-date");
+}
diff --git a/extensions/catalogs/gth-catalog.h b/extensions/catalogs/gth-catalog.h
index 2f263aa..ff42b5a 100644
--- a/extensions/catalogs/gth-catalog.h
+++ b/extensions/catalogs/gth-catalog.h
@@ -70,39 +70,41 @@ typedef void (*CatalogReadyCallback) (GthCatalog *catalog,
 				      GError     *error,
 				      gpointer    user_data);
 
-GType         gth_catalog_get_type       (void) G_GNUC_CONST;
-GthCatalog *  gth_catalog_new            (void);
-void          gth_catalog_set_file       (GthCatalog           *catalog,
-					  GFile                *file);
-GFile *       gth_catalog_get_file       (GthCatalog           *catalog);
-void          gth_catalog_set_order      (GthCatalog           *catalog,
-					  const char           *order,
-					  gboolean              inverse);
-const char *  gth_catalog_get_order      (GthCatalog           *catalog,
-					  gboolean             *inverse);
-void          gth_catalog_load_from_data (GthCatalog           *catalog,
-					  const void           *buffer,
-					  gsize                 count,
-					  GError              **error);
-char *        gth_catalog_to_data        (GthCatalog           *catalog,
-		     			  gsize                *length);
-void          gth_catalog_set_file_list  (GthCatalog           *catalog,
-					  GList                *file_list);
-GList *       gth_catalog_get_file_list  (GthCatalog           *catalog);
-gboolean      gth_catalog_insert_file    (GthCatalog           *catalog,
-					  int                   pos,
-					  GFile                *file);
-int           gth_catalog_remove_file    (GthCatalog           *catalog,
-					  GFile                *file);
-void          gth_catalog_set_date       (GthCatalog           *catalog,
-					  GthDateTime          *date_time);
-GthDateTime * gth_catalog_get_date       (GthCatalog           *catalog);
-void          gth_catalog_list_async     (GthCatalog           *catalog,
-					  const char           *attributes,
-					  GCancellable         *cancellable,
-					  CatalogReadyCallback  ready_func,
-					  gpointer              user_data);
-void          gth_catalog_cancel         (GthCatalog           *catalog);
+GType         gth_catalog_get_type        (void) G_GNUC_CONST;
+GthCatalog *  gth_catalog_new             (void);
+void          gth_catalog_set_file        (GthCatalog           *catalog,
+					   GFile                *file);
+GFile *       gth_catalog_get_file        (GthCatalog           *catalog);
+void          gth_catalog_set_order       (GthCatalog           *catalog,
+					   const char           *order,
+					   gboolean              inverse);
+const char *  gth_catalog_get_order       (GthCatalog           *catalog,
+					   gboolean             *inverse);
+void          gth_catalog_load_from_data  (GthCatalog           *catalog,
+					   const void           *buffer,
+					   gsize                 count,
+					   GError              **error);
+char *        gth_catalog_to_data         (GthCatalog           *catalog,
+		     			   gsize                *length);
+void          gth_catalog_set_file_list   (GthCatalog           *catalog,
+					   GList                *file_list);
+GList *       gth_catalog_get_file_list   (GthCatalog           *catalog);
+gboolean      gth_catalog_insert_file     (GthCatalog           *catalog,
+					   int                   pos,
+					   GFile                *file);
+int           gth_catalog_remove_file     (GthCatalog           *catalog,
+					   GFile                *file);
+void          gth_catalog_set_date        (GthCatalog           *catalog,
+					   GthDateTime          *date_time);
+GthDateTime * gth_catalog_get_date        (GthCatalog           *catalog);
+void          gth_catalog_list_async      (GthCatalog           *catalog,
+					   const char           *attributes,
+					   GCancellable         *cancellable,
+					   CatalogReadyCallback  ready_func,
+					   gpointer              user_data);
+void          gth_catalog_cancel          (GthCatalog           *catalog);
+void          gth_catalog_update_metadata (GthCatalog           *catalog,
+					   GthFileData          *file_data);
 
 /* utils */
 
diff --git a/extensions/catalogs/gth-file-source-catalogs.c b/extensions/catalogs/gth-file-source-catalogs.c
index 7c8ed22..7599425 100644
--- a/extensions/catalogs/gth-file-source-catalogs.c
+++ b/extensions/catalogs/gth-file-source-catalogs.c
@@ -349,18 +349,8 @@ read_metadata_catalog_ready_cb (GObject  *object,
 		g_clear_error (&error);
 
 	if (object != NULL) {
-		GthCatalog *catalog;
-		const char *sort_type;
-		gboolean    sort_inverse;
-
-		catalog = GTH_CATALOG (object);
-		sort_type = gth_catalog_get_order (catalog, &sort_inverse);
-		if (sort_type != NULL) {
-			g_file_info_set_attribute_string (read_metadata->file_data->info, "sort::type", sort_type);
-			g_file_info_set_attribute_boolean (read_metadata->file_data->info, "sort::inverse", sort_inverse);
-		}
-
-		g_object_unref (catalog);
+		gth_catalog_update_metadata (GTH_CATALOG (object), read_metadata->file_data);
+		g_object_unref (object);
 	}
 
 	read_metadata->callback (G_OBJECT (read_metadata->file_source), error, read_metadata->data);
diff --git a/extensions/catalogs/main.c b/extensions/catalogs/main.c
index 870b060..401e5df 100644
--- a/extensions/catalogs/main.c
+++ b/extensions/catalogs/main.c
@@ -69,6 +69,7 @@ gthumb_extension_activate (void)
 	gth_hook_add_callback ("gth-browser-file-popup-before", 10, G_CALLBACK (catalogs__gth_browser_file_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);
+	gth_hook_add_callback ("gth-browser-update-extra-widget", 10, G_CALLBACK (catalogs__gth_browser_update_extra_widget_cb), NULL);
 }
 
 
diff --git a/extensions/search/callbacks.c b/extensions/search/callbacks.c
index 9a0da02..9b0f7c4 100644
--- a/extensions/search/callbacks.c
+++ b/extensions/search/callbacks.c
@@ -163,32 +163,6 @@ search__gth_browser_load_location_after_cb (GthBrowser   *browser,
 			gtk_ui_manager_remove_ui (gth_browser_get_ui_manager (browser), data->find_merge_id);
 			data->find_merge_id = 0;
 		}
-		if (data->search_merge_id == 0) {
-			GError *local_error = NULL;
-
-			data->search_merge_id = gtk_ui_manager_add_ui_from_string (gth_browser_get_ui_manager (browser), search_ui_info, -1, &local_error);
-			if (data->search_merge_id == 0) {
-				g_warning ("building menus failed: %s", local_error->message);
-				g_error_free (local_error);
-			}
-			/*gtk_tool_item_set_is_important (GTK_TOOL_ITEM (gtk_ui_manager_get_widget (gth_browser_get_ui_manager (browser), "/ToolBar/SourceCommands/Edit_Search_Update")), TRUE);*/
-			gtk_tool_item_set_is_important (GTK_TOOL_ITEM (gtk_ui_manager_get_widget (gth_browser_get_ui_manager (browser), "/ToolBar/SourceCommands/Edit_Search_Edit")), TRUE);
-		}
-
-		if (data->refresh_button == NULL) {
-			data->refresh_button = gtk_button_new_from_stock (GTK_STOCK_REFRESH);
-			g_object_add_weak_pointer (G_OBJECT (data->refresh_button), (gpointer *)&data->refresh_button);
-			gtk_button_set_relief (GTK_BUTTON (data->refresh_button), GTK_RELIEF_NONE);
-			GTK_WIDGET_SET_FLAGS (data->refresh_button, GTK_CAN_DEFAULT);
-			gtk_widget_show (data->refresh_button);
-			gedit_message_area_add_action_widget (GEDIT_MESSAGE_AREA (gth_browser_get_list_extra_widget (browser)),
-							      data->refresh_button,
-							      _RESPONSE_REFRESH);
-			g_signal_connect (data->refresh_button,
-					  "clicked",
-					  G_CALLBACK (refresh_button_clicked_cb),
-					  browser);
-		}
 	}
 	else {
 		if (data->search_merge_id != 0) {
@@ -209,6 +183,48 @@ search__gth_browser_load_location_after_cb (GthBrowser   *browser,
 }
 
 
+void
+search__gth_browser_update_extra_widget_cb (GthBrowser *browser)
+{
+	GthFileData *location_data;
+	BrowserData *data;
+
+	location_data = gth_browser_get_location_data (browser);
+	if (! _g_content_type_is_a (g_file_info_get_content_type (location_data->info), "gthumb/search"))
+		return;
+
+	data = g_object_get_data (G_OBJECT (browser), BROWSER_DATA_KEY);
+
+	if (data->search_merge_id == 0) {
+		GError *local_error = NULL;
+
+		data->search_merge_id = gtk_ui_manager_add_ui_from_string (gth_browser_get_ui_manager (browser), search_ui_info, -1, &local_error);
+		if (data->search_merge_id == 0) {
+			g_warning ("building menus failed: %s", local_error->message);
+			g_error_free (local_error);
+		}
+		/*gtk_tool_item_set_is_important (GTK_TOOL_ITEM (gtk_ui_manager_get_widget (gth_browser_get_ui_manager (browser), "/ToolBar/SourceCommands/Edit_Search_Update")), TRUE);*/
+		gtk_tool_item_set_is_important (GTK_TOOL_ITEM (gtk_ui_manager_get_widget (gth_browser_get_ui_manager (browser), "/ToolBar/SourceCommands/Edit_Search_Edit")), TRUE);
+	}
+
+	if (data->refresh_button == NULL) {
+		data->refresh_button = gtk_button_new ();
+		gtk_container_add (GTK_CONTAINER (data->refresh_button), gtk_image_new_from_stock (GTK_STOCK_REFRESH, GTK_ICON_SIZE_BUTTON));
+		g_object_add_weak_pointer (G_OBJECT (data->refresh_button), (gpointer *)&data->refresh_button);
+		gtk_button_set_relief (GTK_BUTTON (data->refresh_button), GTK_RELIEF_NONE);
+		gtk_widget_set_tooltip_text (data->refresh_button, _("Search again"));
+		gtk_widget_show_all (data->refresh_button);
+		gedit_message_area_add_action_widget (GEDIT_MESSAGE_AREA (gth_browser_get_list_extra_widget (browser)),
+						      data->refresh_button,
+						      _RESPONSE_REFRESH);
+		g_signal_connect (data->refresh_button,
+				  "clicked",
+				  G_CALLBACK (refresh_button_clicked_cb),
+				  browser);
+	}
+}
+
+
 GthCatalog *
 search__gth_catalog_load_from_data_cb (const void *buffer)
 {
diff --git a/extensions/search/callbacks.h b/extensions/search/callbacks.h
index 7de3d8e..cda1eb7 100644
--- a/extensions/search/callbacks.h
+++ b/extensions/search/callbacks.h
@@ -26,14 +26,15 @@
 #include <gthumb.h>
 #include <extensions/catalogs/gth-catalog.h>
 
-void search__gth_browser_construct_cb              (GthBrowser  *browser);
-void search__gth_browser_update_sensitivity_cb     (GthBrowser  *browser);
-void search__gth_browser_load_location_after_cb    (GthBrowser  *browser,
-						    GFile       *location,
-						    GError      *error);
-GthCatalog * search__gth_catalog_load_from_data_cb (const void  *buffer);
-void search__dlg_catalog_properties                (GthBrowser  *browser,
-						    GtkBuilder  *builder,
-						    GthFileData *file_data);
+void         search__gth_browser_construct_cb            (GthBrowser  *browser);
+void         search__gth_browser_update_sensitivity_cb   (GthBrowser  *browser);
+void         search__gth_browser_load_location_after_cb  (GthBrowser  *browser,
+						          GFile       *location,
+						          GError      *error);
+void         search__gth_browser_update_extra_widget_cb  (GthBrowser  *browser);
+GthCatalog * search__gth_catalog_load_from_data_cb       (const void  *buffer);
+void         search__dlg_catalog_properties              (GthBrowser  *browser,
+							  GtkBuilder  *builder,
+							  GthFileData *file_data);
 
 #endif /* CALLBACKS_H */
diff --git a/extensions/search/gth-search-task.c b/extensions/search/gth-search-task.c
index db508a9..4e91e57 100644
--- a/extensions/search/gth-search-task.c
+++ b/extensions/search/gth-search-task.c
@@ -131,7 +131,7 @@ save_search_result_copy_done_cb (void     *buffer,
 
 	g_free (text);*/
 
-	gth_browser_load_location_after (task->priv->browser, NULL);
+	gth_browser_update_extra_widget (task->priv->browser);
 
 	/* FIXME
 	gedit_message_area_add_stock_button_with_text (GEDIT_MESSAGE_AREA (task->priv->dialog),
diff --git a/extensions/search/main.c b/extensions/search/main.c
index eaf684d..22f9a15 100644
--- a/extensions/search/main.c
+++ b/extensions/search/main.c
@@ -33,6 +33,7 @@ gthumb_extension_activate (void)
 	gth_hook_add_callback ("gth-catalog-load-from-data", 10, G_CALLBACK (search__gth_catalog_load_from_data_cb), NULL);
 	gth_hook_add_callback ("gth-browser-construct", 10, G_CALLBACK (search__gth_browser_construct_cb), NULL);
 	gth_hook_add_callback ("gth-browser-load-location-after", 20, G_CALLBACK (search__gth_browser_load_location_after_cb), NULL);
+	gth_hook_add_callback ("gth-browser-update-extra-widget", 20, G_CALLBACK (search__gth_browser_update_extra_widget_cb), NULL);
 	gth_hook_add_callback ("dlg-catalog-properties", 10, G_CALLBACK (search__dlg_catalog_properties), NULL);
 }
 
diff --git a/gthumb/gth-browser.c b/gthumb/gth-browser.c
index 7a29977..17f181c 100644
--- a/gthumb/gth-browser.c
+++ b/gthumb/gth-browser.c
@@ -528,14 +528,14 @@ gth_browser_update_sensitivity (GthBrowser *browser)
 
 
 void
-gth_browser_load_location_after (GthBrowser *browser,
-				 GError     *error)
+gth_browser_update_extra_widget (GthBrowser *browser)
 {
 	gedit_message_area_clear_action_area (GEDIT_MESSAGE_AREA (browser->priv->list_extra_widget));
-	gth_embedded_dialog_set_gicon (GTH_EMBEDDED_DIALOG (browser->priv->list_extra_widget), g_file_info_get_icon (browser->priv->location->info));
-	gth_embedded_dialog_set_primary_text (GTH_EMBEDDED_DIALOG (browser->priv->list_extra_widget), g_file_info_get_display_name (browser->priv->location->info));
-
-	gth_hook_invoke ("gth-browser-load-location-after", browser, browser->priv->location, error);
+	if (g_file_info_get_icon (browser->priv->location->info) != NULL)
+		gth_embedded_dialog_set_gicon (GTH_EMBEDDED_DIALOG (browser->priv->list_extra_widget), g_file_info_get_icon (browser->priv->location->info));
+	if (g_file_info_get_display_name (browser->priv->location->info) != NULL)
+		gth_embedded_dialog_set_primary_text (GTH_EMBEDDED_DIALOG (browser->priv->list_extra_widget), g_file_info_get_display_name (browser->priv->location->info));
+	gth_hook_invoke ("gth-browser-update-extra-widget", browser);
 }
 
 
@@ -553,6 +553,7 @@ _gth_browser_set_location (GthBrowser  *browser,
 	gth_browser_update_title (browser);
 	_gth_browser_update_parent_list (browser);
 	gth_browser_update_sensitivity (browser);
+	gth_browser_update_extra_widget (browser);
 
 	g_signal_handlers_block_by_data (browser->priv->location_chooser, browser);
 	gth_location_chooser_set_current (GTH_LOCATION_CHOOSER (browser->priv->location_chooser), browser->priv->location->file);
@@ -991,7 +992,8 @@ load_data_done (LoadData *load_data,
 	    || (load_data->action == GTH_ACTION_GO_UP)
 	    || (load_data->action == GTH_ACTION_VIEW))
 	{
-		gth_browser_load_location_after (browser, error);
+		gth_browser_update_extra_widget (browser);
+		gth_hook_invoke ("gth-browser-load-location-after", browser, browser->priv->location, error);
 	}
 
 	if (error == NULL)
@@ -2618,22 +2620,24 @@ metadata_changed_cb (GthMonitor  *monitor,
 		     GthFileData *file_data,
 		     GthBrowser  *browser)
 {
-	if (browser->priv->current_file == NULL)
-		return;
-
-	if (! g_file_equal (browser->priv->current_file->file, file_data->file))
+	if ((browser->priv->location != NULL) && g_file_equal (browser->priv->location->file, file_data->file)) {
+		if (file_data->info != browser->priv->location->info)
+			g_file_info_copy_into (file_data->info, browser->priv->location->info);
+		gth_browser_update_extra_widget (browser);
 		return;
+	}
 
-	if (file_data->info != browser->priv->current_file->info)
-		g_file_info_copy_into (file_data->info, browser->priv->current_file->info);
+	if ((browser->priv->current_file != NULL) && g_file_equal (browser->priv->current_file->file, file_data->file)) {
+		if (file_data->info != browser->priv->current_file->info)
+			g_file_info_copy_into (file_data->info, browser->priv->current_file->info);
 
-	gth_sidebar_set_file (GTH_SIDEBAR (browser->priv->file_properties), browser->priv->current_file);
-	gth_sidebar_set_file (GTH_SIDEBAR (browser->priv->viewer_sidebar), browser->priv->current_file);
-
-	_gth_browser_update_statusbar_file_info (browser);
-	gth_browser_update_title (browser);
-	gth_browser_update_sensitivity (browser);
+		gth_sidebar_set_file (GTH_SIDEBAR (browser->priv->file_properties), browser->priv->current_file);
+		gth_sidebar_set_file (GTH_SIDEBAR (browser->priv->viewer_sidebar), browser->priv->current_file);
 
+		_gth_browser_update_statusbar_file_info (browser);
+		gth_browser_update_title (browser);
+		gth_browser_update_sensitivity (browser);
+	}
 }
 
 
diff --git a/gthumb/gth-browser.h b/gthumb/gth-browser.h
index 7a139b8..80ac5a2 100644
--- a/gthumb/gth-browser.h
+++ b/gthumb/gth-browser.h
@@ -152,8 +152,7 @@ void             gth_browser_load_file              (GthBrowser       *browser,
 						     gboolean          view);
 void             gth_browser_update_title           (GthBrowser       *browser);
 void             gth_browser_update_sensitivity     (GthBrowser       *browser);
-void             gth_browser_load_location_after    (GthBrowser       *browser,
-						     GError           *error);
+void             gth_browser_update_extra_widget    (GthBrowser       *browser);
 void             gth_browser_show_viewer_properties (GthBrowser       *browser,
 						     gboolean          show);
 void             gth_browser_show_viewer_tools      (GthBrowser       *browser,
diff --git a/gthumb/gth-main-default-hooks.c b/gthumb/gth-main-default-hooks.c
index ea068c6..6fe29e3 100644
--- a/gthumb/gth-main-default-hooks.c
+++ b/gthumb/gth-main-default-hooks.c
@@ -163,6 +163,13 @@ gth_main_register_default_hooks (void)
 	gth_hook_register ("gth-browser-file-list-key-press", 2);
 
 	/**
+	 * Called when the list extra widget needs to be updated.
+	 *
+	 * @browser (GthBrowser*): the relative window.
+	 */
+	gth_hook_register ("gth-browser-update-extra-widget", 1);
+
+	/**
 	 * Called in _gdk_pixbuf_save_async
 	 *
 	 * @data (SavePixbufData*):



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