summaryrefslogtreecommitdiffstats
path: root/core/src/overlay
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/overlay')
-rw-r--r--core/src/overlay/element.rs37
-rw-r--r--core/src/overlay/group.rs17
2 files changed, 35 insertions, 19 deletions
diff --git a/core/src/overlay/element.rs b/core/src/overlay/element.rs
index c2134343..a279fe28 100644
--- a/core/src/overlay/element.rs
+++ b/core/src/overlay/element.rs
@@ -13,6 +13,7 @@ use std::any::Any;
#[allow(missing_debug_implementations)]
pub struct Element<'a, Message, Renderer> {
position: Point,
+ translation: Vector,
overlay: Box<dyn Overlay<Message, Renderer> + 'a>,
}
@@ -25,7 +26,11 @@ where
position: Point,
overlay: Box<dyn Overlay<Message, Renderer> + 'a>,
) -> Self {
- Self { position, overlay }
+ Self {
+ position,
+ overlay,
+ translation: Vector::ZERO,
+ }
}
/// Returns the position of the [`Element`].
@@ -36,6 +41,7 @@ where
/// Translates the [`Element`].
pub fn translate(mut self, translation: Vector) -> Self {
self.position = self.position + translation;
+ self.translation = self.translation + translation;
self
}
@@ -48,19 +54,24 @@ where
{
Element {
position: self.position,
+ translation: self.translation,
overlay: Box::new(Map::new(self.overlay, f)),
}
}
/// Computes the layout of the [`Element`] in the given bounds.
pub fn layout(
- &self,
+ &mut self,
renderer: &Renderer,
bounds: Size,
translation: Vector,
) -> layout::Node {
- self.overlay
- .layout(renderer, bounds, self.position + translation)
+ self.overlay.layout(
+ renderer,
+ bounds,
+ self.position + translation,
+ self.translation + translation,
+ )
}
/// Processes a runtime [`Event`].
@@ -98,7 +109,7 @@ where
layout: Layout<'_>,
cursor: mouse::Cursor,
) {
- self.overlay.draw(renderer, theme, style, layout, cursor)
+ self.overlay.draw(renderer, theme, style, layout, cursor);
}
/// Applies a [`widget::Operation`] to the [`Element`].
@@ -150,12 +161,13 @@ where
Renderer: crate::Renderer,
{
fn layout(
- &self,
+ &mut self,
renderer: &Renderer,
bounds: Size,
position: Point,
+ translation: Vector,
) -> layout::Node {
- self.content.layout(renderer, bounds, position)
+ self.content.layout(renderer, bounds, position, translation)
}
fn operate(
@@ -172,11 +184,12 @@ where
fn container(
&mut self,
id: Option<&widget::Id>,
+ bounds: Rectangle,
operate_on_children: &mut dyn FnMut(
&mut dyn widget::Operation<T>,
),
) {
- self.operation.container(id, &mut |operation| {
+ self.operation.container(id, bounds, &mut |operation| {
operate_on_children(&mut MapOperation { operation });
});
}
@@ -193,8 +206,10 @@ where
&mut self,
state: &mut dyn widget::operation::Scrollable,
id: Option<&widget::Id>,
+ bounds: Rectangle,
+ translation: Vector,
) {
- self.operation.scrollable(state, id);
+ self.operation.scrollable(state, id, bounds, translation);
}
fn text_input(
@@ -202,7 +217,7 @@ where
state: &mut dyn widget::operation::TextInput,
id: Option<&widget::Id>,
) {
- self.operation.text_input(state, id)
+ self.operation.text_input(state, id);
}
fn custom(&mut self, state: &mut dyn Any, id: Option<&widget::Id>) {
@@ -259,7 +274,7 @@ where
layout: Layout<'_>,
cursor: mouse::Cursor,
) {
- self.content.draw(renderer, theme, style, layout, cursor)
+ self.content.draw(renderer, theme, style, layout, cursor);
}
fn is_over(
diff --git a/core/src/overlay/group.rs b/core/src/overlay/group.rs
index deffaad0..e1e9727a 100644
--- a/core/src/overlay/group.rs
+++ b/core/src/overlay/group.rs
@@ -4,7 +4,9 @@ use crate::mouse;
use crate::overlay;
use crate::renderer;
use crate::widget;
-use crate::{Clipboard, Event, Layout, Overlay, Point, Rectangle, Shell, Size};
+use crate::{
+ Clipboard, Event, Layout, Overlay, Point, Rectangle, Shell, Size, Vector,
+};
/// An [`Overlay`] container that displays multiple overlay [`overlay::Element`]
/// children.
@@ -61,17 +63,16 @@ where
Renderer: crate::Renderer,
{
fn layout(
- &self,
+ &mut self,
renderer: &Renderer,
bounds: Size,
- position: Point,
+ _position: Point,
+ translation: Vector,
) -> layout::Node {
- let translation = position - Point::ORIGIN;
-
layout::Node::with_children(
bounds,
self.children
- .iter()
+ .iter_mut()
.map(|child| child.layout(renderer, bounds, translation))
.collect(),
)
@@ -138,12 +139,12 @@ where
renderer: &Renderer,
operation: &mut dyn widget::Operation<Message>,
) {
- operation.container(None, &mut |operation| {
+ operation.container(None, layout.bounds(), &mut |operation| {
self.children.iter_mut().zip(layout.children()).for_each(
|(child, layout)| {
child.operate(layout, renderer, operation);
},
- )
+ );
});
}