[gthumb] display the video speed in the status bar
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] display the video speed in the status bar
- Date: Fri, 13 Aug 2010 13:55:26 +0000 (UTC)
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]