summaryrefslogtreecommitdiffstats
path: root/runtime/src
diff options
context:
space:
mode:
authorLibravatar Cory Forsstrom <cforsstrom18@gmail.com>2023-02-18 19:03:52 -0800
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-06-14 10:43:24 +0200
commit83140d6049c165020c2afc1db303b2556e40488e (patch)
tree29ee52dc86bc6f25179008ffd022ef176b39cebb /runtime/src
parent3e6f6eedcb51150b8a599530021cebdc629fddd2 (diff)
downloadiced-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.rs37
-rw-r--r--runtime/src/user_interface/overlay.rs85
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)
}
}