[fractal] media_viewer: Swipe to navigate
- From: Daniel Garcia Moreno <danigm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [fractal] media_viewer: Swipe to navigate
- Date: Fri, 17 Jul 2020 06:58:37 +0000 (UTC)
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]