Fixing some jankiness by decoupling scroll offset vs 'virtual' cursor position & resetting after drag end

This commit is contained in:
ellieplayswow 2025-02-18 13:14:40 +00:00
parent 23596a1646
commit 4a3b95e615

View file

@ -1780,6 +1780,8 @@ pub struct Tab {
current_drag_rect: Option<Rectangle>, current_drag_rect: Option<Rectangle>,
viewport_rect: Option<Rectangle>, viewport_rect: Option<Rectangle>,
virtual_cursor_offset: Option<Point>, virtual_cursor_offset: Option<Point>,
last_scroll_position: Option<Point>,
last_scroll_offset: Option<Point>,
} }
fn calculate_dir_size(path: &Path, controller: Controller) -> Result<u64, String> { fn calculate_dir_size(path: &Path, controller: Controller) -> Result<u64, String> {
@ -1867,7 +1869,9 @@ impl Tab {
global_cursor_position: None, global_cursor_position: None,
current_drag_rect: None, current_drag_rect: None,
viewport_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.virtual_cursor_offset = Some(new_offset);
self.last_scroll_offset = Some(new_offset);
commands.push(Command::Iced( commands.push(Command::Iced(
scrollable::scroll_by(self.scrollable_id.clone(), AbsoluteOffset { scrollable::scroll_by(self.scrollable_id.clone(), AbsoluteOffset {
@ -2257,17 +2262,37 @@ impl Tab {
)); ));
} }
else { else {
if self.virtual_cursor_offset.is_none() { if let Some(last_scroll_offset) = self.last_scroll_offset {
self.virtual_cursor_offset = Some(Point { if let Some(last_scroll_position) = self.last_scroll_position {
x: 0.0, self.virtual_cursor_offset = Some(Point {
y: 0.0 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 { else {
// reset our virtual cursor offset when we're back in bounds // reset our virtual cursor offset when we're back in bounds
self.virtual_cursor_offset = None; self.virtual_cursor_offset = None;
self.last_scroll_position = Some(pos);
self.last_scroll_offset = None;
} }
} }
} }
@ -2277,6 +2302,10 @@ impl Tab {
} }
Message::DragEnd(_) => { Message::DragEnd(_) => {
self.clicked = None; self.clicked = None;
self.virtual_cursor_offset = None;
self.last_scroll_offset = None;
self.last_scroll_position = None;
self.current_drag_rect = None; self.current_drag_rect = None;
if let Some(ref mut items) = self.items_opt { if let Some(ref mut items) = self.items_opt {
for item in items.iter_mut() { for item in items.iter_mut() {