diff options
Diffstat (limited to 'widget/src')
-rw-r--r-- | widget/src/scrollable.rs | 20 | ||||
-rw-r--r-- | widget/src/text_input.rs | 39 |
2 files changed, 38 insertions, 21 deletions
diff --git a/widget/src/scrollable.rs b/widget/src/scrollable.rs index af6a3945..00a6b556 100644 --- a/widget/src/scrollable.rs +++ b/widget/src/scrollable.rs @@ -751,7 +751,7 @@ where // TODO: Configurable speed/friction (?) -movement * 60.0 } - mouse::ScrollDelta::Pixels { x, y } => Vector::new(x, y), + mouse::ScrollDelta::Pixels { x, y } => -Vector::new(x, y), }; state.scroll( @@ -760,13 +760,17 @@ where content_bounds, ); - if notify_scroll( + let has_scrolled = notify_scroll( state, &self.on_scroll, bounds, content_bounds, shell, - ) { + ); + + let in_transaction = state.last_scrolled.is_some(); + + if has_scrolled || in_transaction { event::Status::Captured } else { event::Status::Ignored @@ -1194,11 +1198,6 @@ fn notify_viewport<Message>( return false; } - let Some(on_scroll) = on_scroll else { - state.last_notified = None; - return false; - }; - let viewport = Viewport { offset_x: state.offset_x, offset_y: state.offset_y, @@ -1229,9 +1228,12 @@ fn notify_viewport<Message>( } } - shell.publish(on_scroll(viewport)); state.last_notified = Some(viewport); + if let Some(on_scroll) = on_scroll { + shell.publish(on_scroll(viewport)); + } + true } diff --git a/widget/src/text_input.rs b/widget/src/text_input.rs index d5ede524..3032dd13 100644 --- a/widget/src/text_input.rs +++ b/widget/src/text_input.rs @@ -114,8 +114,8 @@ where } /// Sets the [`Id`] of the [`TextInput`]. - pub fn id(mut self, id: Id) -> Self { - self.id = Some(id); + pub fn id(mut self, id: impl Into<Id>) -> Self { + self.id = Some(id.into()); self } @@ -1226,38 +1226,53 @@ impl From<Id> for widget::Id { } } +impl From<&'static str> for Id { + fn from(id: &'static str) -> Self { + Self::new(id) + } +} + +impl From<String> for Id { + fn from(id: String) -> Self { + Self::new(id) + } +} + /// Produces a [`Task`] that focuses the [`TextInput`] with the given [`Id`]. -pub fn focus<T>(id: Id) -> Task<T> { - task::effect(Action::widget(operation::focusable::focus(id.0))) +pub fn focus<T>(id: impl Into<Id>) -> Task<T> { + task::effect(Action::widget(operation::focusable::focus(id.into().0))) } /// Produces a [`Task`] that moves the cursor of the [`TextInput`] with the given [`Id`] to the /// end. -pub fn move_cursor_to_end<T>(id: Id) -> Task<T> { +pub fn move_cursor_to_end<T>(id: impl Into<Id>) -> Task<T> { task::effect(Action::widget(operation::text_input::move_cursor_to_end( - id.0, + id.into().0, ))) } /// Produces a [`Task`] that moves the cursor of the [`TextInput`] with the given [`Id`] to the /// front. -pub fn move_cursor_to_front<T>(id: Id) -> Task<T> { +pub fn move_cursor_to_front<T>(id: impl Into<Id>) -> Task<T> { task::effect(Action::widget(operation::text_input::move_cursor_to_front( - id.0, + id.into().0, ))) } /// Produces a [`Task`] that moves the cursor of the [`TextInput`] with the given [`Id`] to the /// provided position. -pub fn move_cursor_to<T>(id: Id, position: usize) -> Task<T> { +pub fn move_cursor_to<T>(id: impl Into<Id>, position: usize) -> Task<T> { task::effect(Action::widget(operation::text_input::move_cursor_to( - id.0, position, + id.into().0, + position, ))) } /// Produces a [`Task`] that selects all the content of the [`TextInput`] with the given [`Id`]. -pub fn select_all<T>(id: Id) -> Task<T> { - task::effect(Action::widget(operation::text_input::select_all(id.0))) +pub fn select_all<T>(id: impl Into<Id>) -> Task<T> { + task::effect(Action::widget(operation::text_input::select_all( + id.into().0, + ))) } /// The state of a [`TextInput`]. |