diff options
author | 2023-02-18 19:03:52 -0800 | |
---|---|---|
committer | 2023-06-14 10:43:24 +0200 | |
commit | 83140d6049c165020c2afc1db303b2556e40488e (patch) | |
tree | 29ee52dc86bc6f25179008ffd022ef176b39cebb /runtime/src | |
parent | 3e6f6eedcb51150b8a599530021cebdc629fddd2 (diff) | |
download | iced-83140d6049c165020c2afc1db303b2556e40488e.tar.gz iced-83140d6049c165020c2afc1db303b2556e40488e.tar.bz2 iced-83140d6049c165020c2afc1db303b2556e40488e.zip |
Remove interior mutability
Nested doesn't need to implement Overlay trait, it can be be used
mutably in user interface so we don't need interior mutability.
Diffstat (limited to 'runtime/src')
-rw-r--r-- | runtime/src/user_interface.rs | 37 | ||||
-rw-r--r-- | runtime/src/user_interface/overlay.rs | 85 |
2 files changed, 42 insertions, 80 deletions
diff --git a/runtime/src/user_interface.rs b/runtime/src/user_interface.rs index 8ae0363a..1d55970e 100644 --- a/runtime/src/user_interface.rs +++ b/runtime/src/user_interface.rs @@ -8,7 +8,7 @@ use crate::core::renderer; use crate::core::widget; use crate::core::window; use crate::core::{Clipboard, Point, Rectangle, Size}; -use crate::core::{Element, Layout, Overlay, Shell}; +use crate::core::{Element, Layout, Shell}; /// A set of interactive graphical elements with a specific [`Layout`]. /// @@ -261,22 +261,23 @@ where } } - let base_cursor = manual_overlay - .as_ref() - .filter(|overlay| { - cursor - .position() - .map(|cursor_position| { - overlay.is_over( - Layout::new(&layout), - renderer, - cursor_position, - ) - }) - .unwrap_or_default() + let base_cursor = if manual_overlay + .as_mut() + .and_then(|overlay| { + cursor.position().map(|cursor_position| { + overlay.is_over( + Layout::new(&layout), + renderer, + cursor_position, + ) + }) }) - .map(|_| mouse::Cursor::Unavailable) - .unwrap_or(cursor); + .unwrap_or_default() + { + mouse::Cursor::Unavailable + } else { + cursor + }; self.overlay = Some(layout); @@ -434,7 +435,7 @@ where let viewport = Rectangle::with_size(self.bounds); - let base_cursor = if let Some(overlay) = self + let base_cursor = if let Some(mut overlay) = self .root .as_widget_mut() .overlay(&mut self.state, Layout::new(&self.base), renderer) @@ -503,7 +504,7 @@ where root.as_widget_mut() .overlay(&mut self.state, Layout::new(base), renderer) .map(overlay::Nested::new) - .map(|overlay| { + .map(|mut overlay| { let overlay_interaction = overlay.mouse_interaction( Layout::new(layout), cursor, diff --git a/runtime/src/user_interface/overlay.rs b/runtime/src/user_interface/overlay.rs index c495bb28..24ddb649 100644 --- a/runtime/src/user_interface/overlay.rs +++ b/runtime/src/user_interface/overlay.rs @@ -4,47 +4,25 @@ use crate::core::mouse; use crate::core::overlay; use crate::core::renderer; use crate::core::widget; -use crate::core::{ - Clipboard, Event, Layout, Overlay, Point, Rectangle, Shell, Size, -}; - -use std::cell::RefCell; +use crate::core::{Clipboard, Event, Layout, Point, Rectangle, Shell, Size}; /// An [`Overlay`] container that displays nested overlays #[allow(missing_debug_implementations)] pub struct Nested<'a, Message, Renderer> { - overlay: Inner<'a, Message, Renderer>, + overlay: overlay::Element<'a, Message, Renderer>, } -impl<'a, Message, Renderer> Nested<'a, Message, Renderer> { +impl<'a, Message, Renderer> Nested<'a, Message, Renderer> +where + Renderer: renderer::Renderer, +{ /// Creates a nested overlay from the provided [`overlay::Element`] pub fn new(element: overlay::Element<'a, Message, Renderer>) -> Self { - Self { - overlay: Inner(RefCell::new(element)), - } + Self { overlay: element } } -} - -struct Inner<'a, Message, Renderer>( - RefCell<overlay::Element<'a, Message, Renderer>>, -); - -impl<'a, Message, Renderer> Inner<'a, Message, Renderer> { - fn with_element_mut<T>( - &self, - mut f: impl FnMut(&mut overlay::Element<'_, Message, Renderer>) -> T, - ) -> T { - (f)(&mut self.0.borrow_mut()) - } -} -impl<'a, Message, Renderer> Overlay<Message, Renderer> - for Nested<'a, Message, Renderer> -where - Renderer: renderer::Renderer, -{ - fn layout( - &self, + pub fn layout( + &mut self, renderer: &Renderer, bounds: Size, position: Point, @@ -77,13 +55,11 @@ where } } - self.overlay.with_element_mut(|element| { - recurse(element, renderer, bounds, position) - }) + recurse(&mut self.overlay, renderer, bounds, position) } - fn draw( - &self, + pub fn draw( + &mut self, renderer: &mut Renderer, theme: &<Renderer as renderer::Renderer>::Theme, style: &renderer::Style, @@ -148,12 +124,10 @@ where } } - self.overlay.with_element_mut(|element| { - recurse(element, layout, renderer, theme, style, cursor); - }) + recurse(&mut self.overlay, layout, renderer, theme, style, cursor); } - fn operate( + pub fn operate( &mut self, layout: Layout<'_>, renderer: &Renderer, @@ -180,10 +154,10 @@ where } } - recurse(self.overlay.0.get_mut(), layout, renderer, operation) + recurse(&mut self.overlay, layout, renderer, operation) } - fn on_event( + pub fn on_event( &mut self, event: Event, layout: Layout<'_>, @@ -236,7 +210,7 @@ where } recurse( - self.overlay.0.get_mut(), + &mut self.overlay, layout, event, cursor, @@ -246,8 +220,8 @@ where ) } - fn mouse_interaction( - &self, + pub fn mouse_interaction( + &mut self, layout: Layout<'_>, cursor: mouse::Cursor, viewport: &Rectangle, @@ -293,15 +267,12 @@ where ) } - self.overlay - .with_element_mut(|element| { - recurse(element, layout, cursor, viewport, renderer) - }) + recurse(&mut self.overlay, layout, cursor, viewport, renderer) .unwrap_or_default() } - fn is_over( - &self, + pub fn is_over( + &mut self, layout: Layout<'_>, renderer: &Renderer, cursor_position: Point, @@ -339,16 +310,6 @@ where } } - self.overlay.with_element_mut(|element| { - recurse(element, layout, renderer, cursor_position) - }) - } - - fn overlay<'b>( - &'b mut self, - _layout: Layout<'_>, - _renderer: &Renderer, - ) -> Option<overlay::Element<'b, Message, Renderer>> { - None + recurse(&mut self.overlay, layout, renderer, cursor_position) } } |