From 4a3b95e615605a9c918229cb76507b57b0d551d1 Mon Sep 17 00:00:00 2001 From: ellieplayswow <164806095+ellieplayswow@users.noreply.github.com> Date: Tue, 18 Feb 2025 13:14:40 +0000 Subject: [PATCH] Fixing some jankiness by decoupling scroll offset vs 'virtual' cursor position & resetting after drag end --- src/tab.rs | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/src/tab.rs b/src/tab.rs index c135f15..5e6fdcf 100644 --- a/src/tab.rs +++ b/src/tab.rs @@ -1780,6 +1780,8 @@ pub struct Tab { current_drag_rect: Option, viewport_rect: Option, virtual_cursor_offset: Option, + last_scroll_position: Option, + last_scroll_offset: Option, } fn calculate_dir_size(path: &Path, controller: Controller) -> Result { @@ -1867,7 +1869,9 @@ impl Tab { global_cursor_position: None, current_drag_rect: None, viewport_rect: None, - virtual_cursor_offset: None + virtual_cursor_offset: None, + last_scroll_position: None, + last_scroll_offset: None } } @@ -2248,6 +2252,7 @@ impl Tab { } self.virtual_cursor_offset = Some(new_offset); + self.last_scroll_offset = Some(new_offset); commands.push(Command::Iced( scrollable::scroll_by(self.scrollable_id.clone(), AbsoluteOffset { @@ -2257,17 +2262,37 @@ impl Tab { )); } else { - if self.virtual_cursor_offset.is_none() { - self.virtual_cursor_offset = Some(Point { - x: 0.0, - y: 0.0 - }); + if let Some(last_scroll_offset) = self.last_scroll_offset { + if let Some(last_scroll_position) = self.last_scroll_position { + self.virtual_cursor_offset = Some(Point { + x: 0.0, + y: (pos.y - last_scroll_position.y + last_scroll_offset.y) + }); + } + + } + else { + if let Some(last_scroll_position) = self.last_scroll_position { + self.virtual_cursor_offset = Some(Point { + x: 0.0, + y: (pos.y - last_scroll_position.y) + }); + } + else { + self.virtual_cursor_offset = Some(Point { + x: 0.0, + y: 0.0 + }); + } + } } } else { // reset our virtual cursor offset when we're back in bounds self.virtual_cursor_offset = None; + self.last_scroll_position = Some(pos); + self.last_scroll_offset = None; } } } @@ -2277,6 +2302,10 @@ impl Tab { } Message::DragEnd(_) => { self.clicked = None; + self.virtual_cursor_offset = None; + self.last_scroll_offset = None; + self.last_scroll_position = None; + self.current_drag_rect = None; if let Some(ref mut items) = self.items_opt { for item in items.iter_mut() {