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.
This commit is contained in:
Cory Forsstrom 2023-02-18 19:03:52 -08:00 committed by Héctor Ramón Jiménez
parent 3e6f6eedcb
commit 83140d6049
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
2 changed files with 43 additions and 81 deletions

View file

@ -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,

View file

@ -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> {
/// 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)),
}
}
}
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>
impl<'a, Message, Renderer> Nested<'a, Message, Renderer>
where
Renderer: renderer::Renderer,
{
fn layout(
&self,
/// Creates a nested overlay from the provided [`overlay::Element`]
pub fn new(element: overlay::Element<'a, Message, Renderer>) -> Self {
Self { overlay: element }
}
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)
}
}