From dca187de37164df2584f7388cd0bb6429337a580 Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Tue, 18 Feb 2025 18:56:09 +0300 Subject: Don't snap after DnD scroll if view position didn't change Otherwise, any DnD breaks temporarily centered columns. --- src/layout/scrolling.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'src/layout/scrolling.rs') diff --git a/src/layout/scrolling.rs b/src/layout/scrolling.rs index f1819a08..8a86f7bf 100644 --- a/src/layout/scrolling.rs +++ b/src/layout/scrolling.rs @@ -3232,6 +3232,26 @@ impl ScrollingSpace { true } + pub fn dnd_scroll_gesture_end(&mut self) { + let ViewOffset::Gesture(gesture) = &mut self.view_offset else { + return; + }; + + if gesture.dnd_last_event_time.is_some() && gesture.tracker.pos() == 0. { + // DnD didn't scroll anything, so preserve the current view position (rather than + // snapping the window). + self.view_offset = ViewOffset::Static(gesture.delta_from_tracker); + + if !self.columns.is_empty() { + // Just in case, make sure the active window remains on screen. + self.animate_view_offset_to_column(None, self.active_column_idx, None); + } + return; + } + + self.view_offset_gesture_end(false, None); + } + pub fn interactive_resize_begin(&mut self, window: W::Id, edges: ResizeEdge) -> bool { if self.interactive_resize.is_some() { return false; -- cgit