Improve TextEditor slow scrolling behavior with touchpads.

If you scroll by only a fraction of a line, the TextEditor
stores this fraction and adds it on the next scroll event.
This commit is contained in:
Radovan Blažek 2023-11-17 16:52:26 +01:00 committed by Héctor Ramón Jiménez
parent 358f004fa0
commit 79a348464e
No known key found for this signature in database
GPG key ID: 7CC46565708259A7

View file

@ -289,6 +289,7 @@ struct State<Highlighter: text::Highlighter> {
is_focused: bool,
last_click: Option<mouse::Click>,
drag_click: Option<mouse::click::Kind>,
partial_scroll: f32,
highlighter: RefCell<Highlighter>,
highlighter_settings: Highlighter::Settings,
highlighter_format_address: usize,
@ -310,6 +311,7 @@ where
is_focused: false,
last_click: None,
drag_click: None,
partial_scroll: 0.0,
highlighter: RefCell::new(Highlighter::new(
&self.highlighter_settings,
)),
@ -404,6 +406,11 @@ where
shell.publish(on_edit(action));
}
Update::Scroll(mut lines) => {
lines += state.partial_scroll;
state.partial_scroll = lines.fract();
shell.publish(on_edit(Action::Scroll { lines: lines as i32 }))
}
Update::Unfocus => {
state.is_focused = false;
state.drag_click = None;
@ -577,6 +584,7 @@ where
enum Update {
Click(mouse::Click),
Scroll(f32),
Unfocus,
Release,
Action(Action),
@ -630,21 +638,16 @@ impl Update {
mouse::Event::WheelScrolled { delta }
if cursor.is_over(bounds) =>
{
action(Action::Scroll {
lines: match delta {
mouse::ScrollDelta::Lines { y, .. } => {
if y.abs() > 0.0 {
(y.signum() * -(y.abs() * 4.0).max(1.0))
as i32
} else {
0
}
Some(Update::Scroll(match delta {
mouse::ScrollDelta::Lines { y, .. } => {
if y.abs() > 0.0 {
y.signum() * -(y.abs() * 4.0).max(1.0)
} else {
0.0
}
mouse::ScrollDelta::Pixels { y, .. } => {
(-y / 4.0) as i32
}
},
})
}
mouse::ScrollDelta::Pixels { y, .. } => -y / 4.0,
}))
}
_ => None,
},