diff options
| author | 2025-02-23 07:34:30 +0100 | |
|---|---|---|
| committer | 2025-02-23 07:34:30 +0100 | |
| commit | 34314b3f576fdfffdd82968a685020d4dca47992 (patch) | |
| tree | a0b1c7a070803606e5b2a0dfb06f2d637ad0540b /core/src | |
| parent | fd1cfc05eae2d2527fc5fe0a4b30b133283c7095 (diff) | |
| parent | 7916a9c2272a3d6d89e7545b33e2991657ad5990 (diff) | |
| download | iced-34314b3f576fdfffdd82968a685020d4dca47992.tar.gz iced-34314b3f576fdfffdd82968a685020d4dca47992.tar.bz2 iced-34314b3f576fdfffdd82968a685020d4dca47992.zip | |
Merge pull request #2812 from andymandias/text_input-is_focused
`operation::focusable::is_focused` & `text_input::is_focused`
Diffstat (limited to 'core/src')
| -rw-r--r-- | core/src/widget/operation/focusable.rs | 45 | 
1 files changed, 45 insertions, 0 deletions
| diff --git a/core/src/widget/operation/focusable.rs b/core/src/widget/operation/focusable.rs index 1ee41244..44c9d647 100644 --- a/core/src/widget/operation/focusable.rs +++ b/core/src/widget/operation/focusable.rs @@ -257,3 +257,48 @@ pub fn find_focused() -> impl Operation<Id> {      FindFocused { focused: None }  } + +/// Produces an [`Operation`] that searches for the focusable widget +/// and stores whether it is focused or not. This ignores widgets that +/// do not have an ID. +pub fn is_focused(target: Id) -> impl Operation<bool> { +    struct IsFocused { +        target: Id, +        is_focused: Option<bool>, +    } + +    impl Operation<bool> for IsFocused { +        fn focusable( +            &mut self, +            id: Option<&Id>, +            _bounds: Rectangle, +            state: &mut dyn Focusable, +        ) { +            if id.is_some_and(|id| *id == self.target) { +                self.is_focused = Some(state.is_focused()); +            } +        } + +        fn container( +            &mut self, +            _id: Option<&Id>, +            _bounds: Rectangle, +            operate_on_children: &mut dyn FnMut(&mut dyn Operation<bool>), +        ) { +            if self.is_focused.is_some() { +                return; +            } + +            operate_on_children(self); +        } + +        fn finish(&self) -> Outcome<bool> { +            self.is_focused.map_or(Outcome::None, Outcome::Some) +        } +    } + +    IsFocused { +        target, +        is_focused: None, +    } +} | 
