diff options
author | 2024-03-16 19:14:13 +0100 | |
---|---|---|
committer | 2024-03-16 19:14:13 +0100 | |
commit | 28a27f08edccd53e06ad693e63b0a62dae921da5 (patch) | |
tree | d2a2f51ebc9fddd38771abfbd567522396763468 /src | |
parent | 0a24611ccdb9402f89c88fd5f567b9d26e3533c2 (diff) | |
download | iced-28a27f08edccd53e06ad693e63b0a62dae921da5.tar.gz iced-28a27f08edccd53e06ad693e63b0a62dae921da5.tar.bz2 iced-28a27f08edccd53e06ad693e63b0a62dae921da5.zip |
Remove `sandbox` by making `application` more generic :tada:
Diffstat (limited to 'src')
-rw-r--r-- | src/lib.rs | 6 | ||||
-rw-r--r-- | src/program.rs | 123 |
2 files changed, 42 insertions, 87 deletions
@@ -363,15 +363,15 @@ pub type Result = std::result::Result<(), Error>; /// ``` pub fn run<State, Message>( title: impl program::Title<State> + 'static, - update: impl Fn(&mut State, Message) + 'static, + update: impl program::Update<State, Message> + 'static, view: impl for<'a> program::View<'a, State, Message> + 'static, ) -> Result where State: Default + 'static, Message: std::fmt::Debug + Send + 'static, { - sandbox(title, update, view).run() + application(title, update, view).run() } #[doc(inline)] -pub use program::{application, sandbox}; +pub use program::application; diff --git a/src/program.rs b/src/program.rs index 37ff64b1..aacbf876 100644 --- a/src/program.rs +++ b/src/program.rs @@ -15,7 +15,7 @@ //! use iced::Theme; //! //! pub fn main() -> iced::Result { -//! iced::sandbox("A counter", update, view) +//! iced::application("A counter", update, view) //! .theme(|_| Theme::Dark) //! .centered() //! .run() @@ -46,14 +46,14 @@ use crate::{Command, Element, Font, Result, Settings, Subscription}; use std::borrow::Cow; -/// Creates the most basic kind of [`Program`] from some update and view logic. +/// Creates an iced [`Program`] given its title, update, and view logic. /// /// # Example /// ```no_run /// use iced::widget::{button, column, text, Column}; /// /// pub fn main() -> iced::Result { -/// iced::sandbox("A counter", update, view).run() +/// iced::application("A counter", update, view).run() /// } /// /// #[derive(Debug, Clone)] @@ -74,78 +74,9 @@ use std::borrow::Cow; /// ] /// } /// ``` -pub fn sandbox<State, Message>( - title: impl Title<State>, - update: impl Fn(&mut State, Message), - view: impl for<'a> self::View<'a, State, Message>, -) -> Program< - impl Definition<State = State, Message = Message, Theme = crate::Theme>, -> -where - State: Default + 'static, - Message: Send + std::fmt::Debug, -{ - use std::marker::PhantomData; - - struct Sandbox<State, Message, Update, View> { - update: Update, - view: View, - _state: PhantomData<State>, - _message: PhantomData<Message>, - } - - impl<State, Message, Update, View> Definition - for Sandbox<State, Message, Update, View> - where - State: Default + 'static, - Message: Send + std::fmt::Debug, - Update: Fn(&mut State, Message), - View: for<'a> self::View<'a, State, Message>, - { - type State = State; - type Message = Message; - type Theme = crate::Theme; - type Executor = iced_futures::backend::null::Executor; - - fn build(&self) -> (Self::State, Command<Self::Message>) { - (State::default(), Command::none()) - } - - fn update( - &self, - state: &mut Self::State, - message: Self::Message, - ) -> Command<Self::Message> { - (self.update)(state, message); - - Command::none() - } - - fn view<'a>( - &self, - state: &'a Self::State, - ) -> Element<'a, Self::Message, Self::Theme> { - self.view.view(state).into() - } - } - - Program { - raw: Sandbox { - update, - view, - _state: PhantomData, - _message: PhantomData, - }, - settings: Settings::default(), - } - .title(title) -} - -/// Creates a [`Program`] that can leverage the [`Command`] API for -/// concurrent operations. pub fn application<State, Message>( title: impl Title<State>, - update: impl Fn(&mut State, Message) -> Command<Message>, + update: impl Update<State, Message>, view: impl for<'a> self::View<'a, State, Message>, ) -> Program< impl Definition<State = State, Message = Message, Theme = crate::Theme>, @@ -168,7 +99,7 @@ where where State: Default, Message: Send + std::fmt::Debug, - Update: Fn(&mut State, Message) -> Command<Message>, + Update: self::Update<State, Message>, View: for<'a> self::View<'a, State, Message>, { type State = State; @@ -185,7 +116,7 @@ where state: &mut Self::State, message: Self::Message, ) -> Command<Self::Message> { - (self.update)(state, message) + self.update.update(state, message).into() } fn view<'a>( @@ -704,18 +635,44 @@ where } } +/// The update logic of some [`Program`]. +/// +/// This trait allows [`application`] to take any closure that +/// returns any `Into<Command<Message>>`. +/// +/// [`application`]: self::application() +pub trait Update<State, Message> { + /// Processes the message and updates the state of the [`Program`]. + fn update( + &self, + state: &mut State, + message: Message, + ) -> impl Into<Command<Message>>; +} + +impl<T, State, Message, C> Update<State, Message> for T +where + T: Fn(&mut State, Message) -> C, + C: Into<Command<Message>>, +{ + fn update( + &self, + state: &mut State, + message: Message, + ) -> impl Into<Command<Message>> { + self(state, message) + } +} + /// The view logic of some [`Program`]. /// -/// This trait allows [`sandbox`] and [`application`] to -/// take any closure that returns any `Into<Element<'_, Message>>`. +/// This trait allows [`application`] to take any closure that +/// returns any `Into<Element<'_, Message>>`. /// /// [`application`]: self::application() pub trait View<'a, State, Message> { - /// The widget returned by the view logic. - type Widget: Into<Element<'a, Message>>; - /// Produces the widget of the [`Program`]. - fn view(&self, state: &'a State) -> Self::Widget; + fn view(&self, state: &'a State) -> impl Into<Element<'a, Message>>; } impl<'a, T, State, Message, Widget> View<'a, State, Message> for T @@ -724,9 +681,7 @@ where State: 'static, Widget: Into<Element<'a, Message>>, { - type Widget = Widget; - - fn view(&self, state: &'a State) -> Self::Widget { + fn view(&self, state: &'a State) -> impl Into<Element<'a, Message>> { self(state) } } |