[fractal] media_viewer: Swipe to navigate



commit 36ce8cd1cf948993bbc0eb6bc20dcd3445f20848
Author: James Westman <james flyingpimonster net>
Date:   Sat Jun 20 19:57:12 2020 -0500

    media_viewer: Swipe to navigate
    
    Adds a swipe gesture to navigate back and forth in the media viewer.
    
    Also removes the scrolled window and viewport, since they aren't necessary.

 fractal-gtk/res/ui/media_viewer.ui      | 14 +------
 fractal-gtk/src/widgets/media_viewer.rs | 67 +++++++++++++++++++++------------
 2 files changed, 44 insertions(+), 37 deletions(-)
---
diff --git a/fractal-gtk/res/ui/media_viewer.ui b/fractal-gtk/res/ui/media_viewer.ui
index 96a2599f..243322c8 100644
--- a/fractal-gtk/res/ui/media_viewer.ui
+++ b/fractal-gtk/res/ui/media_viewer.ui
@@ -11,22 +11,10 @@
         <property name="visible">True</property>
         <property name="can_focus">False</property>
         <child>
-          <object class="GtkScrolledWindow" id="media_scroll">
+          <object class="GtkEventBox" id="media_container">
             <property name="visible">True</property>
             <property name="can_focus">True</property>
-            <child>
-              <object class="GtkViewport" id="media_viewport">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <child>
-                  <placeholder/>
-                </child>
-              </object>
-            </child>
           </object>
-          <packing>
-            <property name="index">-1</property>
-          </packing>
         </child>
         <child type="overlay">
           <object class="GtkOverlay" id="headerbar_overlay">
diff --git a/fractal-gtk/src/widgets/media_viewer.rs b/fractal-gtk/src/widgets/media_viewer.rs
index f2c95773..e1c3069b 100644
--- a/fractal-gtk/src/widgets/media_viewer.rs
+++ b/fractal-gtk/src/widgets/media_viewer.rs
@@ -38,6 +38,7 @@ pub struct MediaViewer {
     data: Rc<RefCell<Data>>,
     /* gtk widgets we need to have a reference to */
     pub builder: gtk::Builder,
+    swipe_gesture: Option<gtk::GestureSwipe>,
 }
 
 #[derive(Debug)]
@@ -185,11 +186,11 @@ impl Data {
         match self.widget {
             Widget::Video(ref mut widget) => {
                 widget.set_fullscreen_mode();
-                let media_viewport = self
+                let media_container = self
                     .builder
-                    .get_object::<gtk::Viewport>("media_viewport")
-                    .expect("Cant find media_viewport in ui file.");
-                media_viewport.show();
+                    .get_object::<gtk::EventBox>("media_container")
+                    .expect("Cant find media_container in ui file.");
+                media_container.show();
             }
             _ => {
                 self.redraw_media_in_viewport(thread_pool);
@@ -238,11 +239,11 @@ impl Data {
         match self.widget {
             Widget::Video(ref mut widget) => {
                 widget.set_window_mode();
-                let media_viewport = self
+                let media_container = self
                     .builder
-                    .get_object::<gtk::Viewport>("media_viewport")
-                    .expect("Cant find media_viewport in ui file.");
-                media_viewport.show_all();
+                    .get_object::<gtk::EventBox>("media_container")
+                    .expect("Cant find media_container in ui file.");
+                media_container.show_all();
                 if widget.player.is_playing() {
                     /* For some reason, if we don't replay the video, the play button,
                     which theoretically is hidden, appears next to the pause button. */
@@ -313,13 +314,13 @@ impl Data {
     }
 
     pub fn redraw_media_in_viewport(&mut self, thread_pool: ThreadPool) {
-        let media_viewport = self
+        let media_container = self
             .builder
-            .get_object::<gtk::Viewport>("media_viewport")
-            .expect("Cant find media_viewport in ui file.");
+            .get_object::<gtk::EventBox>("media_container")
+            .expect("Cant find media_container in ui file.");
 
-        if let Some(child) = media_viewport.get_child() {
-            media_viewport.remove(&child);
+        if let Some(child) = media_container.get_child() {
+            media_container.remove(&child);
         }
 
         let msg = &self.media_list[self.current_media_index];
@@ -330,15 +331,15 @@ impl Data {
                     .shrink_to_fit(true)
                     .center(true)
                     .build(thread_pool);
-                media_viewport.add(&image.widget);
+                media_container.add(&image.widget);
                 image.widget.show();
                 self.widget = Widget::Image(image);
             }
             "m.video" => {
                 let widget = self.create_video_widget(thread_pool, &url);
-                media_viewport.add(&widget.outer_box);
+                media_container.add(&widget.outer_box);
                 self.widget = Widget::Video(widget);
-                media_viewport.show_all();
+                media_container.show_all();
             }
             _ => {}
         }
@@ -639,6 +640,7 @@ impl MediaViewer {
                 double_click_handler_id: None,
             })),
             builder,
+            swipe_gesture: None,
         }
     }
 
@@ -673,10 +675,10 @@ impl MediaViewer {
 
         set_header_title(&self.builder, &media_msg.body);
 
-        let media_viewport = self
+        let media_container = self
             .builder
-            .get_object::<gtk::Viewport>("media_viewport")
-            .expect("Cant find media_viewport in ui file.");
+            .get_object::<gtk::EventBox>("media_container")
+            .expect("Cant find media_container in ui file.");
 
         let url = media_msg.url.clone().unwrap_or_default();
         match media_msg.mtype.as_ref() {
@@ -686,15 +688,15 @@ impl MediaViewer {
                     .center(true)
                     .build(thread_pool);
 
-                media_viewport.add(&image.widget);
-                media_viewport.show_all();
+                media_container.add(&image.widget);
+                media_container.show_all();
 
                 self.data.borrow_mut().widget = Widget::Image(image);
             }
             "m.video" => {
                 let video_widget = self.data.borrow().create_video_widget(thread_pool, &url);
-                media_viewport.add(&video_widget.outer_box);
-                media_viewport.show_all();
+                media_container.add(&video_widget.outer_box);
+                media_container.show_all();
 
                 self.data.borrow_mut().widget = Widget::Video(video_widget);
             }
@@ -724,7 +726,7 @@ impl MediaViewer {
         }));
     }
 
-    pub fn connect_media_viewer_box(&self, thread_pool: ThreadPool) {
+    pub fn connect_media_viewer_box(&mut self, thread_pool: ThreadPool) {
         let full_screen_button = self
             .builder
             .get_object::<gtk::Button>("full_screen_button")
@@ -895,6 +897,23 @@ impl MediaViewer {
         next_media_button.connect_clicked(clone!(@weak data => move |_| {
             data.borrow_mut().next_media(thread_pool.clone());
         }));
+
+        let media_container = self
+            .builder
+            .get_object::<gtk::EventBox>("media_container")
+            .expect("Can't find media_container in ui file.");
+        let swipe_gesture = gtk::GestureSwipe::new(&media_container);
+        let prev = previous_media_button.clone();
+        let next = next_media_button.clone();
+        swipe_gesture.connect_swipe(move |_gesture, x, _y| {
+            if x > 50.0 {
+                prev.clicked();
+            } else if x < -50.0 {
+                next.clicked();
+            }
+        });
+        self.swipe_gesture = Some(swipe_gesture);
+
         let full_screen_button = self
             .builder
             .get_object::<gtk::Button>("full_screen_button")


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