[gthumb] use the basic viewer if the default viewer fails to load the file



commit f56f130590f8507837c89a760fbf19add78c6cd5
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Thu Feb 4 12:38:09 2010 +0100

    use the basic viewer if the default viewer fails to load the file

 extensions/file_viewer/gth-file-viewer-page.c   |    3 +-
 extensions/gstreamer/gth-media-viewer-page.c    |    2 +-
 extensions/image_viewer/gth-image-viewer-page.c |    8 ++-
 gthumb/gth-browser.c                            |   64 ++++++++++++++++------
 gthumb/gth-thumb-loader.c                       |    4 +-
 gthumb/gth-viewer-page.c                        |   10 ++--
 gthumb/gth-viewer-page.h                        |    6 ++-
 7 files changed, 66 insertions(+), 31 deletions(-)
---
diff --git a/extensions/file_viewer/gth-file-viewer-page.c b/extensions/file_viewer/gth-file-viewer-page.c
index 344b264..2ab79e2 100644
--- a/extensions/file_viewer/gth-file-viewer-page.c
+++ b/extensions/file_viewer/gth-file-viewer-page.c
@@ -81,9 +81,9 @@ thumb_loader_ready_cb (GthThumbLoader    *il,
 		       GError            *error,
 		       GthFileViewerPage *self)
 {
-	gth_viewer_page_file_loaded (GTH_VIEWER_PAGE (self));
 	if (error == NULL)
 		gtk_image_set_from_pixbuf (GTK_IMAGE (self->priv->icon), gth_thumb_loader_get_pixbuf (self->priv->thumb_loader));
+	gth_viewer_page_file_loaded (GTH_VIEWER_PAGE (self), TRUE);
 }
 
 
@@ -298,6 +298,7 @@ static void
 gth_file_viewer_page_instance_init (GthFileViewerPage *self)
 {
 	self->priv = GTH_FILE_VIEWER_PAGE_GET_PRIVATE (self);
+	self->priv->thumb_loader = NULL;
 }
 
 
diff --git a/extensions/gstreamer/gth-media-viewer-page.c b/extensions/gstreamer/gth-media-viewer-page.c
index 442c59a..cbd00f4 100644
--- a/extensions/gstreamer/gth-media-viewer-page.c
+++ b/extensions/gstreamer/gth-media-viewer-page.c
@@ -930,7 +930,7 @@ gth_media_viewer_page_real_view (GthViewerPage *base,
 
 	/**/
 
-	gth_viewer_page_file_loaded (GTH_VIEWER_PAGE (self));
+	gth_viewer_page_file_loaded (GTH_VIEWER_PAGE (self), TRUE);
 	g_signal_handlers_block_by_func(GET_WIDGET ("adjustment_position"), position_value_changed_cb, self);
 	gtk_adjustment_set_value (GTK_ADJUSTMENT (GET_WIDGET ("adjustment_position")), 0.0);
 	g_signal_handlers_unblock_by_func(GET_WIDGET ("adjustment_position"), position_value_changed_cb, self);
diff --git a/extensions/image_viewer/gth-image-viewer-page.c b/extensions/image_viewer/gth-image-viewer-page.c
index 5f2da34..50bd35e 100644
--- a/extensions/image_viewer/gth-image-viewer-page.c
+++ b/extensions/image_viewer/gth-image-viewer-page.c
@@ -206,7 +206,7 @@ viewer_image_ready_cb (GtkWidget          *widget,
 	gth_image_history_add_image (self->priv->history,
 				     gth_image_viewer_get_current_pixbuf (GTH_IMAGE_VIEWER (self->priv->viewer)),
 				     FALSE);
-	gth_viewer_page_file_loaded (GTH_VIEWER_PAGE (self));
+	gth_viewer_page_file_loaded (GTH_VIEWER_PAGE (self), TRUE);
 }
 
 
@@ -264,13 +264,15 @@ image_preloader_requested_ready_cb (GthImagePreloader  *preloader,
 	GthImageLoader *image_loader;
 
 	if (error != NULL) {
-		gth_image_viewer_set_void (GTH_IMAGE_VIEWER (self->priv->viewer));
+		gth_viewer_page_file_loaded (GTH_VIEWER_PAGE (self), FALSE);
 		return;
 	}
 
 	image_loader = gth_image_preloader_get_loader (self->priv->preloader, gth_image_preloader_get_requested (self->priv->preloader));
-	if (image_loader == NULL)
+	if (image_loader == NULL) {
+		gth_viewer_page_file_loaded (GTH_VIEWER_PAGE (self), FALSE);
 		return;
+	}
 
 	if (GTK_WIDGET_VISIBLE (self->priv->viewer))
 		gth_viewer_page_focus (GTH_VIEWER_PAGE (self));
diff --git a/gthumb/gth-browser.c b/gthumb/gth-browser.c
index 8a6b617..cbba5e6 100644
--- a/gthumb/gth-browser.c
+++ b/gthumb/gth-browser.c
@@ -4265,10 +4265,54 @@ gth_browser_show_last_image (GthBrowser *browser,
 
 static void
 gth_viewer_page_file_loaded_cb (GthViewerPage *viewer_page,
+				gboolean       success,
+				gpointer       user_data);
+
+
+static void
+_gth_browser_set_current_viewer_page (GthBrowser    *browser,
+				      GthViewerPage *registered_viewer_page)
+{
+	if ((browser->priv->viewer_page != NULL) && (G_OBJECT_TYPE (registered_viewer_page) != G_OBJECT_TYPE (browser->priv->viewer_page))) {
+		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;
+	}
+	if (browser->priv->viewer_page == NULL) {
+		browser->priv->viewer_page = g_object_new (G_OBJECT_TYPE (registered_viewer_page), NULL);
+		gth_viewer_page_activate (browser->priv->viewer_page, browser);
+		gtk_ui_manager_ensure_update (browser->priv->ui);
+
+		g_signal_connect (browser->priv->viewer_page,
+				  "file-loaded",
+				  G_CALLBACK (gth_viewer_page_file_loaded_cb),
+				  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);
@@ -4299,7 +4343,7 @@ file_metadata_ready_cb (GList    *files,
 	if (browser->priv->viewer_page != NULL)
 		gth_viewer_page_view (browser->priv->viewer_page, file_data);
 	else
-		gth_viewer_page_file_loaded_cb (NULL, browser);
+		gth_viewer_page_file_loaded_cb (NULL, FALSE, browser);
 
 	if (browser->priv->location == NULL) {
 		GFile *parent;
@@ -4420,23 +4464,7 @@ _gth_browser_load_file (GthBrowser  *browser,
 		GthViewerPage *registered_viewer_page = scan->data;
 
 		if (gth_viewer_page_can_view (registered_viewer_page, browser->priv->current_file)) {
-			if ((browser->priv->viewer_page != NULL) && (G_OBJECT_TYPE (registered_viewer_page) != G_OBJECT_TYPE (browser->priv->viewer_page))) {
-				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;
-			}
-			if (browser->priv->viewer_page == NULL) {
-				browser->priv->viewer_page = g_object_new (G_OBJECT_TYPE (registered_viewer_page), NULL);
-				gth_viewer_page_activate (browser->priv->viewer_page, browser);
-				gtk_ui_manager_ensure_update (browser->priv->ui);
-
-				g_signal_connect (browser->priv->viewer_page,
-						  "file-loaded",
-						  G_CALLBACK (gth_viewer_page_file_loaded_cb),
-						  browser);
-			}
+			_gth_browser_set_current_viewer_page (browser, registered_viewer_page);
 			break;
 		}
 	}
diff --git a/gthumb/gth-thumb-loader.c b/gthumb/gth-thumb-loader.c
index de2bf20..8f587b0 100644
--- a/gthumb/gth-thumb-loader.c
+++ b/gthumb/gth-thumb-loader.c
@@ -97,8 +97,8 @@ gth_thumb_loader_finalize (GObject *object)
 	if (self->priv != NULL) {
 		g_free (self->priv->thumbnailer_tmpfile);
 		_g_object_unref (self->priv->pixbuf);
-		g_object_unref (self->priv->iloader);
-		g_object_unref (self->priv->file_data);
+		_g_object_unref (self->priv->iloader);
+		_g_object_unref (self->priv->file_data);
 		g_free (self->priv);
 		self->priv = NULL;
 	}
diff --git a/gthumb/gth-viewer-page.c b/gthumb/gth-viewer-page.c
index 023d254..b8a5bf6 100644
--- a/gthumb/gth-viewer-page.c
+++ b/gthumb/gth-viewer-page.c
@@ -45,9 +45,10 @@ gth_viewer_page_base_init (gpointer g_iface)
 	                          G_SIGNAL_RUN_LAST,
 	                          G_STRUCT_OFFSET (GthViewerPageIface, file_loaded),
 	                          NULL, NULL,
-	                          g_cclosure_marshal_VOID__VOID,
+	                          g_cclosure_marshal_VOID__BOOLEAN,
 	                          G_TYPE_NONE,
-	                          0);
+	                          1,
+	                          G_TYPE_BOOLEAN);
 
 	initialized = TRUE;
 }
@@ -190,7 +191,8 @@ gth_viewer_page_revert (GthViewerPage *self)
 
 
 void
-gth_viewer_page_file_loaded (GthViewerPage *self)
+gth_viewer_page_file_loaded (GthViewerPage *self,
+			     gboolean       success)
 {
-	g_signal_emit (self, gth_viewer_page_signals[FILE_LOADED], 0, NULL);
+	g_signal_emit (self, gth_viewer_page_signals[FILE_LOADED], 0, success);
 }
diff --git a/gthumb/gth-viewer-page.h b/gthumb/gth-viewer-page.h
index 7913aec..fb8f92a 100644
--- a/gthumb/gth-viewer-page.h
+++ b/gthumb/gth-viewer-page.h
@@ -74,7 +74,8 @@ struct _GthViewerPageIface {
 
 	/*< signals >*/
 
-	void      (*file_loaded)         (GthViewerPage *self);
+	void      (*file_loaded)         (GthViewerPage *self,
+					  gboolean       success);
 };
 
 GType        gth_viewer_page_get_type            (void);
@@ -102,7 +103,8 @@ void         gth_viewer_page_save_as             (GthViewerPage  *self,
 						  FileSavedFunc   func,
 						  gpointer        data);
 void         gth_viewer_page_revert              (GthViewerPage  *self);
-void         gth_viewer_page_file_loaded         (GthViewerPage  *self);
+void         gth_viewer_page_file_loaded         (GthViewerPage  *self,
+						  gboolean        success);
 
 G_END_DECLS
 



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