diff options
| author | 2023-11-21 14:41:22 +0100 | |
|---|---|---|
| committer | 2023-11-21 14:41:22 +0100 | |
| commit | 25006b9c6f2ae909d86871d3a13631d518c07158 (patch) | |
| tree | e4bf993c1073cde4c6a847e38f8165f6efcecb21 | |
| parent | 7dd32f3be43c72e11dac5e07918e9ad6d36b6555 (diff) | |
| download | iced-25006b9c6f2ae909d86871d3a13631d518c07158.tar.gz iced-25006b9c6f2ae909d86871d3a13631d518c07158.tar.bz2 iced-25006b9c6f2ae909d86871d3a13631d518c07158.zip  | |
Fix `Overlay` composition
Translations were not easily composable.
| -rw-r--r-- | core/src/overlay.rs | 3 | ||||
| -rw-r--r-- | core/src/overlay/element.rs | 20 | ||||
| -rw-r--r-- | core/src/overlay/group.rs | 9 | ||||
| -rw-r--r-- | runtime/src/overlay/nested.rs | 18 | ||||
| -rw-r--r-- | runtime/src/user_interface.rs | 30 | ||||
| -rw-r--r-- | widget/src/lazy.rs | 5 | ||||
| -rw-r--r-- | widget/src/lazy/component.rs | 3 | ||||
| -rw-r--r-- | widget/src/lazy/responsive.rs | 6 | ||||
| -rw-r--r-- | widget/src/overlay/menu.rs | 1 | ||||
| -rw-r--r-- | widget/src/tooltip.rs | 1 | 
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);  | 
