[gthumb] load the file metadata before creating the viewer.



commit 125db5fc3dc90065724b942307c3d611cad632d2
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Thu Feb 4 13:30:05 2010 +0100

    load the file metadata before creating the viewer.

 gthumb/gth-browser.c |  231 ++++++++++++++++++++++++++------------------------
 1 files changed, 122 insertions(+), 109 deletions(-)
---
diff --git a/gthumb/gth-browser.c b/gthumb/gth-browser.c
index cbba5e6..57bdee6 100644
--- a/gthumb/gth-browser.c
+++ b/gthumb/gth-browser.c
@@ -4263,6 +4263,53 @@ gth_browser_show_last_image (GthBrowser *browser,
 }
 
 
+/* -- gth_browser_load_file -- */
+
+
+typedef struct {
+	int          ref;
+	GthBrowser  *browser;
+	GthFileData *file_data;
+	gboolean     view;
+} LoadFileData;
+
+
+static LoadFileData *
+load_file_data_new (GthBrowser  *browser,
+		    GthFileData *file_data,
+		    gboolean     view)
+{
+	LoadFileData *data;
+
+	data = g_new0 (LoadFileData, 1);
+	data->ref = 1;
+	data->browser = g_object_ref (browser);
+	if (file_data != NULL)
+		data->file_data = g_object_ref (file_data);
+	data->view = view;
+
+	return data;
+}
+
+
+static void
+load_file_data_ref (LoadFileData *data)
+{
+	data->ref++;
+}
+
+
+static void
+load_file_data_unref (LoadFileData *data)
+{
+	if (--data->ref > 0)
+		return;
+	_g_object_unref (data->file_data);
+	_g_object_unref (data->browser);
+	g_free (data);
+}
+
+
 static void
 gth_viewer_page_file_loaded_cb (GthViewerPage *viewer_page,
 				gboolean       success,
@@ -4324,41 +4371,6 @@ gth_viewer_page_file_loaded_cb (GthViewerPage *viewer_page,
 
 
 static void
-file_metadata_ready_cb (GList    *files,
-			GError   *error,
-			gpointer  user_data)
-{
-	GthBrowser  *browser = user_data;
-	GthFileData *file_data;
-
-	file_data = files->data;
-	if ((browser->priv->current_file == NULL) || ! g_file_equal (file_data->file, browser->priv->current_file->file))
-		file_data = NULL;
-
-	if (file_data == NULL)
-		return;
-
-	g_file_info_copy_into (file_data->info, browser->priv->current_file->info);
-
-	if (browser->priv->viewer_page != NULL)
-		gth_viewer_page_view (browser->priv->viewer_page, file_data);
-	else
-		gth_viewer_page_file_loaded_cb (NULL, FALSE, browser);
-
-	if (browser->priv->location == NULL) {
-		GFile *parent;
-
-		parent = g_file_get_parent (file_data->file);
-		_gth_browser_load (browser, parent, file_data->file, GTH_ACTION_GO_TO, FALSE);
-		g_object_unref (parent);
-	}
-}
-
-
-/* -- gth_browser_load_file -- */
-
-
-static void
 _gth_browser_make_file_visible (GthBrowser  *browser,
 				GthFileData *file_data)
 {
@@ -4403,40 +4415,26 @@ _gth_browser_make_file_visible (GthBrowser  *browser,
 
 
 static void
-_gth_browser_deactivate_viewer_page (GthBrowser *browser)
-{
-	if (browser->priv->viewer_page != NULL) {
-		gth_viewer_page_deactivate (browser->priv->viewer_page);
-		gtk_ui_manager_ensure_update (browser->priv->ui);
-		gth_browser_set_viewer_widget (browser, NULL);
-		g_object_unref (browser->priv->viewer_page);
-		browser->priv->viewer_page = NULL;
-	}
-}
-
-
-static void
-_gth_browser_load_file (GthBrowser  *browser,
-			GthFileData *file_data,
-			gboolean     view)
+file_metadata_ready_cb (GList    *files,
+			GError   *error,
+			gpointer  user_data)
 {
-	GList *scan;
-	GList *files;
-
-	if (file_data == NULL) {
-		_gth_browser_deactivate_viewer_page (browser);
-		_g_object_unref (browser->priv->current_file);
-		browser->priv->current_file = NULL;
-
-		gtk_widget_hide (browser->priv->file_properties);
+	LoadFileData *data = user_data;
+	GthBrowser   *browser;
+	GthFileData  *file_data;
+	GList        *scan;
 
-		_gth_browser_update_statusbar_file_info (browser);
-		gth_browser_update_title (browser);
-		gth_browser_update_sensitivity (browser);
+	browser = data->browser;
+	file_data = files->data;
 
+	if ((browser->priv->current_file == NULL) || ! g_file_equal (file_data->file, browser->priv->current_file->file)) {
+		load_file_data_unref (data);
 		return;
 	}
-	else if (! GTK_WIDGET_VISIBLE (browser->priv->file_properties)) {
+
+	g_file_info_copy_into (file_data->info, browser->priv->current_file->info);
+
+	if (! GTK_WIDGET_VISIBLE (browser->priv->file_properties)) {
 		GtkTreePath *path;
 
 		gtk_paned_set_position (GTK_PANED (browser->priv->browser_sidebar), browser->priv->browser_sidebar->allocation.height / 2);
@@ -4451,13 +4449,6 @@ _gth_browser_load_file (GthBrowser  *browser,
 		}
 	}
 
-	g_object_ref (file_data);
-	_g_object_unref (browser->priv->current_file);
-	browser->priv->current_file = gth_file_data_dup (file_data);
-	g_object_unref (file_data);
-
-	_gth_browser_make_file_visible (browser, browser->priv->current_file);
-
 	if (browser->priv->viewer_pages == NULL)
 		browser->priv->viewer_pages = g_list_reverse (gth_main_get_registered_objects (GTH_TYPE_VIEWER_PAGE));
 	for (scan = browser->priv->viewer_pages; scan; scan = scan->next) {
@@ -4469,7 +4460,7 @@ _gth_browser_load_file (GthBrowser  *browser,
 		}
 	}
 
-	if (view) {
+	if (data->view) {
 		gth_viewer_page_show (browser->priv->viewer_page);
 		if (browser->priv->fullscreen) {
 			gth_viewer_page_fullscreen (browser->priv->viewer_page, TRUE);
@@ -4478,57 +4469,79 @@ _gth_browser_load_file (GthBrowser  *browser,
 		gth_window_set_current_page (GTH_WINDOW (browser), GTH_BROWSER_PAGE_VIEWER);
 	}
 
-	files = g_list_prepend (NULL, gth_file_data_dup (browser->priv->current_file));
-	_g_query_metadata_async (files,
-				 "*",
-				 NULL,
-				 file_metadata_ready_cb,
-			 	 browser);
-
-	_g_object_list_unref (files);
-}
-
-
-typedef struct {
-	int          ref;
-	GthBrowser  *browser;
-	GthFileData *file_data;
-	gboolean     view;
-} LoadFileData;
-
+	if (browser->priv->viewer_page != NULL)
+		gth_viewer_page_view (browser->priv->viewer_page, file_data);
+	else
+		gth_viewer_page_file_loaded_cb (NULL, FALSE, browser);
 
-static LoadFileData *
-load_file_data_new (GthBrowser  *browser,
-		    GthFileData *file_data,
-		    gboolean     view)
-{
-	LoadFileData *data;
+	if (browser->priv->location == NULL) {
+		GFile *parent;
 
-	data = g_new0 (LoadFileData, 1);
-	data->ref = 1;
-	data->browser = browser;
-	if (file_data != NULL)
-		data->file_data = g_object_ref (file_data);
-	data->view = view;
+		parent = g_file_get_parent (file_data->file);
+		_gth_browser_load (browser, parent, file_data->file, GTH_ACTION_GO_TO, FALSE);
+		g_object_unref (parent);
+	}
 
-	return data;
+	load_file_data_unref (data);
 }
 
 
 static void
-load_file_data_ref (LoadFileData *data)
+_gth_browser_deactivate_viewer_page (GthBrowser *browser)
 {
-	data->ref++;
+	if (browser->priv->viewer_page != NULL) {
+		gth_viewer_page_deactivate (browser->priv->viewer_page);
+		gtk_ui_manager_ensure_update (browser->priv->ui);
+		gth_browser_set_viewer_widget (browser, NULL);
+		g_object_unref (browser->priv->viewer_page);
+		browser->priv->viewer_page = NULL;
+	}
 }
 
 
 static void
-load_file_data_unref (LoadFileData *data)
+_gth_browser_load_file (GthBrowser  *browser,
+			GthFileData *file_data,
+			gboolean     view)
 {
-	if (--data->ref > 0)
+	LoadFileData *data;
+	GList        *files;
+
+	if (file_data == NULL) {
+		_gth_browser_deactivate_viewer_page (browser);
+		_g_object_unref (browser->priv->current_file);
+		browser->priv->current_file = NULL;
+
+		gtk_widget_hide (browser->priv->file_properties);
+
+		_gth_browser_update_statusbar_file_info (browser);
+		gth_browser_update_title (browser);
+		gth_browser_update_sensitivity (browser);
+
 		return;
-	_g_object_unref (data->file_data);
-	g_free (data);
+	}
+
+	if ((browser->priv->current_file != NULL) && g_file_equal (file_data->file, browser->priv->current_file->file)) {
+		gth_window_set_current_page (GTH_WINDOW (browser), GTH_BROWSER_PAGE_VIEWER);
+		return;
+	}
+
+	_g_object_unref (browser->priv->current_file);
+	browser->priv->current_file = gth_file_data_dup (file_data);
+
+	_gth_browser_make_file_visible (browser, browser->priv->current_file);
+
+	data = load_file_data_new (browser, file_data, view);
+	files = g_list_prepend (NULL, data->file_data->file);
+	_g_query_all_metadata_async (files,
+				     FALSE,
+				     TRUE,
+				     "*",
+				     NULL,
+				     file_metadata_ready_cb,
+				     data);
+
+	g_list_free (files);
 }
 
 



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