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::widget;
use crate::core::window; use crate::core::window;
use crate::core::{Clipboard, Point, Rectangle, Size}; 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`]. /// A set of interactive graphical elements with a specific [`Layout`].
/// ///
@ -261,22 +261,23 @@ where
} }
} }
let base_cursor = manual_overlay let base_cursor = if manual_overlay
.as_ref() .as_mut()
.filter(|overlay| { .and_then(|overlay| {
cursor cursor.position().map(|cursor_position| {
.position() overlay.is_over(
.map(|cursor_position| { Layout::new(&layout),
overlay.is_over( renderer,
Layout::new(&layout), cursor_position,
renderer, )
cursor_position, })
)
})
.unwrap_or_default()
}) })
.map(|_| mouse::Cursor::Unavailable) .unwrap_or_default()
.unwrap_or(cursor); {
mouse::Cursor::Unavailable
} else {
cursor
};
self.overlay = Some(layout); self.overlay = Some(layout);
@ -434,7 +435,7 @@ where
let viewport = Rectangle::with_size(self.bounds); 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 .root
.as_widget_mut() .as_widget_mut()
.overlay(&mut self.state, Layout::new(&self.base), renderer) .overlay(&mut self.state, Layout::new(&self.base), renderer)
@ -503,7 +504,7 @@ where
root.as_widget_mut() root.as_widget_mut()
.overlay(&mut self.state, Layout::new(base), renderer) .overlay(&mut self.state, Layout::new(base), renderer)
.map(overlay::Nested::new) .map(overlay::Nested::new)
.map(|overlay| { .map(|mut overlay| {
let overlay_interaction = overlay.mouse_interaction( let overlay_interaction = overlay.mouse_interaction(
Layout::new(layout), Layout::new(layout),
cursor, cursor,

View file

@ -4,47 +4,25 @@ use crate::core::mouse;
use crate::core::overlay; use crate::core::overlay;
use crate::core::renderer; use crate::core::renderer;
use crate::core::widget; use crate::core::widget;
use crate::core::{ use crate::core::{Clipboard, Event, Layout, Point, Rectangle, Shell, Size};
Clipboard, Event, Layout, Overlay, Point, Rectangle, Shell, Size,
};
use std::cell::RefCell;
/// An [`Overlay`] container that displays nested overlays /// An [`Overlay`] container that displays nested overlays
#[allow(missing_debug_implementations)] #[allow(missing_debug_implementations)]
pub struct Nested<'a, Message, Renderer> { 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>
/// 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>
where where
Renderer: renderer::Renderer, Renderer: renderer::Renderer,
{ {
fn layout( /// Creates a nested overlay from the provided [`overlay::Element`]
&self, pub fn new(element: overlay::Element<'a, Message, Renderer>) -> Self {
Self { overlay: element }
}
pub fn layout(
&mut self,
renderer: &Renderer, renderer: &Renderer,
bounds: Size, bounds: Size,
position: Point, position: Point,
@ -77,13 +55,11 @@ where
} }
} }
self.overlay.with_element_mut(|element| { recurse(&mut self.overlay, renderer, bounds, position)
recurse(element, renderer, bounds, position)
})
} }
fn draw( pub fn draw(
&self, &mut self,
renderer: &mut Renderer, renderer: &mut Renderer,
theme: &<Renderer as renderer::Renderer>::Theme, theme: &<Renderer as renderer::Renderer>::Theme,
style: &renderer::Style, style: &renderer::Style,
@ -148,12 +124,10 @@ where
} }
} }
self.overlay.with_element_mut(|element| { recurse(&mut self.overlay, layout, renderer, theme, style, cursor);
recurse(element, layout, renderer, theme, style, cursor);
})
} }
fn operate( pub fn operate(
&mut self, &mut self,
layout: Layout<'_>, layout: Layout<'_>,
renderer: &Renderer, 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, &mut self,
event: Event, event: Event,
layout: Layout<'_>, layout: Layout<'_>,
@ -236,7 +210,7 @@ where
} }
recurse( recurse(
self.overlay.0.get_mut(), &mut self.overlay,
layout, layout,
event, event,
cursor, cursor,
@ -246,8 +220,8 @@ where
) )
} }
fn mouse_interaction( pub fn mouse_interaction(
&self, &mut self,
layout: Layout<'_>, layout: Layout<'_>,
cursor: mouse::Cursor, cursor: mouse::Cursor,
viewport: &Rectangle, viewport: &Rectangle,
@ -293,15 +267,12 @@ where
) )
} }
self.overlay recurse(&mut self.overlay, layout, cursor, viewport, renderer)
.with_element_mut(|element| {
recurse(element, layout, cursor, viewport, renderer)
})
.unwrap_or_default() .unwrap_or_default()
} }
fn is_over( pub fn is_over(
&self, &mut self,
layout: Layout<'_>, layout: Layout<'_>,
renderer: &Renderer, renderer: &Renderer,
cursor_position: Point, cursor_position: Point,
@ -339,16 +310,6 @@ where
} }
} }
self.overlay.with_element_mut(|element| { recurse(&mut self.overlay, layout, renderer, cursor_position)
recurse(element, layout, renderer, cursor_position)
})
}
fn overlay<'b>(
&'b mut self,
_layout: Layout<'_>,
_renderer: &Renderer,
) -> Option<overlay::Element<'b, Message, Renderer>> {
None
} }
} }