From 6ab4611a6eec9c4bb4ca1ff1bb580bb7edf49add Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 11 Jan 2022 13:47:43 +0700 Subject: Invalidate widget tree from `Responsive` widget ... by introducing a new `invalidate_widgets` method to `Shell` --- lazy/src/component.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lazy/src/component.rs') diff --git a/lazy/src/component.rs b/lazy/src/component.rs index fd3f6ff7..48ee1d87 100644 --- a/lazy/src/component.rs +++ b/lazy/src/component.rs @@ -149,7 +149,7 @@ where ) }); - local_shell.with_invalid_layout(|| shell.invalidate_layout()); + local_shell.revalidate_layout(|| shell.invalidate_layout()); if !local_messages.is_empty() { let mut component = self @@ -375,7 +375,7 @@ where }) .unwrap_or_else(|| iced_native::event::Status::Ignored); - local_shell.with_invalid_layout(|| shell.invalidate_layout()); + local_shell.revalidate_layout(|| shell.invalidate_layout()); if !local_messages.is_empty() { let mut component = -- cgit From 810e086728e938d1d12758c7b486c1e371127349 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 11 Jan 2022 14:12:28 +0700 Subject: Introduce `Renderer` argument to `mouse_interaction` and `on_event` --- lazy/src/component.rs | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) (limited to 'lazy/src/component.rs') diff --git a/lazy/src/component.rs b/lazy/src/component.rs index 48ee1d87..836c3f01 100644 --- a/lazy/src/component.rs +++ b/lazy/src/component.rs @@ -214,15 +214,22 @@ where layout: Layout<'_>, cursor_position: Point, viewport: &Rectangle, + renderer: &Renderer, ) -> mouse::Interaction { self.with_element(|element| { - element.mouse_interaction(layout, cursor_position, viewport) + element.mouse_interaction( + layout, + cursor_position, + viewport, + renderer, + ) }) } fn overlay( &mut self, layout: Layout<'_>, + renderer: &Renderer, ) -> Option> { let has_overlay = self .state @@ -236,7 +243,9 @@ where CacheBuilder { element, message: PhantomData, - overlay_builder: |element| element.overlay(layout), + overlay_builder: |element| { + element.overlay(layout, renderer) + }, } .build(), ); @@ -331,9 +340,15 @@ where layout: Layout<'_>, cursor_position: Point, viewport: &Rectangle, + renderer: &Renderer, ) -> mouse::Interaction { self.with_overlay_maybe(|overlay| { - overlay.mouse_interaction(layout, cursor_position, viewport) + overlay.mouse_interaction( + layout, + cursor_position, + viewport, + renderer, + ) }) .unwrap_or_default() } @@ -397,7 +412,7 @@ where element: state.view(), message: PhantomData, overlay_builder: |element| { - element.overlay(layout) + element.overlay(layout, renderer) }, } .build(), -- cgit From 5a03cac7e75ccb8ca87a97def723694be0471742 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 11 Jan 2022 14:55:48 +0700 Subject: Remove superfluous generic type in `iced_lazy::Cache` --- lazy/src/component.rs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) (limited to 'lazy/src/component.rs') diff --git a/lazy/src/component.rs b/lazy/src/component.rs index 836c3f01..ca0d115c 100644 --- a/lazy/src/component.rs +++ b/lazy/src/component.rs @@ -24,11 +24,11 @@ where state: RefCell::new(Some( StateBuilder { component: Box::new(component), + message: PhantomData, cache_builder: |state| { Some( CacheBuilder { element: state.view(), - message: PhantomData, overlay_builder: |_| None, } .build(), @@ -55,20 +55,20 @@ struct Instance<'a, Message, Renderer, Event> { #[self_referencing] struct State<'a, Message: 'a, Renderer: 'a, Event: 'a> { component: Box + 'a>, + message: PhantomData, #[borrows(mut component)] #[covariant] - cache: Option>, + cache: Option>, } #[self_referencing] -struct Cache<'a, Message, Renderer: 'a, Event: 'a> { - element: Element<'a, Event, Renderer>, - message: PhantomData, +struct Cache<'a, Message: 'a, Renderer: 'a> { + element: Element<'a, Message, Renderer>, #[borrows(mut element)] #[covariant] - overlay: Option>, + overlay: Option>, } impl<'a, Message, Renderer, Event> Instance<'a, Message, Renderer, Event> { @@ -94,7 +94,6 @@ impl<'a, Message, Renderer, Event> Instance<'a, Message, Renderer, Event> { *cache = Some( CacheBuilder { element, - message: PhantomData, overlay_builder: |_| None, } .build(), @@ -170,11 +169,11 @@ where *self.state.borrow_mut() = Some( StateBuilder { component, + message: PhantomData, cache_builder: |state| { Some( CacheBuilder { element: state.view(), - message: PhantomData, overlay_builder: |_| None, } .build(), @@ -242,7 +241,6 @@ where *cache = Some( CacheBuilder { element, - message: PhantomData, overlay_builder: |element| { element.overlay(layout, renderer) }, @@ -406,11 +404,11 @@ where self.instance.state = RefCell::new(Some( StateBuilder { component, + message: PhantomData, cache_builder: |state| { Some( CacheBuilder { element: state.view(), - message: PhantomData, overlay_builder: |element| { element.overlay(layout, renderer) }, -- cgit From 870d651f35c4dad12c805951fca70213816983de Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Wed, 12 Jan 2022 11:15:05 +0700 Subject: Implement `Widget::overlay` for `Responsive` widget --- lazy/src/component.rs | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) (limited to 'lazy/src/component.rs') diff --git a/lazy/src/component.rs b/lazy/src/component.rs index ca0d115c..ae8d6bbe 100644 --- a/lazy/src/component.rs +++ b/lazy/src/component.rs @@ -1,3 +1,5 @@ +use crate::{Cache, CacheBuilder}; + use iced_native::event; use iced_native::layout::{self, Layout}; use iced_native::mouse; @@ -62,15 +64,6 @@ struct State<'a, Message: 'a, Renderer: 'a, Event: 'a> { cache: Option>, } -#[self_referencing] -struct Cache<'a, Message: 'a, Renderer: 'a> { - element: Element<'a, Message, Renderer>, - - #[borrows(mut element)] - #[covariant] - overlay: Option>, -} - impl<'a, Message, Renderer, Event> Instance<'a, Message, Renderer, Event> { fn with_element( &self, -- cgit From 241e123c9b49bb5f8c6bf223eef666c94042dd8f Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Wed, 12 Jan 2022 11:39:54 +0700 Subject: Write documentation for `component` in `iced_lazy` --- lazy/src/component.rs | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) (limited to 'lazy/src/component.rs') diff --git a/lazy/src/component.rs b/lazy/src/component.rs index ae8d6bbe..2b729045 100644 --- a/lazy/src/component.rs +++ b/lazy/src/component.rs @@ -1,3 +1,4 @@ +//! Build and reuse custom widgets using The Elm Architecture. use crate::{Cache, CacheBuilder}; use iced_native::event; @@ -14,6 +15,35 @@ use std::cell::RefCell; use std::hash::Hash; use std::marker::PhantomData; +/// A reusable, custom widget that uses The Elm Architecture. +/// +/// A [`Component`] allows you to implement custom widgets as if they were +/// `iced` applications with encapsulated state. +/// +/// In other words, a [`Component`] allows you to turn `iced` applications into +/// custom widgets and embed them without cumbersome wiring. +/// +/// A [`Component`] produces widgets that may fire an [`Event`](Component::Event) +/// and update the internal state of the [`Component`]. +/// +/// Additionally, a [`Component`] is capable of producing a `Message` to notify +/// the parent application of any relevant interactions. +pub trait Component { + /// The type of event this [`Component`] handles internally. + type Event; + + /// Processes an [`Event`](Component::Event) and updates the [`Component`] state accordingly. + /// + /// It can produce a `Message` for the parent application. + fn update(&mut self, event: Self::Event) -> Option; + + /// Produces the widgets of the [`Component`], which may trigger an [`Event`](Component::Event) + /// on user interaction. + fn view(&mut self) -> Element; +} + +/// Turns an implementor of [`Component`] into an [`Element`] that can be +/// embedded in any application. pub fn view<'a, C, Message, Renderer>( component: C, ) -> Element<'a, Message, Renderer> @@ -42,14 +72,6 @@ where }) } -pub trait Component { - type Event; - - fn update(&mut self, event: Self::Event) -> Option; - - fn view(&mut self) -> Element; -} - struct Instance<'a, Message, Renderer, Event> { state: RefCell>>, } -- cgit