diff options
author | 2022-08-04 03:55:41 +0200 | |
---|---|---|
committer | 2022-08-04 03:55:41 +0200 | |
commit | 13dd1ca0a83cc95eea52e2106da9dc1ee1f37958 (patch) | |
tree | 4b142110e23fe45b8d5d21935034c951f548d7e8 /native/src/widget/operation.rs | |
parent | 6eb3dd7e5edc8847875c288c41d1dec8b1dad06e (diff) | |
download | iced-13dd1ca0a83cc95eea52e2106da9dc1ee1f37958.tar.gz iced-13dd1ca0a83cc95eea52e2106da9dc1ee1f37958.tar.bz2 iced-13dd1ca0a83cc95eea52e2106da9dc1ee1f37958.zip |
Implement `scrollable::snap_to` operation
Diffstat (limited to '')
-rw-r--r-- | native/src/widget/operation.rs | 173 |
1 files changed, 9 insertions, 164 deletions
diff --git a/native/src/widget/operation.rs b/native/src/widget/operation.rs index caf7ba1c..4a075da9 100644 --- a/native/src/widget/operation.rs +++ b/native/src/widget/operation.rs @@ -1,4 +1,9 @@ -use crate::widget::state; +pub mod focusable; +pub mod scrollable; + +pub use focusable::Focusable; +pub use scrollable::Scrollable; + use crate::widget::Id; pub trait Operation<T> { @@ -8,12 +13,9 @@ pub trait Operation<T> { operate_on_children: &mut dyn FnMut(&mut dyn Operation<T>), ); - fn focusable( - &mut self, - _state: &mut dyn state::Focusable, - _id: Option<&Id>, - ) { - } + fn focusable(&mut self, _state: &mut dyn Focusable, _id: Option<&Id>) {} + + fn scrollable(&mut self, _state: &mut dyn Scrollable, _id: Option<&Id>) {} fn finish(&self) -> Outcome<T> { Outcome::None @@ -25,160 +27,3 @@ pub enum Outcome<T> { Some(T), Chain(Box<dyn Operation<T>>), } - -pub fn focus<T>(target: Id) -> impl Operation<T> { - struct Focus { - target: Id, - } - - impl<T> Operation<T> for Focus { - fn focusable( - &mut self, - state: &mut dyn state::Focusable, - id: Option<&Id>, - ) { - match id { - Some(id) if id == &self.target => { - state.focus(); - } - _ => { - state.unfocus(); - } - } - } - - fn container( - &mut self, - _id: Option<&Id>, - operate_on_children: &mut dyn FnMut(&mut dyn Operation<T>), - ) { - operate_on_children(self) - } - } - - Focus { target } -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] -pub struct FocusCount { - focused: Option<usize>, - total: usize, -} - -pub fn count_focusable<T, O>(f: fn(FocusCount) -> O) -> impl Operation<T> -where - O: Operation<T> + 'static, -{ - struct CountFocusable<O> { - count: FocusCount, - next: fn(FocusCount) -> O, - } - - impl<T, O> Operation<T> for CountFocusable<O> - where - O: Operation<T> + 'static, - { - fn focusable( - &mut self, - state: &mut dyn state::Focusable, - _id: Option<&Id>, - ) { - if state.is_focused() { - self.count.focused = Some(self.count.total); - } - - self.count.total += 1; - } - - fn container( - &mut self, - _id: Option<&Id>, - operate_on_children: &mut dyn FnMut(&mut dyn Operation<T>), - ) { - operate_on_children(self) - } - - fn finish(&self) -> Outcome<T> { - Outcome::Chain(Box::new((self.next)(self.count))) - } - } - - CountFocusable { - count: FocusCount::default(), - next: f, - } -} - -pub fn focus_previous<T>() -> impl Operation<T> { - struct FocusPrevious { - count: FocusCount, - current: usize, - } - - impl<T> Operation<T> for FocusPrevious { - fn focusable( - &mut self, - state: &mut dyn state::Focusable, - _id: Option<&Id>, - ) { - if self.count.total == 0 { - return; - } - - 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(), - _ => {} - } - - 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| FocusNext { count, current: 0 }) -} |