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:
parent
3d6940cd45
commit
fab6558285
1 changed files with 20 additions and 0 deletions
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue