diff options
-rw-r--r-- | examples/arc/src/main.rs | 2 | ||||
-rw-r--r-- | examples/bezier_tool/src/main.rs | 2 | ||||
-rw-r--r-- | examples/checkbox/src/main.rs | 2 | ||||
-rw-r--r-- | examples/clock/src/main.rs | 2 | ||||
-rw-r--r-- | examples/color_palette/src/main.rs | 2 | ||||
-rw-r--r-- | examples/custom_shader/src/main.rs | 10 | ||||
-rw-r--r-- | examples/download_progress/src/main.rs | 10 | ||||
-rw-r--r-- | examples/geometry/src/main.rs | 2 | ||||
-rw-r--r-- | examples/layout/src/main.rs | 2 | ||||
-rw-r--r-- | examples/loading_spinners/src/main.rs | 2 | ||||
-rw-r--r-- | examples/multitouch/src/main.rs | 2 | ||||
-rw-r--r-- | examples/pane_grid/src/main.rs | 2 | ||||
-rw-r--r-- | examples/qr_code/src/main.rs | 2 | ||||
-rw-r--r-- | examples/sierpinski_triangle/src/main.rs | 2 | ||||
-rw-r--r-- | examples/solar_system/src/main.rs | 2 | ||||
-rw-r--r-- | examples/stopwatch/src/main.rs | 2 | ||||
-rw-r--r-- | examples/styling/src/main.rs | 2 | ||||
-rw-r--r-- | examples/tour/src/main.rs | 2 | ||||
-rw-r--r-- | examples/url_handler/src/main.rs | 2 | ||||
-rw-r--r-- | examples/vectorial_text/src/main.rs | 2 | ||||
-rw-r--r-- | runtime/src/command.rs | 6 | ||||
-rw-r--r-- | src/lib.rs | 6 | ||||
-rw-r--r-- | src/program.rs | 123 |
23 files changed, 80 insertions, 111 deletions
diff --git a/examples/arc/src/main.rs b/examples/arc/src/main.rs index 12f34838..cd62ac17 100644 --- a/examples/arc/src/main.rs +++ b/examples/arc/src/main.rs @@ -7,7 +7,7 @@ use iced::widget::canvas::{ use iced::{Element, Length, Point, Rectangle, Renderer, Subscription, Theme}; pub fn main() -> iced::Result { - iced::sandbox("Arc - Iced", Arc::update, Arc::view) + iced::application("Arc - Iced", Arc::update, Arc::view) .subscription(Arc::subscription) .theme(|_| Theme::Dark) .antialiased() diff --git a/examples/bezier_tool/src/main.rs b/examples/bezier_tool/src/main.rs index 9f21508b..1d9f7ddb 100644 --- a/examples/bezier_tool/src/main.rs +++ b/examples/bezier_tool/src/main.rs @@ -3,7 +3,7 @@ use iced::widget::{button, column, text}; use iced::{Alignment, Element, Length}; pub fn main() -> iced::Result { - iced::sandbox("Bezier Tool - Iced", Example::update, Example::view) + iced::application("Bezier Tool - Iced", Example::update, Example::view) .antialiased() .run() } diff --git a/examples/checkbox/src/main.rs b/examples/checkbox/src/main.rs index 8d18cb81..6a3b9464 100644 --- a/examples/checkbox/src/main.rs +++ b/examples/checkbox/src/main.rs @@ -4,7 +4,7 @@ use iced::{Element, Font, Length}; const ICON_FONT: Font = Font::with_name("icons"); pub fn main() -> iced::Result { - iced::sandbox("Checkbox - Iced", Example::update, Example::view) + iced::application("Checkbox - Iced", Example::update, Example::view) .font(include_bytes!("../fonts/icons.ttf").as_slice()) .run() } diff --git a/examples/clock/src/main.rs b/examples/clock/src/main.rs index 5110c78e..318ca74c 100644 --- a/examples/clock/src/main.rs +++ b/examples/clock/src/main.rs @@ -8,7 +8,7 @@ use iced::{ }; pub fn main() -> iced::Result { - iced::sandbox("Clock - Iced", Clock::update, Clock::view) + iced::application("Clock - Iced", Clock::update, Clock::view) .subscription(Clock::subscription) .theme(Clock::theme) .antialiased() diff --git a/examples/color_palette/src/main.rs b/examples/color_palette/src/main.rs index 46fb3b49..b997563f 100644 --- a/examples/color_palette/src/main.rs +++ b/examples/color_palette/src/main.rs @@ -13,7 +13,7 @@ use std::marker::PhantomData; use std::ops::RangeInclusive; pub fn main() -> iced::Result { - iced::sandbox( + iced::application( "Color Palette - Iced", ColorPalette::update, ColorPalette::view, diff --git a/examples/custom_shader/src/main.rs b/examples/custom_shader/src/main.rs index 341b77b6..4457a15a 100644 --- a/examples/custom_shader/src/main.rs +++ b/examples/custom_shader/src/main.rs @@ -9,9 +9,13 @@ use iced::window; use iced::{Alignment, Color, Element, Length, Subscription}; fn main() -> iced::Result { - iced::sandbox("Custom Shader - Iced", IcedCubes::update, IcedCubes::view) - .subscription(IcedCubes::subscription) - .run() + iced::application( + "Custom Shader - Iced", + IcedCubes::update, + IcedCubes::view, + ) + .subscription(IcedCubes::subscription) + .run() } struct IcedCubes { diff --git a/examples/download_progress/src/main.rs b/examples/download_progress/src/main.rs index 06ebb9c6..8d7994c8 100644 --- a/examples/download_progress/src/main.rs +++ b/examples/download_progress/src/main.rs @@ -4,9 +4,13 @@ use iced::widget::{button, column, container, progress_bar, text, Column}; use iced::{Alignment, Element, Length, Subscription}; pub fn main() -> iced::Result { - iced::sandbox("Download Progress - Iced", Example::update, Example::view) - .subscription(Example::subscription) - .run() + iced::application( + "Download Progress - Iced", + Example::update, + Example::view, + ) + .subscription(Example::subscription) + .run() } #[derive(Debug)] diff --git a/examples/geometry/src/main.rs b/examples/geometry/src/main.rs index 52c10c33..63efcbdd 100644 --- a/examples/geometry/src/main.rs +++ b/examples/geometry/src/main.rs @@ -151,7 +151,7 @@ use iced::{Element, Length}; use rainbow::rainbow; pub fn main() -> iced::Result { - iced::run("Custom 2D Geometry - Iced", |_, _| {}, view) + iced::run("Custom 2D Geometry - Iced", |_: &mut _, _| {}, view) } fn view(_state: &()) -> Element<'_, ()> { diff --git a/examples/layout/src/main.rs b/examples/layout/src/main.rs index 371f2ae2..e6b521b2 100644 --- a/examples/layout/src/main.rs +++ b/examples/layout/src/main.rs @@ -10,7 +10,7 @@ use iced::{ }; pub fn main() -> iced::Result { - iced::sandbox(Layout::title, Layout::update, Layout::view) + iced::application(Layout::title, Layout::update, Layout::view) .subscription(Layout::subscription) .theme(Layout::theme) .run() diff --git a/examples/loading_spinners/src/main.rs b/examples/loading_spinners/src/main.rs index e50cd04c..c3308134 100644 --- a/examples/loading_spinners/src/main.rs +++ b/examples/loading_spinners/src/main.rs @@ -11,7 +11,7 @@ use circular::Circular; use linear::Linear; pub fn main() -> iced::Result { - iced::sandbox( + iced::application( "Loading Spinners - Iced", LoadingSpinners::update, LoadingSpinners::view, diff --git a/examples/multitouch/src/main.rs b/examples/multitouch/src/main.rs index f3413964..985c0ab9 100644 --- a/examples/multitouch/src/main.rs +++ b/examples/multitouch/src/main.rs @@ -13,7 +13,7 @@ use std::collections::HashMap; pub fn main() -> iced::Result { tracing_subscriber::fmt::init(); - iced::sandbox("Multitouch - Iced", Multitouch::update, Multitouch::view) + iced::application("Multitouch - Iced", Multitouch::update, Multitouch::view) .antialiased() .centered() .run() diff --git a/examples/pane_grid/src/main.rs b/examples/pane_grid/src/main.rs index 4c46f550..439e9ee5 100644 --- a/examples/pane_grid/src/main.rs +++ b/examples/pane_grid/src/main.rs @@ -7,7 +7,7 @@ use iced::widget::{ use iced::{Color, Element, Length, Size, Subscription}; pub fn main() -> iced::Result { - iced::sandbox("Pane Grid - Iced", Example::update, Example::view) + iced::application("Pane Grid - Iced", Example::update, Example::view) .subscription(Example::subscription) .run() } diff --git a/examples/qr_code/src/main.rs b/examples/qr_code/src/main.rs index a980bfd7..1a23331d 100644 --- a/examples/qr_code/src/main.rs +++ b/examples/qr_code/src/main.rs @@ -4,7 +4,7 @@ use iced::widget::{ use iced::{Alignment, Element, Length, Theme}; pub fn main() -> iced::Result { - iced::sandbox( + iced::application( "QR Code Generator - Iced", QRGenerator::update, QRGenerator::view, diff --git a/examples/sierpinski_triangle/src/main.rs b/examples/sierpinski_triangle/src/main.rs index 82406e62..ee3039d8 100644 --- a/examples/sierpinski_triangle/src/main.rs +++ b/examples/sierpinski_triangle/src/main.rs @@ -8,7 +8,7 @@ use rand::Rng; use std::fmt::Debug; fn main() -> iced::Result { - iced::sandbox( + iced::application( "Sierpinski Triangle - Iced", SierpinskiEmulator::update, SierpinskiEmulator::view, diff --git a/examples/solar_system/src/main.rs b/examples/solar_system/src/main.rs index 06098a7c..40fd6b12 100644 --- a/examples/solar_system/src/main.rs +++ b/examples/solar_system/src/main.rs @@ -22,7 +22,7 @@ use std::time::Instant; pub fn main() -> iced::Result { tracing_subscriber::fmt::init(); - iced::sandbox( + iced::application( "Solar System - Iced", SolarSystem::update, SolarSystem::view, diff --git a/examples/stopwatch/src/main.rs b/examples/stopwatch/src/main.rs index 854cc084..2496b85b 100644 --- a/examples/stopwatch/src/main.rs +++ b/examples/stopwatch/src/main.rs @@ -7,7 +7,7 @@ use iced::{Alignment, Element, Length, Subscription, Theme}; use std::time::{Duration, Instant}; pub fn main() -> iced::Result { - iced::sandbox("Stopwatch - Iced", Stopwatch::update, Stopwatch::view) + iced::application("Stopwatch - Iced", Stopwatch::update, Stopwatch::view) .subscription(Stopwatch::subscription) .theme(Stopwatch::theme) .run() diff --git a/examples/styling/src/main.rs b/examples/styling/src/main.rs index 110bd3b8..ce14aacb 100644 --- a/examples/styling/src/main.rs +++ b/examples/styling/src/main.rs @@ -6,7 +6,7 @@ use iced::widget::{ use iced::{Alignment, Element, Length, Theme}; pub fn main() -> iced::Result { - iced::sandbox("Styling - Iced", Styling::update, Styling::view) + iced::application("Styling - Iced", Styling::update, Styling::view) .theme(Styling::theme) .run() } diff --git a/examples/tour/src/main.rs b/examples/tour/src/main.rs index 23c4040d..97ce761c 100644 --- a/examples/tour/src/main.rs +++ b/examples/tour/src/main.rs @@ -16,7 +16,7 @@ pub fn main() -> iced::Result { #[cfg(not(target_arch = "wasm32"))] tracing_subscriber::fmt::init(); - iced::sandbox(Tour::title, Tour::update, Tour::view) + iced::application(Tour::title, Tour::update, Tour::view) .centered() .run() } diff --git a/examples/url_handler/src/main.rs b/examples/url_handler/src/main.rs index f16b9051..540d927e 100644 --- a/examples/url_handler/src/main.rs +++ b/examples/url_handler/src/main.rs @@ -3,7 +3,7 @@ use iced::widget::{container, text}; use iced::{Element, Length, Subscription}; pub fn main() -> iced::Result { - iced::sandbox("URL Handler - Iced", App::update, App::view) + iced::application("URL Handler - Iced", App::update, App::view) .subscription(App::subscription) .run() } diff --git a/examples/vectorial_text/src/main.rs b/examples/vectorial_text/src/main.rs index 84347203..37961635 100644 --- a/examples/vectorial_text/src/main.rs +++ b/examples/vectorial_text/src/main.rs @@ -6,7 +6,7 @@ use iced::widget::{ use iced::{Element, Length, Point, Rectangle, Renderer, Theme, Vector}; pub fn main() -> iced::Result { - iced::sandbox( + iced::application( "Vectorial Text - Iced", VectorialText::update, VectorialText::view, diff --git a/runtime/src/command.rs b/runtime/src/command.rs index f70da915..f7a746fe 100644 --- a/runtime/src/command.rs +++ b/runtime/src/command.rs @@ -112,6 +112,12 @@ impl<T> Command<T> { } } +impl<Message> From<()> for Command<Message> { + fn from(_value: ()) -> Self { + Self::none() + } +} + impl<T> fmt::Debug for Command<T> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let Command(command) = self; @@ -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) } } |