diff options
author | 2022-11-14 00:46:17 +0100 | |
---|---|---|
committer | 2022-11-14 00:46:17 +0100 | |
commit | cf410a5e0b37c7f88ea33874796f0becbe970628 (patch) | |
tree | c8def5fe247f5e38bef5d6af0d731805ac8ff720 /native | |
parent | f5c9f63329ec420757c81ef73ab76e7a8cb2cd2e (diff) | |
parent | cbb3475d4c34941f59e8e80ddd16c9d61f56c6e0 (diff) | |
download | iced-cf410a5e0b37c7f88ea33874796f0becbe970628.tar.gz iced-cf410a5e0b37c7f88ea33874796f0becbe970628.tar.bz2 iced-cf410a5e0b37c7f88ea33874796f0becbe970628.zip |
Merge pull request #1536 from rs017991/op_bug_fix_map
Fix mapped `Operation` always returning `Outcome::None`
Diffstat (limited to 'native')
-rw-r--r-- | native/src/widget/action.rs | 51 |
1 files changed, 41 insertions, 10 deletions
diff --git a/native/src/widget/action.rs b/native/src/widget/action.rs index 593d6f63..9aa79dec 100644 --- a/native/src/widget/action.rs +++ b/native/src/widget/action.rs @@ -1,8 +1,10 @@ -use crate::widget::operation::{self, Operation}; +use crate::widget::operation::{self, Focusable, Operation, Scrollable}; use crate::widget::Id; use iced_futures::MaybeSend; +use std::rc::Rc; + /// An operation to be performed on the widget tree. #[allow(missing_debug_implementations)] pub struct Action<T>(Box<dyn Operation<T>>); @@ -24,7 +26,7 @@ impl<T> Action<T> { { Action(Box::new(Map { operation: self.0, - f: Box::new(f), + f: Rc::new(f), })) } @@ -37,7 +39,7 @@ impl<T> Action<T> { #[allow(missing_debug_implementations)] struct Map<A, B> { operation: Box<dyn Operation<A>>, - f: Box<dyn Fn(A) -> B>, + f: Rc<dyn Fn(A) -> B>, } impl<A, B> Operation<B> for Map<A, B> @@ -50,30 +52,44 @@ where id: Option<&Id>, operate_on_children: &mut dyn FnMut(&mut dyn Operation<B>), ) { - struct MapRef<'a, A, B> { + struct MapRef<'a, A> { operation: &'a mut dyn Operation<A>, - f: &'a dyn Fn(A) -> B, } - impl<'a, A, B> Operation<B> for MapRef<'a, A, B> { + impl<'a, A, B> Operation<B> for MapRef<'a, A> { fn container( &mut self, id: Option<&Id>, operate_on_children: &mut dyn FnMut(&mut dyn Operation<B>), ) { - let Self { operation, f } = self; + let Self { operation, .. } = self; operation.container(id, &mut |operation| { - operate_on_children(&mut MapRef { operation, f }); + operate_on_children(&mut MapRef { operation }); }); } + + fn scrollable( + &mut self, + state: &mut dyn Scrollable, + id: Option<&Id>, + ) { + self.operation.scrollable(state, id); + } + + fn focusable( + &mut self, + state: &mut dyn Focusable, + id: Option<&Id>, + ) { + self.operation.focusable(state, id); + } } - let Self { operation, f } = self; + let Self { operation, .. } = self; MapRef { operation: operation.as_mut(), - f, } .container(id, operate_on_children); } @@ -101,4 +117,19 @@ where ) { self.operation.text_input(state, id); } + + fn finish(&self) -> operation::Outcome<B> { + match self.operation.finish() { + operation::Outcome::None => operation::Outcome::None, + operation::Outcome::Some(output) => { + operation::Outcome::Some((self.f)(output)) + } + operation::Outcome::Chain(next) => { + operation::Outcome::Chain(Box::new(Map { + operation: next, + f: self.f.clone(), + })) + } + } + } } |