diff options
author | 2024-02-03 14:28:54 +0100 | |
---|---|---|
committer | 2024-02-03 14:28:54 +0100 | |
commit | 0b2c9db22868c43e4dd160b66abddce0846991b1 (patch) | |
tree | 35b55485fe12369abee97dbf63c9d21e67a36fc6 /widget | |
parent | 358f004fa01d98af8c3ec80ed78d550f6a5f6df0 (diff) | |
parent | 719798441db735149018e2eab47f377692c29196 (diff) | |
download | iced-0b2c9db22868c43e4dd160b66abddce0846991b1.tar.gz iced-0b2c9db22868c43e4dd160b66abddce0846991b1.tar.bz2 iced-0b2c9db22868c43e4dd160b66abddce0846991b1.zip |
Merge pull request #2140 from blazra/master
Improve `TextEditor` slow scrolling behavior with touchpads
Diffstat (limited to '')
-rw-r--r-- | widget/src/text_editor.rs | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index 354abceb..8d431991 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -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,14 @@ where shell.publish(on_edit(action)); } + Update::Scroll(lines) => { + let 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 +587,7 @@ where enum Update { Click(mouse::Click), + Scroll(f32), Unfocus, Release, Action(Action), @@ -630,21 +641,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 - } - } - mouse::ScrollDelta::Pixels { y, .. } => { - (-y / 4.0) as i32 + 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, + })) } _ => None, }, |