[gthumb: 2/40] Speed-up image loading



commit 41422c1ae0861e176560763348b1c678b3b619c7
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Thu Sep 2 13:25:23 2010 +0200

    Speed-up image loading
    
    Load  the file before loading the metadata.

 gthumb/gth-browser.c |  178 +++++++++++++++++++++++++++----------------------
 1 files changed, 98 insertions(+), 80 deletions(-)
---
diff --git a/gthumb/gth-browser.c b/gthumb/gth-browser.c
index c8317aa..1f6c851 100644
--- a/gthumb/gth-browser.c
+++ b/gthumb/gth-browser.c
@@ -4189,7 +4189,7 @@ _gth_browser_construct (GthBrowser *browser)
 
 	/* the image preloader */
 
-	browser->priv->image_preloader = gth_image_preloader_new ();
+	browser->priv->image_preloader = gth_image_preloader_new (GTH_LOAD_POLICY_TWO_STEPS, 4);
 
 	/**/
 
@@ -5068,7 +5068,7 @@ load_file_data_ref (LoadFileData *data)
 static void
 load_file_data_unref (LoadFileData *data)
 {
-	if (--data->ref > 0)
+	if (--data->ref != 0)
 		return;
 	_g_object_unref (data->file_data);
 	_g_object_unref (data->browser);
@@ -5093,6 +5093,7 @@ _gth_browser_deactivate_viewer_page (GthBrowser *browser)
 
 static void
 gth_viewer_page_file_loaded_cb (GthViewerPage *viewer_page,
+				GthFileData   *file_data,
 				gboolean       success,
 				gpointer       user_data);
 
@@ -5120,37 +5121,6 @@ _gth_browser_set_current_viewer_page (GthBrowser    *browser,
 
 
 static void
-gth_viewer_page_file_loaded_cb (GthViewerPage *viewer_page,
-				gboolean       success,
-				gpointer       user_data)
-{
-	GthBrowser *browser = user_data;
-
-	if (! success) {
-		GthViewerPage *basic_viewer_page;
-
-		/* Use the basic viewer if the default viewer failed.  The
-		 * basic viewer is registered before any other viewer, so it's
-		 * the last one in the viewer_pages list. */
-
-		basic_viewer_page = g_list_last (browser->priv->viewer_pages)->data;
-		_gth_browser_set_current_viewer_page (browser, basic_viewer_page);
-		gth_viewer_page_view (browser->priv->viewer_page, browser->priv->current_file);
-		return;
-	}
-
-	g_file_info_set_attribute_boolean (browser->priv->current_file->info, "gth::file::is-modified", FALSE);
-
-	gth_browser_update_title (browser);
-	gth_browser_update_statusbar_file_info (browser);
-	if (gth_window_get_current_page (GTH_WINDOW (browser)) == GTH_BROWSER_PAGE_VIEWER)
-		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_sensitivity (browser);
-}
-
-
-static void
 file_metadata_ready_cb (GList    *files,
 			GError   *error,
 			gpointer  user_data)
@@ -5158,7 +5128,6 @@ file_metadata_ready_cb (GList    *files,
 	LoadFileData *data = user_data;
 	GthBrowser   *browser = data->browser;
 	GthFileData  *file_data;
-	GList        *scan;
 
 	if ((error != NULL) || (files == NULL)) {
 		load_file_data_unref (data);
@@ -5166,12 +5135,13 @@ file_metadata_ready_cb (GList    *files,
 	}
 
 	file_data = files->data;
-	if ((browser->priv->current_file == NULL) || ! g_file_equal (file_data->file, browser->priv->current_file->file)) {
+	if ((browser->priv->current_file == NULL) || ! _g_file_equal (file_data->file, browser->priv->current_file->file)) {
 		load_file_data_unref (data);
 		return;
 	}
 
 	g_file_info_copy_into (file_data->info, browser->priv->current_file->info);
+	g_file_info_set_attribute_boolean (browser->priv->current_file->info, "gth::file::is-modified", FALSE);
 
 	if (! gtk_widget_get_visible (browser->priv->file_properties)) {
 		GtkAllocation allocation;
@@ -5191,34 +5161,20 @@ file_metadata_ready_cb (GList    *files,
 		}
 	}
 
-	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) {
-		GthViewerPage *registered_viewer_page = scan->data;
-
-		if (gth_viewer_page_can_view (registered_viewer_page, browser->priv->current_file)) {
-			_gth_browser_set_current_viewer_page (browser, registered_viewer_page);
-			break;
-		}
-	}
-
-	if (data->view)
-		gth_window_set_current_page (GTH_WINDOW (browser), GTH_BROWSER_PAGE_VIEWER);
-
 	if (gth_window_get_current_page (GTH_WINDOW (browser)) == GTH_BROWSER_PAGE_VIEWER) {
-		gth_viewer_page_show (browser->priv->viewer_page);
 		if (browser->priv->fullscreen) {
 			gth_viewer_page_fullscreen (browser->priv->viewer_page, TRUE);
 			gth_viewer_page_show_pointer (browser->priv->viewer_page, FALSE);
 		}
 	}
-	else if (gth_window_get_current_page (GTH_WINDOW (browser)) == GTH_BROWSER_PAGE_BROWSER)
-		gth_sidebar_set_file (GTH_SIDEBAR (browser->priv->file_properties), browser->priv->current_file);
 
-	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);
+	gth_browser_update_title (browser);
+	gth_browser_update_statusbar_file_info (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);
+	if (gth_window_get_current_page (GTH_WINDOW (browser)) == GTH_BROWSER_PAGE_VIEWER)
+		_gth_browser_make_file_visible (browser, browser->priv->current_file);
+	gth_browser_update_sensitivity (browser);
 
 	if (browser->priv->location == NULL) {
 		GFile *parent;
@@ -5233,12 +5189,52 @@ file_metadata_ready_cb (GList    *files,
 
 
 static void
+gth_viewer_page_file_loaded_cb (GthViewerPage *viewer_page,
+				GthFileData   *file_data,
+				gboolean       success,
+				gpointer       user_data)
+{
+	GthBrowser   *browser = user_data;
+	LoadFileData *data;
+	GList        *files;
+
+	if ((browser->priv->current_file == NULL) || ! g_file_equal (file_data->file, browser->priv->current_file->file))
+		return;
+
+	if (! success) {
+		GthViewerPage *basic_viewer_page;
+
+		/* Use the basic viewer if the default viewer failed.  The
+		 * basic viewer is registered before any other viewer, so it's
+		 * the last one in the viewer_pages list. */
+
+		basic_viewer_page = g_list_last (browser->priv->viewer_pages)->data;
+		_gth_browser_set_current_viewer_page (browser, basic_viewer_page);
+		gth_viewer_page_view (browser->priv->viewer_page, browser->priv->current_file);
+		return;
+	}
+
+	g_file_info_set_attribute_boolean (browser->priv->current_file->info, "gth::file::is-modified", FALSE);
+
+	data = load_file_data_new (browser, browser->priv->current_file, TRUE);
+	files = g_list_prepend (NULL, browser->priv->current_file->file);
+	_g_query_all_metadata_async (files,
+				     GTH_LIST_DEFAULT,
+				     "*",
+				     NULL,
+				     file_metadata_ready_cb,
+				     data);
+
+	g_list_free (files);
+}
+
+
+static void
 _gth_browser_load_file (GthBrowser  *browser,
 			GthFileData *file_data,
 			gboolean     view)
 {
-	LoadFileData *data;
-	GList        *files;
+	GList *scan;
 
 	if (file_data == NULL) {
 		_gth_browser_deactivate_viewer_page (browser);
@@ -5257,19 +5253,39 @@ _gth_browser_load_file (GthBrowser  *browser,
 	_g_object_unref (browser->priv->current_file);
 	browser->priv->current_file = gth_file_data_dup (file_data);
 
-	if (gth_window_get_current_page (GTH_WINDOW (browser)) == GTH_BROWSER_PAGE_VIEWER)
-		_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));
 
-	data = load_file_data_new (browser, file_data, view);
-	files = g_list_prepend (NULL, data->file_data->file);
-	_g_query_all_metadata_async (files,
-				     GTH_LIST_DEFAULT,
-				     "*",
-				     NULL,
-				     file_metadata_ready_cb,
-				     data);
+	for (scan = browser->priv->viewer_pages; scan; scan = scan->next) {
+		GthViewerPage *registered_viewer_page = scan->data;
 
-	g_list_free (files);
+		if (gth_viewer_page_can_view (registered_viewer_page, browser->priv->current_file)) {
+			_gth_browser_set_current_viewer_page (browser, registered_viewer_page);
+			break;
+		}
+	}
+
+	if (view)
+		gth_window_set_current_page (GTH_WINDOW (browser), GTH_BROWSER_PAGE_VIEWER);
+
+	if (gth_window_get_current_page (GTH_WINDOW (browser)) == GTH_BROWSER_PAGE_VIEWER) {
+		int file_pos;
+
+		file_pos = gth_file_store_get_pos (GTH_FILE_STORE (gth_browser_get_file_store (browser)), browser->priv->current_file->file);
+		if (file_pos >= 0) {
+			GtkWidget *view;
+
+			view = gth_browser_get_file_list_view (browser);
+			g_signal_handlers_block_by_func (view, gth_file_view_selection_changed_cb, browser);
+			gth_file_view_set_cursor (GTH_FILE_VIEW (view), file_pos);
+			g_signal_handlers_unblock_by_func (view, gth_file_view_selection_changed_cb, browser);
+		}
+	}
+
+	if (browser->priv->viewer_page != NULL)
+		gth_viewer_page_view (browser->priv->viewer_page, browser->priv->current_file);
+	else
+		gth_viewer_page_file_loaded_cb (NULL, browser->priv->current_file, FALSE, browser);
 }
 
 
@@ -5328,22 +5344,24 @@ gth_browser_load_file (GthBrowser  *browser,
 
 	data = load_file_data_new (browser, file_data, view);
 
-	if (browser->priv->load_file_timeout != 0) {
-		if (view) {
+	if (view) {
+		if (browser->priv->load_file_timeout != 0) {
 			g_source_remove (browser->priv->load_file_timeout);
 			browser->priv->load_file_timeout = 0;
-			load_file_delayed_cb (data);
 		}
+		load_file_delayed_cb (data);
 		load_file_data_unref (data);
-		return;
 	}
-
-	browser->priv->load_file_timeout =
-			g_timeout_add_full (G_PRIORITY_DEFAULT,
-					    LOAD_FILE_DELAY,
-					    load_file_delayed_cb,
-					    data,
-					    (GDestroyNotify) load_file_data_unref);
+	else {
+		if (browser->priv->load_file_timeout != 0)
+			g_source_remove (browser->priv->load_file_timeout);
+		browser->priv->load_file_timeout =
+				g_timeout_add_full (G_PRIORITY_DEFAULT,
+						    LOAD_FILE_DELAY,
+						    load_file_delayed_cb,
+						    data,
+						    (GDestroyNotify) load_file_data_unref);
+	}
 }
 
 



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