From 5137d655e6bbd29581fc1469d0385515113f2999 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Fri, 22 Mar 2024 07:09:51 +0100 Subject: Allow custom renderers in `Program` and `Application` --- src/application.rs | 18 ++++++++++------ src/lib.rs | 5 +++-- src/multi_window.rs | 4 ++-- src/program.rs | 60 ++++++++++++++++++++++++++++++++++++----------------- 4 files changed, 58 insertions(+), 29 deletions(-) (limited to 'src') diff --git a/src/application.rs b/src/application.rs index 8317abcb..62fe77da 100644 --- a/src/application.rs +++ b/src/application.rs @@ -1,4 +1,6 @@ //! Build interactive cross-platform applications. +use crate::core::text; +use crate::graphics::compositor; use crate::shell::application; use crate::{Command, Element, Executor, Settings, Subscription}; @@ -60,7 +62,7 @@ pub use application::{Appearance, DefaultStyle}; /// ```no_run /// use iced::advanced::Application; /// use iced::executor; -/// use iced::{Command, Element, Settings, Theme}; +/// use iced::{Command, Element, Settings, Theme, Renderer}; /// /// pub fn main() -> iced::Result { /// Hello::run(Settings::default()) @@ -73,6 +75,7 @@ pub use application::{Appearance, DefaultStyle}; /// type Flags = (); /// type Message = (); /// type Theme = Theme; +/// type Renderer = Renderer; /// /// fn new(_flags: ()) -> (Hello, Command) { /// (Hello, Command::none()) @@ -109,6 +112,9 @@ where /// The theme of your [`Application`]. type Theme: Default; + /// The renderer of your [`Application`]. + type Renderer: text::Renderer + compositor::Renderer; + /// The data needed to initialize your [`Application`]. type Flags; @@ -142,7 +148,7 @@ where /// Returns the widgets to display in the [`Application`]. /// /// These widgets can produce __messages__ based on user interaction. - fn view(&self) -> Element<'_, Self::Message, Self::Theme, crate::Renderer>; + fn view(&self) -> Element<'_, Self::Message, Self::Theme, Self::Renderer>; /// Returns the current [`Theme`] of the [`Application`]. /// @@ -195,7 +201,7 @@ where Self: 'static, { #[allow(clippy::needless_update)] - let renderer_settings = crate::renderer::Settings { + let renderer_settings = crate::graphics::Settings { default_font: settings.default_font, default_text_size: settings.default_text_size, antialiasing: if settings.antialiasing { @@ -203,13 +209,13 @@ where } else { None }, - ..crate::renderer::Settings::default() + ..crate::graphics::Settings::default() }; let run = crate::shell::application::run::< Instance, Self::Executor, - crate::renderer::Compositor, + ::Compositor, >(settings.into(), renderer_settings); #[cfg(target_arch = "wasm32")] @@ -241,7 +247,7 @@ where { type Message = A::Message; type Theme = A::Theme; - type Renderer = crate::Renderer; + type Renderer = A::Renderer; fn update(&mut self, message: Self::Message) -> Command { self.0.update(message) diff --git a/src/lib.rs b/src/lib.rs index 0e9566e2..171109e7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -372,15 +372,16 @@ pub type Result = std::result::Result<(), Error>; /// ] /// } /// ``` -pub fn run( +pub fn run( title: impl program::Title + 'static, update: impl program::Update + 'static, - view: impl for<'a> program::View<'a, State, Message, Theme> + 'static, + view: impl for<'a> program::View<'a, State, Message, Theme, Renderer> + 'static, ) -> Result where State: Default + 'static, Message: std::fmt::Debug + Send + 'static, Theme: Default + program::DefaultStyle + 'static, + Renderer: graphics::compositor::Renderer + core::text::Renderer + 'static, { program(title, update, view).run() } diff --git a/src/multi_window.rs b/src/multi_window.rs index fca0be46..b81297dc 100644 --- a/src/multi_window.rs +++ b/src/multi_window.rs @@ -174,7 +174,7 @@ where Self: 'static, { #[allow(clippy::needless_update)] - let renderer_settings = crate::renderer::Settings { + let renderer_settings = crate::graphics::Settings { default_font: settings.default_font, default_text_size: settings.default_text_size, antialiasing: if settings.antialiasing { @@ -182,7 +182,7 @@ where } else { None }, - ..crate::renderer::Settings::default() + ..crate::graphics::Settings::default() }; Ok(crate::shell::multi_window::run::< diff --git a/src/program.rs b/src/program.rs index 7a366585..f5a2bc53 100644 --- a/src/program.rs +++ b/src/program.rs @@ -32,6 +32,7 @@ //! ``` use crate::application::Application; use crate::executor::{self, Executor}; +use crate::graphics::compositor; use crate::window; use crate::{Command, Element, Font, Result, Settings, Size, Subscription}; @@ -67,37 +68,41 @@ use std::borrow::Cow; /// ] /// } /// ``` -pub fn program( +pub fn program( title: impl Title, update: impl Update, - view: impl for<'a> self::View<'a, State, Message, Theme>, + view: impl for<'a> self::View<'a, State, Message, Theme, Renderer>, ) -> Program> where State: 'static, Message: Send + std::fmt::Debug, Theme: Default + DefaultStyle, + Renderer: compositor::Renderer + crate::core::text::Renderer, { use std::marker::PhantomData; - struct Application { + struct Application { update: Update, view: View, _state: PhantomData, _message: PhantomData, _theme: PhantomData, + _renderer: PhantomData, } - impl Definition - for Application + impl Definition + for Application where Message: Send + std::fmt::Debug, Theme: Default + DefaultStyle, + Renderer: compositor::Renderer + crate::core::text::Renderer, Update: self::Update, - View: for<'a> self::View<'a, State, Message, Theme>, + View: for<'a> self::View<'a, State, Message, Theme, Renderer>, { type State = State; type Message = Message; type Theme = Theme; + type Renderer = Renderer; type Executor = executor::Default; fn load(&self) -> Command { @@ -115,7 +120,7 @@ where fn view<'a>( &self, state: &'a Self::State, - ) -> Element<'a, Self::Message, Self::Theme> { + ) -> Element<'a, Self::Message, Self::Theme, Self::Renderer> { self.view.view(state).into() } } @@ -127,6 +132,7 @@ where _state: PhantomData, _message: PhantomData, _theme: PhantomData, + _renderer: PhantomData, }, settings: Settings::default(), } @@ -184,6 +190,7 @@ impl Program

{ impl P::State> Application for Instance { type Message = P::Message; type Theme = P::Theme; + type Renderer = P::Renderer; type Flags = (P, I); type Executor = P::Executor; @@ -216,7 +223,7 @@ impl Program

{ fn view( &self, - ) -> crate::Element<'_, Self::Message, Self::Theme, crate::Renderer> + ) -> crate::Element<'_, Self::Message, Self::Theme, Self::Renderer> { self.program.view(&self.state) } @@ -417,6 +424,9 @@ pub trait Definition: Sized { /// The theme of the program. type Theme: Default + DefaultStyle; + /// The renderer of the program. + type Renderer: compositor::Renderer + crate::core::text::Renderer; + /// The executor of the program. type Executor: Executor; @@ -431,7 +441,7 @@ pub trait Definition: Sized { fn view<'a>( &self, state: &'a Self::State, - ) -> Element<'a, Self::Message, Self::Theme>; + ) -> Element<'a, Self::Message, Self::Theme, Self::Renderer>; fn title(&self, _state: &Self::State) -> String { String::from("A cool iced application!") @@ -470,6 +480,7 @@ fn with_title( type State = P::State; type Message = P::Message; type Theme = P::Theme; + type Renderer = P::Renderer; type Executor = P::Executor; fn load(&self) -> Command { @@ -491,7 +502,7 @@ fn with_title( fn view<'a>( &self, state: &'a Self::State, - ) -> Element<'a, Self::Message, Self::Theme> { + ) -> Element<'a, Self::Message, Self::Theme, Self::Renderer> { self.program.view(state) } @@ -534,6 +545,7 @@ fn with_load( type State = P::State; type Message = P::Message; type Theme = P::Theme; + type Renderer = P::Renderer; type Executor = executor::Default; fn load(&self) -> Command { @@ -551,7 +563,7 @@ fn with_load( fn view<'a>( &self, state: &'a Self::State, - ) -> Element<'a, Self::Message, Self::Theme> { + ) -> Element<'a, Self::Message, Self::Theme, Self::Renderer> { self.program.view(state) } @@ -598,6 +610,7 @@ fn with_subscription( type State = P::State; type Message = P::Message; type Theme = P::Theme; + type Renderer = P::Renderer; type Executor = executor::Default; fn subscription( @@ -622,7 +635,7 @@ fn with_subscription( fn view<'a>( &self, state: &'a Self::State, - ) -> Element<'a, Self::Message, Self::Theme> { + ) -> Element<'a, Self::Message, Self::Theme, Self::Renderer> { self.program.view(state) } @@ -665,6 +678,7 @@ fn with_theme( type State = P::State; type Message = P::Message; type Theme = P::Theme; + type Renderer = P::Renderer; type Executor = P::Executor; fn theme(&self, state: &Self::State) -> Self::Theme { @@ -690,7 +704,7 @@ fn with_theme( fn view<'a>( &self, state: &'a Self::State, - ) -> Element<'a, Self::Message, Self::Theme> { + ) -> Element<'a, Self::Message, Self::Theme, Self::Renderer> { self.program.view(state) } @@ -729,6 +743,7 @@ fn with_style( type State = P::State; type Message = P::Message; type Theme = P::Theme; + type Renderer = P::Renderer; type Executor = P::Executor; fn style( @@ -758,7 +773,7 @@ fn with_style( fn view<'a>( &self, state: &'a Self::State, - ) -> Element<'a, Self::Message, Self::Theme> { + ) -> Element<'a, Self::Message, Self::Theme, Self::Renderer> { self.program.view(state) } @@ -834,18 +849,25 @@ where /// /// This trait allows the [`program`] builder to take any closure that /// returns any `Into>`. -pub trait View<'a, State, Message, Theme> { +pub trait View<'a, State, Message, Theme, Renderer> { /// Produces the widget of the [`Program`]. - fn view(&self, state: &'a State) -> impl Into>; + fn view( + &self, + state: &'a State, + ) -> impl Into>; } -impl<'a, T, State, Message, Theme, Widget> View<'a, State, Message, Theme> for T +impl<'a, T, State, Message, Theme, Renderer, Widget> + View<'a, State, Message, Theme, Renderer> for T where T: Fn(&'a State) -> Widget, State: 'static, - Widget: Into>, + Widget: Into>, { - fn view(&self, state: &'a State) -> impl Into> { + fn view( + &self, + state: &'a State, + ) -> impl Into> { self(state) } } -- cgit From 441e9237cd1c9c9b61d9b144b5b4dafa236ace28 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Fri, 22 Mar 2024 19:35:19 +0100 Subject: Rename `compositor::Renderer` to `Default` --- src/application.rs | 4 ++-- src/lib.rs | 2 +- src/program.rs | 12 +++++++++--- 3 files changed, 12 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/application.rs b/src/application.rs index 62fe77da..9197834b 100644 --- a/src/application.rs +++ b/src/application.rs @@ -113,7 +113,7 @@ where type Theme: Default; /// The renderer of your [`Application`]. - type Renderer: text::Renderer + compositor::Renderer; + type Renderer: text::Renderer + compositor::Default; /// The data needed to initialize your [`Application`]. type Flags; @@ -215,7 +215,7 @@ where let run = crate::shell::application::run::< Instance, Self::Executor, - ::Compositor, + ::Compositor, >(settings.into(), renderer_settings); #[cfg(target_arch = "wasm32")] diff --git a/src/lib.rs b/src/lib.rs index 171109e7..e67b46e3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -381,7 +381,7 @@ where State: Default + 'static, Message: std::fmt::Debug + Send + 'static, Theme: Default + program::DefaultStyle + 'static, - Renderer: graphics::compositor::Renderer + core::text::Renderer + 'static, + Renderer: program::Renderer + 'static, { program(title, update, view).run() } diff --git a/src/program.rs b/src/program.rs index f5a2bc53..705e140d 100644 --- a/src/program.rs +++ b/src/program.rs @@ -31,6 +31,7 @@ //! } //! ``` use crate::application::Application; +use crate::core::text; use crate::executor::{self, Executor}; use crate::graphics::compositor; use crate::window; @@ -77,7 +78,7 @@ where State: 'static, Message: Send + std::fmt::Debug, Theme: Default + DefaultStyle, - Renderer: compositor::Renderer + crate::core::text::Renderer, + Renderer: self::Renderer, { use std::marker::PhantomData; @@ -95,7 +96,7 @@ where where Message: Send + std::fmt::Debug, Theme: Default + DefaultStyle, - Renderer: compositor::Renderer + crate::core::text::Renderer, + Renderer: self::Renderer, Update: self::Update, View: for<'a> self::View<'a, State, Message, Theme, Renderer>, { @@ -425,7 +426,7 @@ pub trait Definition: Sized { type Theme: Default + DefaultStyle; /// The renderer of the program. - type Renderer: compositor::Renderer + crate::core::text::Renderer; + type Renderer: Renderer + crate::core::text::Renderer; /// The executor of the program. type Executor: Executor; @@ -871,3 +872,8 @@ where self(state) } } + +/// The renderer of some [`Program`]. +pub trait Renderer: text::Renderer + compositor::Default {} + +impl Renderer for T where T: text::Renderer + compositor::Default {} -- cgit From 6a4f5ac2081699f7cf20c917b367366ab49eeef1 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 24 Mar 2024 08:45:11 +0100 Subject: Remove redundant `text::Renderer` bound in `program` --- src/program.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/program.rs b/src/program.rs index 705e140d..d4c2a266 100644 --- a/src/program.rs +++ b/src/program.rs @@ -426,7 +426,7 @@ pub trait Definition: Sized { type Theme: Default + DefaultStyle; /// The renderer of the program. - type Renderer: Renderer + crate::core::text::Renderer; + type Renderer: Renderer; /// The executor of the program. type Executor: Executor; -- cgit From f5bcfec8211c04c4b05f63d01d52d3e5d2cc123e Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Mon, 1 Apr 2024 11:59:46 +0200 Subject: Use `rustc-hash` for most of our `HashMap` and `HashSet` instances --- src/advanced.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/advanced.rs b/src/advanced.rs index 306c3559..5826ba0f 100644 --- a/src/advanced.rs +++ b/src/advanced.rs @@ -9,10 +9,12 @@ pub use crate::core::renderer::{self, Renderer}; pub use crate::core::svg; pub use crate::core::text::{self, Text}; pub use crate::core::widget::{self, Widget}; -pub use crate::core::{Hasher, Shell}; +pub use crate::core::Shell; pub use crate::renderer::graphics; pub mod subscription { //! Write your own subscriptions. - pub use crate::runtime::futures::subscription::{EventStream, Recipe}; + pub use crate::runtime::futures::subscription::{ + EventStream, Hasher, Recipe, + }; } -- cgit From 5cd98f069dea8720bca7748d6c12fa410cbe79b5 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 7 Apr 2024 12:42:12 +0200 Subject: Use built-in `[lints]` table in `Cargo.toml` --- src/lib.rs | 7 ------- 1 file changed, 7 deletions(-) (limited to 'src') diff --git a/src/lib.rs b/src/lib.rs index e67b46e3..c96c28a3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -165,13 +165,6 @@ #![doc( html_logo_url = "https://raw.githubusercontent.com/iced-rs/iced/9ab6923e943f784985e9ef9ca28b10278297225d/docs/logo.svg" )] -#![forbid(rust_2018_idioms, unsafe_code)] -#![deny( - missing_debug_implementations, - missing_docs, - unused_results, - rustdoc::broken_intra_doc_links -)] #![cfg_attr(docsrs, feature(doc_auto_cfg))] #![cfg_attr(docsrs, feature(doc_cfg))] use iced_widget::graphics; -- cgit From f3a2255f830e52d68c6bf0aaebc1e4164d66f2d8 Mon Sep 17 00:00:00 2001 From: saihaze Date: Fri, 19 Apr 2024 14:53:38 +0800 Subject: Fix typo --- src/window/icon.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/window/icon.rs b/src/window/icon.rs index ef71c228..7fe4ca7b 100644 --- a/src/window/icon.rs +++ b/src/window/icon.rs @@ -54,7 +54,7 @@ pub enum Error { InvalidError(#[from] icon::Error), /// The underlying OS failed to create the icon. - #[error("The underlying OS failted to create the window icon: {0}")] + #[error("The underlying OS failed to create the window icon: {0}")] OsError(#[from] io::Error), /// The `image` crate reported an error. -- cgit From f6c698b2dd09288203e5732c2051661ee0580e76 Mon Sep 17 00:00:00 2001 From: JL710 <76447362+JL710@users.noreply.github.com> Date: Tue, 30 Apr 2024 10:28:06 +0200 Subject: add missing derive(Debug) in lib.rs docs --- src/lib.rs | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/lib.rs b/src/lib.rs index c96c28a3..7517dd14 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -51,6 +51,7 @@ //! We start by modelling the __state__ of our application: //! //! ``` +//! #[derive(Default)] //! struct Counter { //! // The counter value //! value: i32, -- cgit From 09a6bcfffc24f5abdc8709403bab7ae1e01563f1 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 2 May 2024 13:15:17 +0200 Subject: Add `Image` rotation support Co-authored-by: DKolter <68352124+DKolter@users.noreply.github.com> --- src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/lib.rs b/src/lib.rs index 7517dd14..9d07fed6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -200,8 +200,8 @@ pub use crate::core::gradient; pub use crate::core::theme; pub use crate::core::{ Alignment, Background, Border, Color, ContentFit, Degrees, Gradient, - Length, Padding, Pixels, Point, Radians, Rectangle, Shadow, Size, Theme, - Transformation, Vector, + Length, Padding, Pixels, Point, Radians, Rectangle, RotationLayout, Shadow, + Size, Theme, Transformation, Vector, }; pub mod clipboard { -- cgit From a57313b23ecb9843856ca0ea08635b6121fcb2cb Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 2 May 2024 15:21:22 +0200 Subject: Simplify image rotation API and its internals --- src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/lib.rs b/src/lib.rs index 9d07fed6..50ee7ecc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -200,8 +200,8 @@ pub use crate::core::gradient; pub use crate::core::theme; pub use crate::core::{ Alignment, Background, Border, Color, ContentFit, Degrees, Gradient, - Length, Padding, Pixels, Point, Radians, Rectangle, RotationLayout, Shadow, - Size, Theme, Transformation, Vector, + Length, Padding, Pixels, Point, Radians, Rectangle, Rotation, Shadow, Size, + Theme, Transformation, Vector, }; pub mod clipboard { -- cgit From 2645524f88414393d8b3ca9c6fe801b32b5ebd33 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 7 May 2024 15:50:18 +0200 Subject: Update `winit` to `0.30` --- src/application.rs | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/application.rs b/src/application.rs index 9197834b..d12ba73d 100644 --- a/src/application.rs +++ b/src/application.rs @@ -212,26 +212,11 @@ where ..crate::graphics::Settings::default() }; - let run = crate::shell::application::run::< + Ok(crate::shell::application::run::< Instance, Self::Executor, ::Compositor, - >(settings.into(), renderer_settings); - - #[cfg(target_arch = "wasm32")] - { - use crate::futures::FutureExt; - use iced_futures::backend::wasm::wasm_bindgen::Executor; - - Executor::new() - .expect("Create Wasm executor") - .spawn(run.map(|_| ())); - - Ok(()) - } - - #[cfg(not(target_arch = "wasm32"))] - Ok(crate::futures::executor::block_on(run)?) + >(settings.into(), renderer_settings)?) } } -- cgit