[gthumb] display the video speed in the status bar



commit 16178b579b3232f55ffea82a317bf70ff5ce8810
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Fri Aug 13 15:55:08 2010 +0200

    display the video speed in the status bar
    
    display the video speed in the status bar and allow to change speed from 0.03 to 36.0
    
    [bug #624454]

 extensions/gstreamer_tools/gth-media-viewer-page.c |   91 +++++++++++++++++---
 gthumb/gth-browser.c                               |   48 +++++++---
 gthumb/gth-browser.h                               |    2 +
 3 files changed, 114 insertions(+), 27 deletions(-)
---
diff --git a/extensions/gstreamer_tools/gth-media-viewer-page.c b/extensions/gstreamer_tools/gth-media-viewer-page.c
index e7a046e..b8f4dd7 100644
--- a/extensions/gstreamer_tools/gth-media-viewer-page.c
+++ b/extensions/gstreamer_tools/gth-media-viewer-page.c
@@ -67,6 +67,7 @@ struct _GthMediaViewerPagePrivate {
 
 
 static gpointer gth_media_viewer_page_parent_class = NULL;
+static double default_rates[] = { 0.03, 0.06, 0.12, 0.25, 0.33, 0.50, 0.66, 1.0, 1.50, 2.0, 3.0, 4.0, 8.0, 16.0, 32.0 };
 
 
 static const char *media_viewer_ui_info =
@@ -360,10 +361,14 @@ position_value_changed_cb (GtkAdjustment *adjustment,
 		return;
 
 	current_value = (gint64) (gtk_adjustment_get_value (adjustment) / 100.0 * self->priv->duration);
-	if (! gst_element_seek_simple (self->priv->playbin,
-				       GST_FORMAT_TIME,
-				       GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT,
-				       current_value))
+	if (! gst_element_seek (self->priv->playbin,
+				self->priv->rate,
+			        GST_FORMAT_TIME,
+			        GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT,
+			        GST_SEEK_TYPE_SET,
+			        current_value,
+			        GST_SEEK_TYPE_NONE,
+			        0.0))
 	{
 		g_warning ("seek failed");
 	}
@@ -416,24 +421,47 @@ hscale_position_button_release_event_cb (GtkWidget      *widget,
 
 
 static void
+update_playback_info (GthMediaViewerPage *self)
+{
+	char *playback_info;
+
+	if (self->priv->playing)
+		playback_info = g_strdup_printf (">%2.2f", self->priv->rate);
+	else
+		playback_info = g_strdup ("||");
+	g_file_info_set_attribute_string (gth_browser_get_current_file (self->priv->browser)->info, "gthumb::statusbar-extra-info", playback_info);
+	gth_browser_update_statusbar_file_info (self->priv->browser);
+
+	g_free (playback_info);
+}
+
+
+static void
 update_player_rate (GthMediaViewerPage *self)
 {
-	self->priv->rate = CLAMP (self->priv->rate, 0.25, 2.0);
+	gint64 current_value;
+
+	self->priv->rate = CLAMP (self->priv->rate,
+				  default_rates[0],
+				  default_rates[G_N_ELEMENTS (default_rates) - 1]);
 
 	if (self->priv->playbin == NULL)
 		return;
 
+	update_playback_info (self);
+
 	if (! self->priv->playing)
 		return;
 
+	current_value = (gint64) (gtk_adjustment_get_value (GTK_ADJUSTMENT (GET_WIDGET ("adjustment_position"))) / 100.0 * self->priv->duration);
 	if (! gst_element_seek (self->priv->playbin,
 				self->priv->rate,
-				GST_FORMAT_TIME,
-				(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE),
-				GST_SEEK_TYPE_NONE,
-				0.0,
-				GST_SEEK_TYPE_NONE,
-				0.0))
+			        GST_FORMAT_TIME,
+			        GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE,
+			        GST_SEEK_TYPE_SET,
+			        current_value,
+			        GST_SEEK_TYPE_NONE,
+			        0.0))
 	{
 		g_warning ("seek failed");
 	}
@@ -478,13 +506,40 @@ togglebutton_volume_toggled_cb (GtkToggleButton *button,
 }
 
 
+static int
+get_nearest_rate (double rate)
+{
+	int    min_idx = -1;
+	double min_delta;
+	int    i;
+
+	for (i = 0; i < G_N_ELEMENTS (default_rates); i++) {
+		double delta;
+
+		delta = fabs (default_rates[i] - rate);
+		if ((i == 0) || (delta < min_delta)) {
+			min_delta = delta;
+			min_idx = i;
+		}
+	}
+
+	return min_idx;
+}
+
+
 static void
 button_play_slower_clicked_cb (GtkButton *button,
 			       gpointer   user_data)
 {
 	GthMediaViewerPage *self = user_data;
+	int                 i;
+
+	i = get_nearest_rate (self->priv->rate);
+	if (i > 0)
+		self->priv->rate = default_rates[i - 1];
+	else
+		self->priv->rate = default_rates[0];
 
-	self->priv->rate -= 0.25;
 	update_player_rate (self);
 }
 
@@ -494,8 +549,14 @@ button_play_faster_clicked_cb (GtkButton *button,
 			       gpointer   user_data)
 {
 	GthMediaViewerPage *self = user_data;
+	int                 i;
+
+	i = get_nearest_rate (self->priv->rate);
+	if (i < G_N_ELEMENTS (default_rates) - 1)
+		self->priv->rate = default_rates[i + 1];
+	else
+		self->priv->rate = default_rates[G_N_ELEMENTS (default_rates) - 1];
 
-	self->priv->rate += 0.25;
 	update_player_rate (self);
 }
 
@@ -553,6 +614,8 @@ update_play_button (GthMediaViewerPage *self,
 
 		if (self->priv->update_progress_id == 0)
 			self->priv->update_progress_id = gdk_threads_add_timeout (PROGRESS_DELAY, update_progress_cb, self);
+
+		update_playback_info (self);
 	}
 	else if (self->priv->playing && (new_state != GST_STATE_PLAYING)) {
 		self->priv->playing = FALSE;
@@ -563,6 +626,8 @@ update_play_button (GthMediaViewerPage *self,
 			 g_source_remove (self->priv->update_progress_id);
 			 self->priv->update_progress_id = 0;
 		}
+
+		update_playback_info (self);
 	}
 
 	gth_viewer_page_update_sensitivity (GTH_VIEWER_PAGE (self));
diff --git a/gthumb/gth-browser.c b/gthumb/gth-browser.c
index e8d8c4c..19f4fa4 100644
--- a/gthumb/gth-browser.c
+++ b/gthumb/gth-browser.c
@@ -74,6 +74,7 @@
 #define UPDATE_SELECTION_DELAY 200
 #define MIN_SIDEBAR_SIZE 100
 #define MIN_VIEWER_SIZE 256
+#define STATUSBAR_SEPARATOR " · "
 
 typedef void (*GthBrowserCallback) (GthBrowser *, gboolean cancelled, gpointer user_data);
 
@@ -2982,14 +2983,15 @@ file_renamed_cb (GthMonitor *monitor,
 }
 
 
-static void
-_gth_browser_update_statusbar_file_info (GthBrowser *browser)
+void
+gth_browser_update_statusbar_file_info (GthBrowser *browser)
 {
+	const char  *extra_info;
 	const char  *image_size;
 	const char  *file_date;
 	const char  *file_size;
 	GthMetadata *metadata;
-	char        *text;
+	GString     *status;
 
 	if (browser->priv->current_file == NULL) {
 		gth_statusbar_set_primary_text (GTH_STATUSBAR (browser->priv->statusbar), "");
@@ -2997,6 +2999,7 @@ _gth_browser_update_statusbar_file_info (GthBrowser *browser)
 		return;
 	}
 
+	extra_info = g_file_info_get_attribute_string (browser->priv->current_file->info, "gthumb::statusbar-extra-info");
 	image_size = g_file_info_get_attribute_string (browser->priv->current_file->info, "general::dimensions");
 	metadata = (GthMetadata *) g_file_info_get_attribute_object (browser->priv->current_file->info, "general::datetime");
 	if (metadata != NULL)
@@ -3005,16 +3008,33 @@ _gth_browser_update_statusbar_file_info (GthBrowser *browser)
 		file_date = g_file_info_get_attribute_string (browser->priv->current_file->info, "gth::file::display-mtime");
 	file_size = g_file_info_get_attribute_string (browser->priv->current_file->info, "gth::file::display-size");
 
-	if (gth_browser_get_file_modified (browser))
-		text = g_strdup_printf ("%s - %s", image_size, _("Modified"));
-	else if (image_size != NULL)
-		text = g_strdup_printf ("%s - %s - %s",	image_size, file_size, file_date);
-	else
-		text = g_strdup_printf ("%s - %s", file_size, file_date);
+	status = g_string_new ("");
 
-	gth_statusbar_set_primary_text (GTH_STATUSBAR (browser->priv->statusbar), text);
+	if (extra_info != NULL)
+		g_string_append (status, extra_info);
 
-	g_free (text);
+	if (image_size != NULL) {
+		if (status->len > 0)
+			g_string_append (status, STATUSBAR_SEPARATOR);
+		g_string_append (status, image_size);
+	}
+
+	if (gth_browser_get_file_modified (browser)) {
+		if (status->len > 0)
+			g_string_append (status, STATUSBAR_SEPARATOR);
+		g_string_append (status, _("Modified"));
+	}
+	else {
+		if (status->len > 0)
+			g_string_append (status, STATUSBAR_SEPARATOR);
+		g_string_append (status, file_size);
+		g_string_append (status, STATUSBAR_SEPARATOR);
+		g_string_append (status, file_date);
+	}
+
+	gth_statusbar_set_primary_text (GTH_STATUSBAR (browser->priv->statusbar), status->str);
+
+	g_string_free (status, TRUE);
 }
 
 
@@ -3037,7 +3057,7 @@ metadata_changed_cb (GthMonitor  *monitor,
 		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_statusbar_file_info (browser);
 		gth_browser_update_title (browser);
 		gth_browser_update_sensitivity (browser);
 	}
@@ -5102,7 +5122,7 @@ gth_viewer_page_file_loaded_cb (GthViewerPage *viewer_page,
 	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);
+	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);
 	gth_browser_update_sensitivity (browser);
@@ -5202,7 +5222,7 @@ _gth_browser_load_file (GthBrowser  *browser,
 
 		gtk_widget_hide (browser->priv->file_properties);
 
-		_gth_browser_update_statusbar_file_info (browser);
+		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 2f8d7cb..8cf7cc1 100644
--- a/gthumb/gth-browser.h
+++ b/gthumb/gth-browser.h
@@ -152,6 +152,8 @@ void             gth_browser_load_file              (GthBrowser       *browser,
 void             gth_browser_update_title           (GthBrowser       *browser);
 void             gth_browser_update_sensitivity     (GthBrowser       *browser);
 void             gth_browser_update_extra_widget    (GthBrowser       *browser);
+void             gth_browser_update_statusbar_file_info
+						    (GthBrowser       *browser);
 void             gth_browser_show_viewer_properties (GthBrowser       *browser,
 						     gboolean          show);
 void             gth_browser_show_viewer_tools      (GthBrowser       *browser,



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