[gthumb] media viewer: show the pointed time when hovering over the progress bar



commit 80f9140d4494761dd7e955222dccdeb01a0b220c
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Sun Nov 29 10:05:33 2020 +0100

    media viewer: show the pointed time when hovering over the progress bar

 extensions/gstreamer_tools/data/ui/mediabar.ui     | 237 +++++++++++----------
 extensions/gstreamer_tools/gth-media-viewer-page.c |  79 +++++++
 2 files changed, 205 insertions(+), 111 deletions(-)
---
diff --git a/extensions/gstreamer_tools/data/ui/mediabar.ui b/extensions/gstreamer_tools/data/ui/mediabar.ui
index 064581b7..d4314d12 100644
--- a/extensions/gstreamer_tools/data/ui/mediabar.ui
+++ b/extensions/gstreamer_tools/data/ui/mediabar.ui
@@ -1,37 +1,37 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.36.0 -->
+<!-- Generated with glade 3.38.1 -->
 <interface>
   <requires lib="gtk+" version="3.16"/>
   <object class="GtkAdjustment" id="position_adjustment">
     <property name="upper">100</property>
-    <property name="step_increment">1</property>
-    <property name="page_increment">10</property>
+    <property name="step-increment">1</property>
+    <property name="page-increment">10</property>
   </object>
   <object class="GtkAdjustment" id="volume_adjustment">
     <property name="upper">100</property>
     <property name="value">100</property>
-    <property name="page_increment">5</property>
+    <property name="page-increment">5</property>
   </object>
   <object class="GtkBox" id="mediabar">
     <property name="visible">True</property>
-    <property name="can_focus">False</property>
+    <property name="can-focus">False</property>
     <property name="spacing">34</property>
     <child>
       <object class="GtkBox" id="box2">
         <property name="visible">True</property>
-        <property name="can_focus">False</property>
+        <property name="can-focus">False</property>
         <property name="spacing">6</property>
         <child>
           <object class="GtkButton" id="play_button">
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
-            <property name="tooltip_text" translatable="yes">Play</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">True</property>
+            <property name="tooltip-text" translatable="yes">Play</property>
             <property name="relief">none</property>
             <child>
               <object class="GtkImage" id="play_button_image">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
+                <property name="can-focus">False</property>
                 <property name="icon_size">2</property>
               </object>
             </child>
@@ -45,15 +45,15 @@
         <child>
           <object class="GtkButton" id="play_slower_button">
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
-            <property name="tooltip_text" translatable="yes">Slower</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">True</property>
+            <property name="tooltip-text" translatable="yes">Slower</property>
             <property name="relief">none</property>
             <child>
               <object class="GtkImage" id="play_slower_image">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="icon_name">media-seek-backward-symbolic</property>
+                <property name="can-focus">False</property>
+                <property name="icon-name">media-seek-backward-symbolic</property>
                 <property name="icon_size">1</property>
               </object>
             </child>
@@ -67,15 +67,15 @@
         <child>
           <object class="GtkButton" id="play_faster_button">
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
-            <property name="tooltip_text" translatable="yes">Faster</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">True</property>
+            <property name="tooltip-text" translatable="yes">Faster</property>
             <property name="relief">none</property>
             <child>
               <object class="GtkImage" id="play_faster_image">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="icon_name">media-seek-forward-symbolic</property>
+                <property name="can-focus">False</property>
+                <property name="icon-name">media-seek-forward-symbolic</property>
                 <property name="icon_size">1</property>
               </object>
             </child>
@@ -89,15 +89,15 @@
         <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="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>
+                <property name="can-focus">False</property>
+                <property name="icon-name">view-refresh-symbolic</property>
               </object>
             </child>
           </object>
@@ -117,16 +117,16 @@
     <child>
       <object class="GtkBox" id="box3">
         <property name="visible">True</property>
-        <property name="can_focus">False</property>
+        <property name="can-focus">False</property>
         <property name="spacing">6</property>
         <child>
           <object class="GtkBox" id="box4">
             <property name="visible">True</property>
-            <property name="can_focus">False</property>
+            <property name="can-focus">False</property>
             <child>
               <object class="GtkLabel" id="label1">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
+                <property name="can-focus">False</property>
                 <property name="label" translatable="yes">Time:</property>
               </object>
               <packing>
@@ -137,12 +137,12 @@
             </child>
             <child>
               <object class="GtkScale" id="position_scale">
-                <property name="width_request">180</property>
+                <property name="width-request">180</property>
                 <property name="visible">True</property>
-                <property name="can_focus">True</property>
+                <property name="can-focus">True</property>
                 <property name="adjustment">position_adjustment</property>
-                <property name="round_digits">1</property>
-                <property name="draw_value">False</property>
+                <property name="round-digits">1</property>
+                <property name="draw-value">False</property>
               </object>
               <packing>
                 <property name="expand">True</property>
@@ -160,18 +160,18 @@
         <child>
           <object class="GtkToggleButton" id="position_button">
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">True</property>
             <property name="relief">none</property>
             <child>
               <object class="GtkBox" id="position_box">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
+                <property name="can-focus">False</property>
                 <property name="spacing">2</property>
                 <child>
                   <object class="GtkLabel" id="label_position">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
+                    <property name="can-focus">False</property>
                     <property name="label">--:--</property>
                   </object>
                   <packing>
@@ -183,7 +183,7 @@
                 <child>
                   <object class="GtkLabel" id="label3">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
+                    <property name="can-focus">False</property>
                     <property name="label">/</property>
                   </object>
                   <packing>
@@ -195,7 +195,7 @@
                 <child>
                   <object class="GtkLabel" id="label_duration">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
+                    <property name="can-focus">False</property>
                     <property name="label">--∶--</property>
                   </object>
                   <packing>
@@ -223,14 +223,14 @@
     <child>
       <object class="GtkBox" id="volume_box">
         <property name="visible">True</property>
-        <property name="can_focus">False</property>
+        <property name="can-focus">False</property>
         <property name="spacing">6</property>
         <child>
           <object class="GtkVolumeButton" id="volumebutton">
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="focus_on_click">False</property>
-            <property name="receives_default">True</property>
+            <property name="can-focus">True</property>
+            <property name="focus-on-click">False</property>
+            <property name="receives-default">True</property>
             <property name="relief">none</property>
             <property name="orientation">vertical</property>
             <property name="adjustment">volume_adjustment</property>
@@ -241,16 +241,16 @@ audio-volume-medium-symbolic</property>
             <child internal-child="plus_button">
               <object class="GtkButton" id="volumebutton-plus_button1">
                 <property name="label" translatable="yes">+</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
+                <property name="can-focus">True</property>
+                <property name="receives-default">True</property>
                 <property name="relief">none</property>
               </object>
             </child>
             <child internal-child="minus_button">
               <object class="GtkButton" id="volumebutton-minus_button1">
                 <property name="label" translatable="yes">-</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
+                <property name="can-focus">True</property>
+                <property name="receives-default">True</property>
                 <property name="relief">none</property>
               </object>
             </child>
@@ -274,20 +274,21 @@ audio-volume-medium-symbolic</property>
     </style>
   </object>
   <object class="GtkPopover" id="position_popover">
-    <property name="can_focus">False</property>
-    <property name="relative_to">position_button</property>
+    <property name="can-focus">False</property>
+    <property name="relative-to">position_button</property>
     <child>
+      <!-- n-columns=6 n-rows=3 -->
       <object class="GtkGrid">
         <property name="visible">True</property>
-        <property name="can_focus">False</property>
+        <property name="can-focus">False</property>
         <child>
           <object class="GtkSeparator">
             <property name="visible">True</property>
-            <property name="can_focus">False</property>
+            <property name="can-focus">False</property>
           </object>
           <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">1</property>
+            <property name="left-attach">0</property>
+            <property name="top-attach">1</property>
             <property name="width">5</property>
           </packing>
         </child>
@@ -295,132 +296,132 @@ audio-volume-medium-symbolic</property>
           <object class="GtkButton" id="skip_back_smaller_button">
             <property name="label" translatable="yes" comments="minus 5 seconds">-5s</property>
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
-            <property name="tooltip_text" translatable="yes">Go back 5 seconds</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">True</property>
+            <property name="tooltip-text" translatable="yes">Go back 5 seconds</property>
             <property name="relief">none</property>
           </object>
           <packing>
-            <property name="left_attach">1</property>
-            <property name="top_attach">0</property>
+            <property name="left-attach">1</property>
+            <property name="top-attach">0</property>
           </packing>
         </child>
         <child>
           <object class="GtkButton" id="skip_back_small_button">
             <property name="label" translatable="yes" comments="minus 10 seconds">-10s</property>
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
-            <property name="tooltip_text" translatable="yes">Go back 10 seconds</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">True</property>
+            <property name="tooltip-text" translatable="yes">Go back 10 seconds</property>
             <property name="relief">none</property>
           </object>
           <packing>
-            <property name="left_attach">2</property>
-            <property name="top_attach">0</property>
+            <property name="left-attach">2</property>
+            <property name="top-attach">0</property>
           </packing>
         </child>
         <child>
           <object class="GtkButton" id="skip_back_big_button">
             <property name="label" translatable="yes" comments="minus 1 minute">-1m</property>
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
-            <property name="tooltip_text" translatable="yes">Go back 1 minute</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">True</property>
+            <property name="tooltip-text" translatable="yes">Go back 1 minute</property>
             <property name="relief">none</property>
           </object>
           <packing>
-            <property name="left_attach">3</property>
-            <property name="top_attach">0</property>
+            <property name="left-attach">3</property>
+            <property name="top-attach">0</property>
           </packing>
         </child>
         <child>
           <object class="GtkButton" id="skip_back_bigger_button">
             <property name="label" translatable="yes" comments="minus 5 minutes">-5m</property>
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
-            <property name="tooltip_text" translatable="yes">Go back 5 minutes</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">True</property>
+            <property name="tooltip-text" translatable="yes">Go back 5 minutes</property>
             <property name="relief">none</property>
           </object>
           <packing>
-            <property name="left_attach">4</property>
-            <property name="top_attach">0</property>
+            <property name="left-attach">4</property>
+            <property name="top-attach">0</property>
           </packing>
         </child>
         <child>
           <object class="GtkButton" id="skip_forward_smaller_button">
             <property name="label" translatable="yes" comments="plus 5 seconds">+5s</property>
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
-            <property name="tooltip_text" translatable="yes">Go forward 5 seconds</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">True</property>
+            <property name="tooltip-text" translatable="yes">Go forward 5 seconds</property>
             <property name="relief">none</property>
           </object>
           <packing>
-            <property name="left_attach">1</property>
-            <property name="top_attach">2</property>
+            <property name="left-attach">1</property>
+            <property name="top-attach">2</property>
           </packing>
         </child>
         <child>
           <object class="GtkButton" id="skip_forward_small_button">
             <property name="label" translatable="yes" comments="plus 10 seconds">+10s</property>
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
-            <property name="tooltip_text" translatable="yes">Go forward 10 seconds</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">True</property>
+            <property name="tooltip-text" translatable="yes">Go forward 10 seconds</property>
             <property name="relief">none</property>
           </object>
           <packing>
-            <property name="left_attach">2</property>
-            <property name="top_attach">2</property>
+            <property name="left-attach">2</property>
+            <property name="top-attach">2</property>
           </packing>
         </child>
         <child>
           <object class="GtkButton" id="skip_forward_big_button">
             <property name="label" translatable="yes" comments="plus 1 minute">+1m</property>
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
-            <property name="tooltip_text" translatable="yes">Go forward 1 minute</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">True</property>
+            <property name="tooltip-text" translatable="yes">Go forward 1 minute</property>
             <property name="relief">none</property>
           </object>
           <packing>
-            <property name="left_attach">3</property>
-            <property name="top_attach">2</property>
+            <property name="left-attach">3</property>
+            <property name="top-attach">2</property>
           </packing>
         </child>
         <child>
           <object class="GtkButton" id="skip_forward_bigger_button">
             <property name="label" translatable="yes" comments="plus 5 minutes">+5m</property>
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
-            <property name="tooltip_text" translatable="yes">Go forward 5 minutes</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">True</property>
+            <property name="tooltip-text" translatable="yes">Go forward 5 minutes</property>
             <property name="relief">none</property>
           </object>
           <packing>
-            <property name="left_attach">4</property>
-            <property name="top_attach">2</property>
+            <property name="left-attach">4</property>
+            <property name="top-attach">2</property>
           </packing>
         </child>
         <child>
           <object class="GtkBox">
             <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="margin_start">10</property>
+            <property name="can-focus">False</property>
+            <property name="margin-start">10</property>
             <property name="orientation">vertical</property>
             <child>
               <object class="GtkButton" id="copy_position_to_clipboard_button">
                 <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Copy</property>
+                <property name="can-focus">True</property>
+                <property name="receives-default">True</property>
+                <property name="tooltip-text" translatable="yes">Copy</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">edit-copy-symbolic</property>
+                    <property name="can-focus">False</property>
+                    <property name="icon-name">edit-copy-symbolic</property>
                   </object>
                 </child>
               </object>
@@ -432,8 +433,8 @@ audio-volume-medium-symbolic</property>
             </child>
           </object>
           <packing>
-            <property name="left_attach">5</property>
-            <property name="top_attach">0</property>
+            <property name="left-attach">5</property>
+            <property name="top-attach">0</property>
             <property name="height">3</property>
           </packing>
         </child>
@@ -441,31 +442,45 @@ audio-volume-medium-symbolic</property>
           <object class="GtkButton" id="skip_back_smallest_button">
             <property name="label" translatable="yes" comments="minus 1 second">-1s</property>
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
-            <property name="tooltip_text" translatable="yes">Go back 1 second</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">True</property>
+            <property name="tooltip-text" translatable="yes">Go back 1 second</property>
             <property name="relief">none</property>
           </object>
           <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">0</property>
+            <property name="left-attach">0</property>
+            <property name="top-attach">0</property>
           </packing>
         </child>
         <child>
           <object class="GtkButton" id="skip_forward_smallest_button">
             <property name="label" translatable="yes" comments="plus 1 second">+1s</property>
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
-            <property name="tooltip_text" translatable="yes">Go forward 1 second</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">True</property>
+            <property name="tooltip-text" translatable="yes">Go forward 1 second</property>
             <property name="relief">none</property>
           </object>
           <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">2</property>
+            <property name="left-attach">0</property>
+            <property name="top-attach">2</property>
           </packing>
         </child>
       </object>
     </child>
   </object>
+  <object class="GtkPopover" id="time_popover">
+    <property name="can-focus">False</property>
+    <property name="relative-to">position_scale</property>
+    <property name="modal">False</property>
+    <property name="transitions-enabled">False</property>
+    <child>
+      <object class="GtkLabel" id="time_popover_label">
+        <property name="visible">True</property>
+        <property name="can-focus">False</property>
+        <property name="label">0:00</property>
+        <property name="width-chars">10</property>
+      </object>
+    </child>
+  </object>
 </interface>
diff --git a/extensions/gstreamer_tools/gth-media-viewer-page.c 
b/extensions/gstreamer_tools/gth-media-viewer-page.c
index 44f87d24..8e7ee0a0 100644
--- a/extensions/gstreamer_tools/gth-media-viewer-page.c
+++ b/extensions/gstreamer_tools/gth-media-viewer-page.c
@@ -1025,6 +1025,73 @@ copy_position_to_clipboard_button_clicked_cb (GtkButton *button,
 }
 
 
+#define SCALE_INTERNAL_PADDING 17
+
+
+static void
+update_time_popup_position (GthMediaViewerPage *self,
+                           double              x)
+{
+       GdkRectangle   rect;
+       GtkAllocation  alloc;
+       double         p;
+       char          *s;
+
+       rect.x = x;
+       rect.y = 0;
+       rect.width = 1;
+       rect.height = 1;
+
+       gtk_widget_get_allocated_size (GET_WIDGET ("position_scale"), &alloc, NULL);
+       alloc.x = SCALE_INTERNAL_PADDING;
+       alloc.width -= SCALE_INTERNAL_PADDING;
+
+       if (rect.x < alloc.x)
+               rect.x = alloc.x;
+       if (rect.x > alloc.width)
+               rect.x = alloc.width;
+
+       gtk_popover_set_pointing_to (GTK_POPOVER (GET_WIDGET ("time_popover")), &rect);
+       p = (double) (rect.x - alloc.x) / (double) (alloc.width - alloc.x);
+       s = _g_format_duration_for_display (p * GST_TIME_AS_MSECONDS (self->priv->duration));
+       gtk_label_set_text (GTK_LABEL (GET_WIDGET ("time_popover_label")), s);
+
+       g_free (s);
+}
+
+
+static void
+position_scale_enter_notify_event_cb (GtkWidget        *widget,
+                                     GdkEventCrossing *event,
+                                     gpointer          user_data)
+{
+       GthMediaViewerPage *self = user_data;
+
+       update_time_popup_position (self, event->x);
+       gtk_popover_popup (GTK_POPOVER (GET_WIDGET ("time_popover")));
+}
+
+
+static void
+position_scale_leave_notify_event_cb (GtkWidget *widget,
+                                     GdkEvent  *event,
+                                     gpointer   user_data)
+{
+       GthMediaViewerPage *self = user_data;
+       gtk_popover_popdown (GTK_POPOVER (GET_WIDGET ("time_popover")));
+}
+
+
+static void
+position_scale_motion_notify_event_cb (GtkWidget      *widget,
+                                      GdkEventMotion *event,
+                                      gpointer        user_data)
+{
+       GthMediaViewerPage *self = user_data;
+       update_time_popup_position (self, event->x);
+}
+
+
 static void
 gth_media_viewer_page_real_activate (GthViewerPage *base,
                                     GthBrowser    *browser)
@@ -1168,6 +1235,18 @@ gth_media_viewer_page_real_activate (GthViewerPage *base,
                          "clicked",
                          G_CALLBACK (copy_position_to_clipboard_button_clicked_cb),
                          self);
+       g_signal_connect (GET_WIDGET ("position_scale"),
+                         "enter-notify-event",
+                         G_CALLBACK (position_scale_enter_notify_event_cb),
+                         self);
+       g_signal_connect (GET_WIDGET ("position_scale"),
+                         "leave-notify-event",
+                         G_CALLBACK (position_scale_leave_notify_event_cb),
+                         self);
+       g_signal_connect (GET_WIDGET ("position_scale"),
+                         "motion-notify-event",
+                         G_CALLBACK (position_scale_motion_notify_event_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);


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