diff --git a/examples/cosmic/src/window.rs b/examples/cosmic/src/window.rs index 2b5e2af..eb3017e 100644 --- a/examples/cosmic/src/window.rs +++ b/examples/cosmic/src/window.rs @@ -300,7 +300,7 @@ impl Application for Window { ])) .add(settings::item( format!("Spin Button (Range {}:{})", self.spin_button.min, self.spin_button.max), - self.spin_button.view().map(Message::SpinButton) + self.spin_button.view(Message::SpinButton), )) .into() ]) diff --git a/src/widget/spin_button/mod.rs b/src/widget/spin_button/mod.rs index 950f78b..fb7774b 100644 --- a/src/widget/spin_button/mod.rs +++ b/src/widget/spin_button/mod.rs @@ -14,8 +14,9 @@ use iced::{ }; use std::hash::Hash; -pub struct SpinButton { +pub struct SpinButton { value: T, + on_change: Box Message + 'static>, } /// A message emitted by the [`SpinButton`] widget. @@ -25,19 +26,26 @@ pub enum SpinMessage { Decrement, } -pub fn spin_button(value: T) -> SpinButton { - SpinButton::new(value) +pub fn spin_button( + model: &SpinButtonModel, + on_change: impl Fn(SpinMessage) -> Message + 'static, +) -> SpinButton { + SpinButton::new(model.value, on_change) } -impl SpinButton { - pub fn new(value: T) -> Self { - Self { value } +impl SpinButton { + pub fn new(value: T, on_change: impl Fn(SpinMessage) -> Message + 'static) -> Self { + Self { + on_change: Box::from(on_change), + value, + } } - pub fn into_element(self) -> Element<'static, SpinMessage> { - let Self { value } = self; + pub fn into_element(self) -> Element<'static, Message> { + let Self { on_change, value } = self; + Element::from(iced_lazy::lazy( - value.clone(), + value, move || -> Element<'static, SpinMessage> { container( row![ @@ -53,7 +61,7 @@ impl SpinButton { .height(Length::Fill) .style(theme::Button::Text) .on_press(SpinMessage::Decrement), - text(value.clone()) + text(value) .vertical_alignment(Vertical::Center) .apply(container) .width(Length::Fill) @@ -85,11 +93,14 @@ impl SpinButton { .into() }, )) + .map(on_change) } } -impl<'a, T: 'static + Clone + Hash + ToString> From> for Element<'a, SpinMessage> { - fn from(spin_button: SpinButton) -> Self { +impl<'a, T: 'static + Copy + Hash + ToString, Message: 'static> From> + for Element<'a, Message> +{ + fn from(spin_button: SpinButton) -> Self { spin_button.into_element() } } diff --git a/src/widget/spin_button/model.rs b/src/widget/spin_button/model.rs index 6565159..0600317 100644 --- a/src/widget/spin_button/model.rs +++ b/src/widget/spin_button/model.rs @@ -23,8 +23,11 @@ impl SpinButtonModel where T: Copy + Hash + ToString + Sub + Add + Ord, { - pub fn view(&self) -> Element<'static, SpinMessage> { - SpinButton::new(self.value).into_element() + pub fn view( + &self, + on_change: impl Fn(SpinMessage) -> Message + 'static, + ) -> Element<'static, Message> { + SpinButton::new(self.value, on_change).into_element() } pub fn update(&mut self, message: SpinMessage) {