[gthumb/ext] show the file icon when the media has no video



commit 5b85c41ddd6ae04b4bee80958ed637c156c5238d
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Sat Nov 7 01:50:01 2009 +0100

    show the file icon when the media has no video
    
    moved the screenshot action in a separate file

 extensions/gstreamer/Makefile.am             |    2 +
 extensions/gstreamer/gth-media-viewer-page.c |  298 +++++++++++++-------------
 extensions/gstreamer/gth-media-viewer-page.h |   10 +-
 3 files changed, 158 insertions(+), 152 deletions(-)
---
diff --git a/extensions/gstreamer/Makefile.am b/extensions/gstreamer/Makefile.am
index 3b2b559..961274f 100644
--- a/extensions/gstreamer/Makefile.am
+++ b/extensions/gstreamer/Makefile.am
@@ -6,6 +6,8 @@ extensiondir = $(libdir)/gthumb-2.0/extensions
 extension_LTLIBRARIES = libgstreamer.la
 
 libgstreamer_la_SOURCES = 			\
+	actions.c				\
+	actions.h				\
 	gstreamer-utils.c			\
 	gstreamer-utils.h			\
 	gstscreenshot.c				\
diff --git a/extensions/gstreamer/gth-media-viewer-page.c b/extensions/gstreamer/gth-media-viewer-page.c
index d3caaa6..f2982a6 100644
--- a/extensions/gstreamer/gth-media-viewer-page.c
+++ b/extensions/gstreamer/gth-media-viewer-page.c
@@ -27,15 +27,14 @@
 #include <gst/gst.h>
 #include <gst/interfaces/xoverlay.h>
 #include <gthumb.h>
+#include "actions.h"
 #include "gstreamer-utils.h"
 #include "gth-media-viewer-page.h"
-#include "preferences.h"
 
 
 #define GTH_MEDIA_VIEWER_PAGE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTH_TYPE_MEDIA_VIEWER_PAGE, GthMediaViewerPagePrivate))
 #define GET_WIDGET(x) (_gtk_builder_get_widget (self->priv->builder, (x)))
 #define PROGRESS_DELAY 500
-#define MAX_ATTEMPTS 1024
 
 
 struct _GthMediaViewerPagePrivate {
@@ -49,7 +48,6 @@ struct _GthMediaViewerPagePrivate {
 	GtkWidget      *area_box;
 	gboolean        playing;
 	gboolean        paused;
-	gboolean        playing_before_screenshot;
 	gdouble         last_volume;
 	gint64          duration;
 	int             video_fps_n;
@@ -61,6 +59,8 @@ struct _GthMediaViewerPagePrivate {
 	GtkWidget      *mediabar;
 	GtkWidget      *fullscreen_toolbar;
 	gboolean        xwin_assigned;
+	GdkPixbuf      *icon;
+	PangoLayout    *caption_layout;
 };
 
 
@@ -83,177 +83,63 @@ static const char *media_viewer_ui_info =
 "</ui>";
 
 
-typedef struct {
-	GthMediaViewerPage *self;
-	GdkPixbuf          *pixbuf;
-	GthFileData        *file_data;
-} SaveData;
-
-
-static void
-save_date_free (SaveData *save_data)
-{
-	_g_object_unref (save_data->file_data);
-	_g_object_unref (save_data->pixbuf);
-	g_free (save_data);
-}
-
-
-static void
-screenshot_saved_cb (GthFileData *file_data,
-		     GError      *error,
-		     gpointer     user_data)
-{
-	SaveData           *save_data = user_data;
-	GthMediaViewerPage *self = save_data->self;
-
-	if (error != NULL)
-		_gtk_error_dialog_from_gerror_show (GTK_WINDOW (self->priv->browser), _("Could not save the file"), &error);
-	else if (self->priv->playing_before_screenshot)
-		gst_element_set_state (self->priv->playbin, GST_STATE_PLAYING);
-
-	save_date_free (save_data);
-}
+static GtkActionEntry media_viewer_action_entries[] = {
+	{ "MediaViewer_Screenshot", "camera-photo",
+	  N_("Screenshot"), NULL,
+	  N_("Take a screenshot"),
+	  G_CALLBACK (media_viewer_activate_action_screenshot) },
+};
 
 
 static void
-save_as_response_cb (GtkDialog  *file_sel,
-		     int         response,
-		     SaveData   *save_data)
+_gth_media_viewer_page_update_caption (GthMediaViewerPage *self)
 {
-	GFile       *file;
-	GFile       *folder;
-	char        *folder_uri;
-	const char  *mime_type;
-
-	if (response != GTK_RESPONSE_OK) {
-		GthMediaViewerPage *self = save_data->self;
-
-		if (self->priv->playing_before_screenshot)
-			gst_element_set_state (self->priv->playbin, GST_STATE_PLAYING);
-		save_date_free (save_data);
-		gtk_widget_destroy (GTK_WIDGET (file_sel));
+	if (self->priv->caption_layout == NULL)
 		return;
-	}
 
-	if (! gth_file_chooser_dialog_get_file (GTH_FILE_CHOOSER_DIALOG (file_sel), &file, &mime_type))
-		return;
+	if (self->priv->file_data != NULL) {
+		const char  *text;
+		GthMetadata *metadata;
 
-	folder = g_file_get_parent (file);
-	folder_uri = g_file_get_uri (folder);
-	eel_gconf_set_string (PREF_GSTREAMER_SCREESHOT_LOCATION, folder_uri);
-
-	save_data->file_data = gth_file_data_new (file, NULL);
-	gth_file_data_set_mime_type (save_data->file_data, mime_type);
-	_gdk_pixbuf_save_async (save_data->pixbuf,
-				save_data->file_data,
-				mime_type,
-				screenshot_saved_cb,
-				save_data);
+		text = NULL;
+		metadata = (GthMetadata *) g_file_info_get_attribute_object (self->priv->file_data->info, "audio-video::general::title");
+		if (metadata != NULL)
+			text = gth_metadata_get_formatted (metadata);
+		else
+			text = g_file_info_get_display_name (self->priv->file_data->info);
 
-	gtk_widget_destroy (GTK_WIDGET (file_sel));
+		if (text != NULL)
+			pango_layout_set_text (self->priv->caption_layout, text, -1);
+	}
+	else
+		pango_layout_set_text (self->priv->caption_layout, "", -1);
 
-	g_free (folder_uri);
-	g_object_unref (folder);
-	g_object_unref (file);
+	gtk_widget_queue_draw (GTK_WIDGET (self->priv->area));
 }
 
 
 static void
-screenshot_ready_cb (GdkPixbuf *pixbuf,
-		     gpointer   user_data)
+video_area_realize_cb (GtkWidget *widget,
+		       gpointer   user_data)
 {
 	GthMediaViewerPage *self = user_data;
-	SaveData           *save_data;
-	GtkWidget          *file_sel;
 
-	if (pixbuf == NULL) {
-		_gtk_error_dialog_from_gerror_show (GTK_WINDOW (self->priv->browser), _("Could not take a screenshot"), NULL);
-		return;
-	}
-
-	save_data = g_new0 (SaveData, 1);
-	save_data->self = self;
-	save_data->pixbuf = pixbuf;
-
-	file_sel = gth_file_chooser_dialog_new (_("Save Image"), GTK_WINDOW (self->priv->browser), "pixbuf-saver");
-
-	{
-		char   *last_uri;
-		GFile  *last_folder;
-		char   *prefix;
-		char   *display_name;
-		int     attempt;
-
-		last_uri = eel_gconf_get_string (PREF_GSTREAMER_SCREESHOT_LOCATION, "~");
-		if ((last_uri == NULL) || (strcmp (last_uri, "~") == 0))
-			last_folder = g_file_new_for_path (g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP));
-		else
-			last_folder = g_file_new_for_uri (last_uri);
-		gtk_file_chooser_set_current_folder_file (GTK_FILE_CHOOSER (file_sel), last_folder, NULL);
-
-		prefix = _g_utf8_remove_extension (g_file_info_get_display_name (self->priv->file_data->info));
-		if (prefix == NULL)
-			prefix = g_strdup (C_("Filename", "Screenshot"));
-		display_name = NULL;
-		for (attempt = 1; attempt < MAX_ATTEMPTS; attempt++) {
-			GFile *proposed_file;
-
-			g_free (display_name);
-
-			display_name = g_strdup_printf ("%s-%02d.jpeg", prefix, attempt);
-			proposed_file = g_file_get_child_for_display_name (last_folder, display_name, NULL);
-			if ((proposed_file != NULL) && ! g_file_query_exists (proposed_file, NULL)) {
-				g_object_unref (proposed_file);
-				break;
-			}
-		}
-
-		if (display_name != NULL) {
-			gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (file_sel), display_name);
-			g_free (display_name);
-		}
-
-		g_free (prefix);
-		g_object_unref (last_folder);
-		g_free (last_uri);
-	}
-
-	g_signal_connect (GTK_DIALOG (file_sel),
-			  "response",
-			  G_CALLBACK (save_as_response_cb),
-			  save_data);
-
-	gtk_widget_show (file_sel);
+	self->priv->caption_layout = gtk_widget_create_pango_layout (widget, "");
+	_gth_media_viewer_page_update_caption (self);
 }
 
 
 static void
-media_viewer_activate_action_screenshot (GtkAction          *action,
-				         GthMediaViewerPage *self)
+video_area_unrealize_cb (GtkWidget *widget,
+			 gpointer   user_data)
 {
-	if (self->priv->playbin == NULL)
-		return;
+	GthMediaViewerPage *self = user_data;
 
-	self->priv->playing_before_screenshot = self->priv->playing;
-	if (self->priv->playing)
-		gst_element_set_state (self->priv->playbin, GST_STATE_PAUSED);
-	_gst_playbin_get_current_frame (self->priv->playbin,
-					self->priv->video_fps_n,
-					self->priv->video_fps_d,
-					screenshot_ready_cb,
-					self);
+	g_object_unref (self->priv->caption_layout);
+	self->priv->caption_layout = NULL;
 }
 
 
-static GtkActionEntry media_viewer_action_entries[] = {
-	{ "MediaViewer_Screenshot", "camera-photo",
-	  N_("Screenshot"), NULL,
-	  N_("Take a screenshot"),
-	  G_CALLBACK (media_viewer_activate_action_screenshot) },
-};
-
-
 static gboolean
 video_area_expose_event_cb (GtkWidget      *widget,
 			    GdkEventExpose *event,
@@ -267,14 +153,64 @@ video_area_expose_event_cb (GtkWidget      *widget,
 	if (self->priv->xwin_assigned && self->priv->has_video)
 		return FALSE;
 
+	if (self->priv->icon == NULL) {
+		char  *type;
+		GIcon *icon;
+		int    size;
+
+		type = NULL;
+		if (self->priv->file_data != NULL)
+			type = g_content_type_from_mime_type (gth_file_data_get_mime_type (self->priv->file_data));
+		if (type == NULL)
+			type = g_content_type_from_mime_type ("text/plain");
+		icon = g_content_type_get_icon (type);
+		size = widget->allocation.width;
+		if (size > widget->allocation.height)
+			size = widget->allocation.height;
+		size = size / 3;
+		self->priv->icon = _g_icon_get_pixbuf (icon, size, gtk_icon_theme_get_for_screen (gtk_widget_get_screen (widget)));
+
+		g_object_unref (icon);
+		g_free (type);
+	}
+
 	gdk_draw_rectangle (gtk_widget_get_window (widget),
-			    widget->style->black_gc,
+			    self->priv->has_video ? widget->style->black_gc : widget->style->text_gc[GTK_WIDGET_STATE (widget)],
 			    TRUE,
 			    event->area.x,
 			    event->area.y,
 			    event->area.width,
 			    event->area.height);
 
+	if (self->priv->icon != NULL) {
+		int            icon_w, icon_h;
+		int            icon_x, icon_y;
+		PangoRectangle logical_rect;
+		int            x, y;
+
+		icon_w = gdk_pixbuf_get_width (self->priv->icon);
+		icon_h = gdk_pixbuf_get_height (self->priv->icon);
+		pango_layout_set_width (self->priv->caption_layout, PANGO_SCALE * (icon_w * 3 / 2));
+		pango_layout_get_extents (self->priv->caption_layout, NULL, &logical_rect);
+		icon_x = (widget->allocation.width - icon_w) / 2;
+		x = (widget->allocation.width - PANGO_PIXELS (logical_rect.width)) / 2 + PANGO_PIXELS (logical_rect.x);
+		icon_y = (widget->allocation.height - (icon_h + PANGO_PIXELS (logical_rect.height))) / 2;
+		y = icon_y + icon_h;
+
+		gdk_draw_pixbuf (gtk_widget_get_window (widget),
+				 widget->style->base_gc[GTK_WIDGET_STATE (widget)],
+				 self->priv->icon,
+				 0, 0,
+				 icon_x, icon_y,
+				 icon_w, icon_h,
+				 GDK_RGB_DITHER_NORMAL,
+				 0, 0);
+		gdk_draw_layout (gtk_widget_get_window (widget),
+				 widget->style->base_gc[GTK_WIDGET_STATE (widget)],
+				 x, y,
+				 self->priv->caption_layout);
+	}
+
 	return FALSE;
 }
 
@@ -597,6 +533,14 @@ gth_media_viewer_page_real_activate (GthViewerPage *base,
 	gtk_box_pack_start (GTK_BOX (self->priv->area_box), self->priv->area, TRUE, TRUE, 0);
 
 	g_signal_connect (G_OBJECT (self->priv->area),
+			  "realize",
+			  G_CALLBACK (video_area_realize_cb),
+			  self);
+	g_signal_connect (G_OBJECT (self->priv->area),
+			  "unrealize",
+			  G_CALLBACK (video_area_unrealize_cb),
+			  self);
+	g_signal_connect (G_OBJECT (self->priv->area),
 			  "expose_event",
 			  G_CALLBACK (video_area_expose_event_cb),
 			  self);
@@ -697,7 +641,6 @@ reset_player_state (GthMediaViewerPage *self)
                 self->priv->update_progress_id = 0;
         }
 
-        /*self->priv->playing = TRUE;*/
 	update_play_button (self, GST_STATE_NULL);
 	self->priv->playing = FALSE;
 	self->priv->rate = 1.0;
@@ -857,6 +800,7 @@ gth_media_viewer_page_real_show (GthViewerPage *base)
 		return;
 
 	self->priv->playbin = gst_element_factory_make ("playbin", "playbin");
+	g_object_set (self->priv->playbin, "vis-plugin", gst_element_factory_make ("gloom", "vis"), NULL);
 	g_signal_connect (self->priv->playbin, "notify::volume", G_CALLBACK (playbin_notify_volume_cb), self);
 
 	bus = gst_pipeline_get_bus (GST_PIPELINE (self->priv->playbin));
@@ -936,10 +880,20 @@ gth_media_viewer_page_real_view (GthViewerPage *base,
 		return;
 	}
 
+	/**/
+
 	_g_object_unref (self->priv->file_data);
 	self->priv->file_data = gth_file_data_dup (file_data);
 
 	self->priv->duration = 0;
+
+	_g_object_unref (self->priv->icon);
+	self->priv->icon = NULL;
+
+	_gth_media_viewer_page_update_caption (self);
+
+	/**/
+
 	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);
@@ -1103,6 +1057,7 @@ gth_media_viewer_page_finalize (GObject *obj)
 		gst_object_unref (GST_OBJECT (self->priv->playbin));
 		self->priv->playbin = NULL;
 	}
+	_g_object_unref (self->priv->icon);
 	_g_object_unref (self->priv->file_data);
 
 	G_OBJECT_CLASS (gth_media_viewer_page_parent_class)->finalize (obj);
@@ -1149,6 +1104,7 @@ gth_media_viewer_page_instance_init (GthMediaViewerPage *self)
 	self->priv->has_audio = FALSE;
 	self->priv->video_fps_n = 0;
 	self->priv->video_fps_d = 0;
+	self->priv->icon = NULL;
 }
 
 
@@ -1178,3 +1134,43 @@ gth_media_viewer_page_get_type (void) {
 	}
 	return gth_media_viewer_page_type_id;
 }
+
+
+GthBrowser *
+gth_media_viewer_page_get_browser (GthMediaViewerPage *self)
+{
+	return self->priv->browser;
+}
+
+
+GstElement *
+gth_media_viewer_page_get_playbin (GthMediaViewerPage *self)
+{
+	return self->priv->playbin;
+}
+
+
+gboolean
+gth_media_viewer_page_is_playing (GthMediaViewerPage *self)
+{
+	return self->priv->playing;
+}
+
+
+void
+gth_media_viewer_page_get_video_fps (GthMediaViewerPage *self,
+				     int                *video_fps_n,
+				     int                *video_fps_d)
+{
+	if (video_fps_n != NULL)
+		*video_fps_n = self->priv->video_fps_n;
+	if (video_fps_d != NULL)
+		*video_fps_d = self->priv->video_fps_d;
+}
+
+
+GthFileData *
+gth_media_viewer_page_get_file_data (GthMediaViewerPage *self)
+{
+	return self->priv->file_data;
+}
diff --git a/extensions/gstreamer/gth-media-viewer-page.h b/extensions/gstreamer/gth-media-viewer-page.h
index 59392dc..942a45a 100644
--- a/extensions/gstreamer/gth-media-viewer-page.h
+++ b/extensions/gstreamer/gth-media-viewer-page.h
@@ -23,6 +23,7 @@
 #ifndef GTH_MEDIA_VIEWER_PAGE_H
 #define GTH_MEDIA_VIEWER_PAGE_H
 
+#include <gst/gst.h>
 #include <gthumb.h>
 
 G_BEGIN_DECLS
@@ -47,7 +48,14 @@ struct _GthMediaViewerPageClass {
 	GObjectClass parent_class;
 };
 
-GType  gth_media_viewer_page_get_type (void);
+GType          gth_media_viewer_page_get_type      (void);
+GthBrowser *   gth_media_viewer_page_get_browser    (GthMediaViewerPage *self);
+GstElement *   gth_media_viewer_page_get_playbin    (GthMediaViewerPage *self);
+gboolean       gth_media_viewer_page_is_playing     (GthMediaViewerPage *self);
+void           gth_media_viewer_page_get_video_fps  (GthMediaViewerPage *self,
+						     int                *video_fps_n,
+						     int                *video_fps_d);
+GthFileData * gth_media_viewer_page_get_file_data   (GthMediaViewerPage *self);
 
 G_END_DECLS
 



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