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() {
obj.cancel_deceleration();
obj.set_cursor(gdk::Cursor::from_name("grabbing", None).as_ref());
obj.imp().last_drag_value.set(Some((0., 0.)));
} else {
@ -457,6 +458,9 @@ mod imp {
let rotation_gesture = gtk::GestureRotate::new();
obj.add_controller(rotation_gesture.clone());
rotation_gesture
.connect_begin(glib::clone!(@weak obj => move |_,_|obj.cancel_deceleration()));
rotation_gesture.connect_angle_changed(
glib::clone!(@weak obj => move |gesture, _, _| {
let angle = gesture.angle_delta().to_degrees();
@ -499,6 +503,7 @@ mod imp {
obj.add_controller(zoom_gesture.clone());
zoom_gesture.connect_begin(glib::clone!(@weak obj => move |gesture, _| {
obj.cancel_deceleration();
obj.imp()
.zoom_gesture_center
.set(gesture.bounding_box_center());
@ -1598,6 +1603,21 @@ impl LpImage {
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 {
self.height() as f64
}