summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2023-11-21 14:41:22 +0100
committerLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2023-11-21 14:41:22 +0100
commit25006b9c6f2ae909d86871d3a13631d518c07158 (patch)
treee4bf993c1073cde4c6a847e38f8165f6efcecb21
parent7dd32f3be43c72e11dac5e07918e9ad6d36b6555 (diff)
downloadiced-25006b9c6f2ae909d86871d3a13631d518c07158.tar.gz
iced-25006b9c6f2ae909d86871d3a13631d518c07158.tar.bz2
iced-25006b9c6f2ae909d86871d3a13631d518c07158.zip
Fix `Overlay` composition
Translations were not easily composable.
-rw-r--r--core/src/overlay.rs3
-rw-r--r--core/src/overlay/element.rs20
-rw-r--r--core/src/overlay/group.rs9
-rw-r--r--runtime/src/overlay/nested.rs18
-rw-r--r--runtime/src/user_interface.rs30
-rw-r--r--widget/src/lazy.rs5
-rw-r--r--widget/src/lazy/component.rs3
-rw-r--r--widget/src/lazy/responsive.rs6
-rw-r--r--widget/src/overlay/menu.rs1
-rw-r--r--widget/src/tooltip.rs1
10 files changed, 70 insertions, 26 deletions
diff --git a/core/src/overlay.rs b/core/src/overlay.rs
index f71f25f7..af10afee 100644
--- a/core/src/overlay.rs
+++ b/core/src/overlay.rs
@@ -11,7 +11,7 @@ use crate::mouse;
use crate::renderer;
use crate::widget;
use crate::widget::Tree;
-use crate::{Clipboard, Layout, Point, Rectangle, Shell, Size};
+use crate::{Clipboard, Layout, Point, Rectangle, Shell, Size, Vector};
/// An interactive component that can be displayed on top of other widgets.
pub trait Overlay<Message, Renderer>
@@ -29,6 +29,7 @@ where
renderer: &Renderer,
bounds: Size,
position: Point,
+ translation: Vector,
) -> layout::Node;
/// Draws the [`Overlay`] using the associated `Renderer`.
diff --git a/core/src/overlay/element.rs b/core/src/overlay/element.rs
index 3dd58f9b..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,6 +54,7 @@ where
{
Element {
position: self.position,
+ translation: self.translation,
overlay: Box::new(Map::new(self.overlay, f)),
}
}
@@ -59,8 +66,12 @@ where
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`].
@@ -154,8 +165,9 @@ where
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(
diff --git a/core/src/overlay/group.rs b/core/src/overlay/group.rs
index dccf6dba..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.
@@ -64,10 +66,9 @@ where
&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
diff --git a/runtime/src/overlay/nested.rs b/runtime/src/overlay/nested.rs
index 062ccc72..b7cfc918 100644
--- a/runtime/src/overlay/nested.rs
+++ b/runtime/src/overlay/nested.rs
@@ -4,7 +4,9 @@ use crate::core::mouse;
use crate::core::overlay;
use crate::core::renderer;
use crate::core::widget;
-use crate::core::{Clipboard, Event, Layout, Point, Rectangle, Shell, Size};
+use crate::core::{
+ Clipboard, Event, Layout, Point, Rectangle, Shell, Size, Vector,
+};
/// An overlay container that displays nested overlays
#[allow(missing_debug_implementations)]
@@ -34,18 +36,18 @@ where
renderer: &Renderer,
bounds: Size,
position: Point,
+ translation: Vector,
) -> layout::Node {
fn recurse<Message, Renderer>(
element: &mut overlay::Element<'_, Message, Renderer>,
renderer: &Renderer,
bounds: Size,
position: Point,
+ translation: Vector,
) -> layout::Node
where
Renderer: renderer::Renderer,
{
- let translation = position - Point::ORIGIN;
-
let node = element.layout(renderer, bounds, translation);
if let Some(mut nested) =
@@ -55,7 +57,13 @@ where
node.size(),
vec![
node,
- recurse(&mut nested, renderer, bounds, position),
+ recurse(
+ &mut nested,
+ renderer,
+ bounds,
+ position,
+ translation,
+ ),
],
)
} else {
@@ -63,7 +71,7 @@ where
}
}
- recurse(&mut self.overlay, renderer, bounds, position)
+ recurse(&mut self.overlay, renderer, bounds, position, translation)
}
/// Draws the [`Nested`] overlay using the associated `Renderer`.
diff --git a/runtime/src/user_interface.rs b/runtime/src/user_interface.rs
index dae9e0ac..3594ac18 100644
--- a/runtime/src/user_interface.rs
+++ b/runtime/src/user_interface.rs
@@ -5,7 +5,9 @@ use crate::core::mouse;
use crate::core::renderer;
use crate::core::widget;
use crate::core::window;
-use crate::core::{Clipboard, Element, Layout, Point, Rectangle, Shell, Size};
+use crate::core::{
+ Clipboard, Element, Layout, Point, Rectangle, Shell, Size, Vector,
+};
use crate::overlay;
/// A set of interactive graphical elements with a specific [`Layout`].
@@ -199,7 +201,8 @@ where
let bounds = self.bounds;
let mut overlay = manual_overlay.as_mut().unwrap();
- let mut layout = overlay.layout(renderer, bounds, Point::ORIGIN);
+ let mut layout =
+ overlay.layout(renderer, bounds, Point::ORIGIN, Vector::ZERO);
let mut event_statuses = Vec::new();
for event in events.iter().cloned() {
@@ -253,8 +256,12 @@ where
overlay = manual_overlay.as_mut().unwrap();
shell.revalidate_layout(|| {
- layout =
- overlay.layout(renderer, bounds, Point::ORIGIN);
+ layout = overlay.layout(
+ renderer,
+ bounds,
+ Point::ORIGIN,
+ Vector::ZERO,
+ );
});
}
@@ -448,7 +455,12 @@ where
.map(overlay::Nested::new)
{
let overlay_layout = self.overlay.take().unwrap_or_else(|| {
- overlay.layout(renderer, self.bounds, Point::ORIGIN)
+ overlay.layout(
+ renderer,
+ self.bounds,
+ Point::ORIGIN,
+ Vector::ZERO,
+ )
});
let cursor = if cursor
@@ -566,8 +578,12 @@ where
.map(overlay::Nested::new)
{
if self.overlay.is_none() {
- self.overlay =
- Some(overlay.layout(renderer, self.bounds, Point::ORIGIN));
+ self.overlay = Some(overlay.layout(
+ renderer,
+ self.bounds,
+ Point::ORIGIN,
+ Vector::ZERO,
+ ));
}
overlay.operate(
diff --git a/widget/src/lazy.rs b/widget/src/lazy.rs
index 589dd938..167a055d 100644
--- a/widget/src/lazy.rs
+++ b/widget/src/lazy.rs
@@ -18,7 +18,7 @@ use crate::core::widget::tree::{self, Tree};
use crate::core::widget::{self, Widget};
use crate::core::Element;
use crate::core::{
- self, Clipboard, Hasher, Length, Point, Rectangle, Shell, Size,
+ self, Clipboard, Hasher, Length, Point, Rectangle, Shell, Size, Vector,
};
use crate::runtime::overlay::Nested;
@@ -333,9 +333,10 @@ where
renderer: &Renderer,
bounds: Size,
position: Point,
+ translation: Vector,
) -> layout::Node {
self.with_overlay_maybe(|overlay| {
- overlay.layout(renderer, bounds, position)
+ overlay.layout(renderer, bounds, position, translation)
})
.unwrap_or_default()
}
diff --git a/widget/src/lazy/component.rs b/widget/src/lazy/component.rs
index d454b72b..ad0c3823 100644
--- a/widget/src/lazy/component.rs
+++ b/widget/src/lazy/component.rs
@@ -577,9 +577,10 @@ where
renderer: &Renderer,
bounds: Size,
position: Point,
+ translation: Vector,
) -> layout::Node {
self.with_overlay_maybe(|overlay| {
- overlay.layout(renderer, bounds, position)
+ overlay.layout(renderer, bounds, position, translation)
})
.unwrap_or_default()
}
diff --git a/widget/src/lazy/responsive.rs b/widget/src/lazy/responsive.rs
index ed471988..86d37b6c 100644
--- a/widget/src/lazy/responsive.rs
+++ b/widget/src/lazy/responsive.rs
@@ -6,7 +6,8 @@ use crate::core::renderer;
use crate::core::widget;
use crate::core::widget::tree::{self, Tree};
use crate::core::{
- self, Clipboard, Element, Length, Point, Rectangle, Shell, Size, Widget,
+ self, Clipboard, Element, Length, Point, Rectangle, Shell, Size, Vector,
+ Widget,
};
use crate::horizontal_space;
use crate::runtime::overlay::Nested;
@@ -367,9 +368,10 @@ where
renderer: &Renderer,
bounds: Size,
position: Point,
+ translation: Vector,
) -> layout::Node {
self.with_overlay_maybe(|overlay| {
- overlay.layout(renderer, bounds, position)
+ overlay.layout(renderer, bounds, position, translation)
})
.unwrap_or_default()
}
diff --git a/widget/src/overlay/menu.rs b/widget/src/overlay/menu.rs
index b293f9fa..5098fa17 100644
--- a/widget/src/overlay/menu.rs
+++ b/widget/src/overlay/menu.rs
@@ -236,6 +236,7 @@ where
renderer: &Renderer,
bounds: Size,
position: Point,
+ _translation: Vector,
) -> layout::Node {
let space_below = bounds.height - (position.y + self.target_height);
let space_above = position.y;
diff --git a/widget/src/tooltip.rs b/widget/src/tooltip.rs
index b041d2e9..d5ee3de2 100644
--- a/widget/src/tooltip.rs
+++ b/widget/src/tooltip.rs
@@ -325,6 +325,7 @@ where
renderer: &Renderer,
bounds: Size,
position: Point,
+ _translation: Vector,
) -> layout::Node {
let viewport = Rectangle::with_size(bounds);