diff options
Diffstat (limited to '')
| -rw-r--r-- | native/src/widget/operation/focusable.rs | 34 | ||||
| -rw-r--r-- | native/src/widget/scrollable.rs | 6 | ||||
| -rw-r--r-- | native/src/widget/text_input.rs | 6 | 
3 files changed, 46 insertions, 0 deletions
diff --git a/native/src/widget/operation/focusable.rs b/native/src/widget/operation/focusable.rs index f17bf178..0067006b 100644 --- a/native/src/widget/operation/focusable.rs +++ b/native/src/widget/operation/focusable.rs @@ -167,3 +167,37 @@ pub fn focus_next<T>() -> impl Operation<T> {      count(|count| FocusNext { count, current: 0 })  } + +/// Produces an [`Operation`] that searches for the current focused widget +/// and stores its ID. This ignores widgets that do not have an ID. +pub fn find_focused() -> impl Operation<Id> { +    struct FindFocused { +        focused: Option<Id>, +    } + +    impl Operation<Id> for FindFocused { +        fn focusable(&mut self, state: &mut dyn Focusable, id: Option<&Id>) { +            if state.is_focused() && id.is_some() { +                self.focused = id.cloned(); +            } +        } + +        fn container( +            &mut self, +            _id: Option<&Id>, +            operate_on_children: &mut dyn FnMut(&mut dyn Operation<Id>), +        ) { +            operate_on_children(self) +        } + +        fn finish(&self) -> Outcome<Id> { +            if let Some(id) = &self.focused { +                Outcome::Some(id.clone()) +            } else { +                Outcome::None +            } +        } +    } + +    FindFocused { focused: None } +} diff --git a/native/src/widget/scrollable.rs b/native/src/widget/scrollable.rs index b257cbe5..32ec6eb3 100644 --- a/native/src/widget/scrollable.rs +++ b/native/src/widget/scrollable.rs @@ -334,6 +334,12 @@ impl Id {      }  } +impl From<Id> for widget::Id { +    fn from(id: Id) -> Self { +        id.0 +    } +} +  /// Produces a [`Command`] that snaps the [`Scrollable`] with the given [`Id`]  /// to the provided `percentage`.  pub fn snap_to<Message: 'static>(id: Id, percentage: f32) -> Command<Message> { diff --git a/native/src/widget/text_input.rs b/native/src/widget/text_input.rs index e2886181..ef2f9a17 100644 --- a/native/src/widget/text_input.rs +++ b/native/src/widget/text_input.rs @@ -333,6 +333,12 @@ impl Id {      }  } +impl From<Id> for widget::Id { +    fn from(id: Id) -> Self { +        id.0 +    } +} +  /// Produces a [`Command`] that focuses the [`TextInput`] with the given [`Id`].  pub fn focus<Message: 'static>(id: Id) -> Command<Message> {      Command::widget(operation::focusable::focus(id.0))  | 
