image: Cancel scroll deceleration on gesture

Seems like the deceleration from kinetic scrolling can
interact with gestures, making the image jump around.

Closes #103

Part-of: <https://gitlab.gnome.org/Incubator/loupe/-/merge_requests/211>
This commit is contained in:
Sophie Herold 2023-04-27 23:26:46 +02:00 • committed by Marge Bot
parent 3d6940cd45
commit fab6558285

View file

@ -428,6 +428,7 @@ mod imp {
} }
if obj.is_hscrollable() || obj.is_vscrollable() { if obj.is_hscrollable() || obj.is_vscrollable() {
obj.cancel_deceleration();
obj.set_cursor(gdk::Cursor::from_name("grabbing", None).as_ref()); obj.set_cursor(gdk::Cursor::from_name("grabbing", None).as_ref());
obj.imp().last_drag_value.set(Some((0., 0.))); obj.imp().last_drag_value.set(Some((0., 0.)));
} else { } else {
@ -457,6 +458,9 @@ mod imp {
let rotation_gesture = gtk::GestureRotate::new(); let rotation_gesture = gtk::GestureRotate::new();
obj.add_controller(rotation_gesture.clone()); obj.add_controller(rotation_gesture.clone());
rotation_gesture
.connect_begin(glib::clone!(@weak obj => move |_,_|obj.cancel_deceleration()));
rotation_gesture.connect_angle_changed( rotation_gesture.connect_angle_changed(
glib::clone!(@weak obj => move |gesture, _, _| { glib::clone!(@weak obj => move |gesture, _, _| {
let angle = gesture.angle_delta().to_degrees(); let angle = gesture.angle_delta().to_degrees();
@ -499,6 +503,7 @@ mod imp {
obj.add_controller(zoom_gesture.clone()); obj.add_controller(zoom_gesture.clone());
zoom_gesture.connect_begin(glib::clone!(@weak obj => move |gesture, _| { zoom_gesture.connect_begin(glib::clone!(@weak obj => move |gesture, _| {
obj.cancel_deceleration();
obj.imp() obj.imp()
.zoom_gesture_center .zoom_gesture_center
.set(gesture.bounding_box_center()); .set(gesture.bounding_box_center());
@ -1598,6 +1603,21 @@ impl LpImage {
self.max_vadjustment_value() != 0. self.max_vadjustment_value() != 0.
} }
/// Cancel kinetic scrolling movements, needed for some gestures
///
/// If deceleration is not canceled gestures become buggy.
fn cancel_deceleration(&self) {
if let Some(scrolled_window) = self
.parent()
.and_then(|x| x.downcast::<gtk::ScrolledWindow>().ok())
{
scrolled_window.set_kinetic_scrolling(false);
scrolled_window.set_kinetic_scrolling(true);
} else {
log::error!("Could not find GtkScrolledWindow parent to cancel deceleration");
}
}
pub fn widget_height(&self) -> f64 { pub fn widget_height(&self) -> f64 {
self.height() as f64 self.height() as f64
} }