diff options
Diffstat (limited to '')
| -rw-r--r-- | native/src/widget/operation.rs | 47 | 
1 files changed, 39 insertions, 8 deletions
diff --git a/native/src/widget/operation.rs b/native/src/widget/operation.rs index 5a0f0c18..caf7ba1c 100644 --- a/native/src/widget/operation.rs +++ b/native/src/widget/operation.rs @@ -109,13 +109,13 @@ where      }  } -pub fn focus_next<T>() -> impl Operation<T> { -    struct FocusNext { +pub fn focus_previous<T>() -> impl Operation<T> { +    struct FocusPrevious {          count: FocusCount,          current: usize,      } -    impl<T> Operation<T> for FocusNext { +    impl<T> Operation<T> for FocusPrevious {          fn focusable(              &mut self,              state: &mut dyn state::Focusable, @@ -126,14 +126,45 @@ pub fn focus_next<T>() -> impl Operation<T> {              }              match self.count.focused { +                None if self.current == self.count.total - 1 => state.focus(), +                Some(0) if self.current == 0 => state.unfocus(), +                Some(0) => {} +                Some(focused) if focused == self.current => state.unfocus(), +                Some(focused) if focused - 1 == self.current => state.focus(), +                _ => {} +            } + +            self.current += 1; +        } + +        fn container( +            &mut self, +            _id: Option<&Id>, +            operate_on_children: &mut dyn FnMut(&mut dyn Operation<T>), +        ) { +            operate_on_children(self) +        } +    } + +    count_focusable(|count| FocusPrevious { count, current: 0 }) +} + +pub fn focus_next<T>() -> impl Operation<T> { +    struct FocusNext { +        count: FocusCount, +        current: usize, +    } + +    impl<T> Operation<T> for FocusNext { +        fn focusable( +            &mut self, +            state: &mut dyn state::Focusable, +            _id: Option<&Id>, +        ) { +            match self.count.focused {                  None if self.current == 0 => state.focus(),                  Some(focused) if focused == self.current => state.unfocus(),                  Some(focused) if focused + 1 == self.current => state.focus(), -                Some(focused) -                    if focused == self.count.total - 1 && self.current == 0 => -                { -                    state.focus() -                }                  _ => {}              }  | 
