[gthumb] video viewer: added a loop button



commit 46748d4ab6184e662fda05d54fae365f0aa3ec29
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Tue Jul 4 15:30:21 2017 +0200

    video viewer: added a loop button

 extensions/gstreamer_tools/data/ui/mediabar.ui     |   25 ++++++-
 extensions/gstreamer_tools/gth-media-viewer-page.c |   74 +++++++++++++++-----
 2 files changed, 77 insertions(+), 22 deletions(-)
---
diff --git a/extensions/gstreamer_tools/data/ui/mediabar.ui b/extensions/gstreamer_tools/data/ui/mediabar.ui
index 36321f0..42c7c72 100644
--- a/extensions/gstreamer_tools/data/ui/mediabar.ui
+++ b/extensions/gstreamer_tools/data/ui/mediabar.ui
@@ -24,7 +24,6 @@
         <property name="spacing">6</property>
         <child>
           <object class="GtkButton" id="play_button">
-            <property name="use_action_appearance">False</property>
             <property name="visible">True</property>
             <property name="can_focus">True</property>
             <property name="receives_default">True</property>
@@ -46,7 +45,6 @@
         </child>
         <child>
           <object class="GtkButton" id="play_slower_button">
-            <property name="use_action_appearance">False</property>
             <property name="visible">True</property>
             <property name="can_focus">True</property>
             <property name="receives_default">True</property>
@@ -69,7 +67,6 @@
         </child>
         <child>
           <object class="GtkButton" id="play_faster_button">
-            <property name="use_action_appearance">False</property>
             <property name="visible">True</property>
             <property name="can_focus">True</property>
             <property name="receives_default">True</property>
@@ -90,6 +87,27 @@
             <property name="position">2</property>
           </packing>
         </child>
+        <child>
+          <object class="GtkToggleButton" id="loop_button">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="receives_default">True</property>
+            <property name="tooltip_text" translatable="yes">Restart when finished</property>
+            <property name="relief">none</property>
+            <child>
+              <object class="GtkImage">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="icon_name">view-refresh-symbolic</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">3</property>
+          </packing>
+        </child>
       </object>
       <packing>
         <property name="expand">False</property>
@@ -208,7 +226,6 @@
             <property name="receives_default">True</property>
             <property name="relief">none</property>
             <property name="orientation">vertical</property>
-            <property name="size">menu</property>
             <property name="adjustment">volume_adjustment</property>
             <property name="icons">audio-volume-muted-symbolic
 audio-volume-high-symbolic
diff --git a/extensions/gstreamer_tools/gth-media-viewer-page.c 
b/extensions/gstreamer_tools/gth-media-viewer-page.c
index eb0f529..8c3674a 100644
--- a/extensions/gstreamer_tools/gth-media-viewer-page.c
+++ b/extensions/gstreamer_tools/gth-media-viewer-page.c
@@ -57,6 +57,7 @@ struct _GthMediaViewerPagePrivate {
        gboolean        visible;
        gboolean        playing;
        gboolean        paused;
+       gboolean        loop;
        gint64          duration;
        int             video_fps_n;
        int             video_fps_d;
@@ -274,15 +275,6 @@ video_area_scroll_event_cb (GtkWidget             *widget,
 }
 
 
-static gboolean
-video_area_key_press_cb (GtkWidget          *widget,
-                        GdkEventKey        *event,
-                        GthMediaViewerPage *self)
-{
-       return gth_browser_viewer_key_press_cb (self->priv->browser, event);
-}
-
-
 static void
 volume_value_changed_cb (GtkAdjustment *adjustment,
                         gpointer       user_data)
@@ -513,6 +505,15 @@ play_faster_button_clicked_cb (GtkButton *button,
 }
 
 
+static void
+loop_button_clicked_cb (GtkButton *button,
+                       gpointer   user_data)
+{
+       GthMediaViewerPage *self = user_data;
+       self->priv->loop = ! self->priv->loop;
+}
+
+
 static gboolean
 update_volume_from_playbin (GthMediaViewerPage *self)
 {
@@ -664,10 +665,6 @@ gth_media_viewer_page_real_activate (GthViewerPage *base,
                          "scroll_event",
                          G_CALLBACK (video_area_scroll_event_cb),
                          self);
-       g_signal_connect (G_OBJECT (self->priv->audio_area),
-                         "key_press_event",
-                         G_CALLBACK (video_area_key_press_cb),
-                         self);
 
        /* mediabar */
 
@@ -683,6 +680,8 @@ gth_media_viewer_page_real_activate (GthViewerPage *base,
                                      "media-seek-forward-symbolic",
                                      GTK_ICON_SIZE_MENU);
 
+       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("loop_button")), self->priv->loop);
+
        g_signal_connect (GET_WIDGET ("volume_adjustment"),
                          "value-changed",
                          G_CALLBACK (volume_value_changed_cb),
@@ -703,6 +702,10 @@ gth_media_viewer_page_real_activate (GthViewerPage *base,
                          "clicked",
                          G_CALLBACK (play_faster_button_clicked_cb),
                          self);
+       g_signal_connect (GET_WIDGET ("loop_button"),
+                         "clicked",
+                         G_CALLBACK (loop_button_clicked_cb),
+                         self);
 
        self->priv->mediabar_revealer = gtk_revealer_new ();
        gtk_revealer_set_transition_type (GTK_REVEALER (self->priv->mediabar_revealer), 
GTK_REVEALER_TRANSITION_TYPE_SLIDE_UP);
@@ -853,6 +856,27 @@ update_stream_info (GthMediaViewerPage *self)
 }
 
 
+/*
+static char *
+state_description (GstState state)
+{
+       switch (state) {
+       case GST_STATE_VOID_PENDING:
+               return "void pending";
+       case GST_STATE_NULL:
+               return "null";
+       case GST_STATE_READY:
+               return "ready";
+       case GST_STATE_PAUSED:
+               return "paused";
+       case GST_STATE_PLAYING:
+               return "playing";
+       }
+       return "error";
+}
+*/
+
+
 static void
 bus_message_cb (GstBus     *bus,
                 GstMessage *message,
@@ -874,6 +898,13 @@ bus_message_cb (GstBus     *bus,
                if (old_state == new_state)
                        break;
 
+               /*
+               g_print ("old state: %s\n", state_description (old_state));
+               g_print ("new state: %s\n", state_description (new_state));
+               g_print ("pending state: %s\n", state_description (pending_state));
+               g_print ("\n");
+               */
+
                self->priv->paused = (new_state == GST_STATE_PAUSED);
                update_current_position_bar (self);
 
@@ -900,7 +931,17 @@ bus_message_cb (GstBus     *bus,
                break;
 
        case GST_MESSAGE_EOS:
-               reset_player_state (self);
+               if (self->priv->loop && self->priv->playing)
+                       gst_element_seek (self->priv->playbin,
+                                         self->priv->rate,
+                                         GST_FORMAT_TIME,
+                                         GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE,
+                                         GST_SEEK_TYPE_SET,
+                                         0.0,
+                                         GST_SEEK_TYPE_NONE,
+                                         0.0);
+               else
+                       reset_player_state (self);
                break;
 
        case GST_MESSAGE_BUFFERING: {
@@ -980,10 +1021,6 @@ create_playbin (GthMediaViewerPage *self)
                          "scroll_event",
                          G_CALLBACK (video_area_scroll_event_cb),
                          self);
-       g_signal_connect (G_OBJECT (self->priv->video_area),
-                         "key_press_event",
-                         G_CALLBACK (video_area_key_press_cb),
-                         self);
 
        gtk_stack_add_named (GTK_STACK (self->priv->area_box), self->priv->video_area, "video-area");
        gtk_widget_show (self->priv->video_area);
@@ -1314,6 +1351,7 @@ gth_media_viewer_page_init (GthMediaViewerPage *self)
        self->priv->background_painted = FALSE;
        self->priv->file_data = NULL;
        self->priv->updated_info = NULL;
+       self->priv->loop = FALSE;
 }
 
 


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