summaryrefslogtreecommitdiffstats
path: root/native/src/overlay
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón <hector0193@gmail.com>2022-08-06 00:32:57 +0200
committerLibravatar GitHub <noreply@github.com>2022-08-06 00:32:57 +0200
commit1923dbf7f0769d55e5283f572fde0ce752e28b86 (patch)
tree7be9b36f941f6e13ddc8884f715c04555b1e77db /native/src/overlay
parent1b4f38c71f6e05e26599ee75ea9c91dde96e71ae (diff)
parentc23ed7e4a0a2b62a0d7cabe6e35d7323eac543d2 (diff)
downloadiced-1923dbf7f0769d55e5283f572fde0ce752e28b86.tar.gz
iced-1923dbf7f0769d55e5283f572fde0ce752e28b86.tar.bz2
iced-1923dbf7f0769d55e5283f572fde0ce752e28b86.zip
Merge pull request #1393 from iced-rs/deprecate-stateful-widgets
Replace stateful widgets with the new `iced_pure` API
Diffstat (limited to '')
-rw-r--r--native/src/overlay.rs55
-rw-r--r--native/src/overlay/element.rs10
-rw-r--r--native/src/overlay/menu.rs56
3 files changed, 108 insertions, 13 deletions
diff --git a/native/src/overlay.rs b/native/src/overlay.rs
index 792d2905..905d3389 100644
--- a/native/src/overlay.rs
+++ b/native/src/overlay.rs
@@ -10,6 +10,8 @@ use crate::event::{self, Event};
use crate::layout;
use crate::mouse;
use crate::renderer;
+use crate::widget;
+use crate::widget::tree::{self, Tree};
use crate::{Clipboard, Layout, Point, Rectangle, Shell, Size};
/// An interactive component that can be displayed on top of other widgets.
@@ -40,6 +42,36 @@ where
cursor_position: Point,
);
+ /// Returns the [`Tag`] of the [`Widget`].
+ ///
+ /// [`Tag`]: tree::Tag
+ fn tag(&self) -> tree::Tag {
+ tree::Tag::stateless()
+ }
+
+ /// Returns the [`State`] of the [`Widget`].
+ ///
+ /// [`State`]: tree::State
+ fn state(&self) -> tree::State {
+ tree::State::None
+ }
+
+ /// Returns the state [`Tree`] of the children of the [`Widget`].
+ fn children(&self) -> Vec<Tree> {
+ Vec::new()
+ }
+
+ /// Reconciliates the [`Widget`] with the provided [`Tree`].
+ fn diff(&self, _tree: &mut Tree) {}
+
+ /// Applies an [`Operation`] to the [`Widget`].
+ fn operate(
+ &self,
+ _layout: Layout<'_>,
+ _operation: &mut dyn widget::Operation<Message>,
+ ) {
+ }
+
/// Processes a runtime [`Event`].
///
/// It receives:
@@ -77,3 +109,26 @@ where
mouse::Interaction::Idle
}
}
+
+/// Obtains the first overlay [`Element`] found in the given children.
+///
+/// This method will generally only be used by advanced users that are
+/// implementing the [`Widget`](crate::Widget) trait.
+pub fn from_children<'a, Message, Renderer>(
+ children: &'a [crate::Element<'_, Message, Renderer>],
+ tree: &'a mut Tree,
+ layout: Layout<'_>,
+ renderer: &Renderer,
+) -> Option<Element<'a, Message, Renderer>>
+where
+ Renderer: crate::Renderer,
+{
+ children
+ .iter()
+ .zip(&mut tree.children)
+ .zip(layout.children())
+ .filter_map(|((child, state), layout)| {
+ child.as_widget().overlay(state, layout, renderer)
+ })
+ .next()
+}
diff --git a/native/src/overlay/element.rs b/native/src/overlay/element.rs
index de2e1f37..b919c221 100644
--- a/native/src/overlay/element.rs
+++ b/native/src/overlay/element.rs
@@ -4,6 +4,7 @@ use crate::event::{self, Event};
use crate::layout;
use crate::mouse;
use crate::renderer;
+use crate::widget;
use crate::{Clipboard, Layout, Point, Rectangle, Shell, Size, Vector};
/// A generic [`Overlay`].
@@ -102,6 +103,15 @@ where
self.overlay
.draw(renderer, theme, style, layout, cursor_position)
}
+
+ /// Applies an [`Operation`] to the [`Element`].
+ pub fn operate(
+ &self,
+ layout: Layout<'_>,
+ operation: &mut dyn widget::Operation<Message>,
+ ) {
+ self.overlay.operate(layout, operation);
+ }
}
struct Map<'a, A, B, Renderer> {
diff --git a/native/src/overlay/menu.rs b/native/src/overlay/menu.rs
index 7b8d4d9e..08135872 100644
--- a/native/src/overlay/menu.rs
+++ b/native/src/overlay/menu.rs
@@ -9,6 +9,7 @@ use crate::text::{self, Text};
use crate::touch;
use crate::widget::container::{self, Container};
use crate::widget::scrollable::{self, Scrollable};
+use crate::widget::tree::{self, Tree};
use crate::{
Clipboard, Color, Element, Layout, Length, Padding, Point, Rectangle,
Shell, Size, Vector, Widget,
@@ -114,15 +115,23 @@ where
}
/// The local state of a [`Menu`].
-#[derive(Debug, Clone, Default)]
+#[derive(Debug)]
pub struct State {
- scrollable: scrollable::State,
+ tree: Tree,
}
impl State {
/// Creates a new [`State`] for a [`Menu`].
pub fn new() -> Self {
- Self::default()
+ Self {
+ tree: Tree::empty(),
+ }
+ }
+}
+
+impl Default for State {
+ fn default() -> Self {
+ Self::new()
}
}
@@ -131,6 +140,7 @@ where
Renderer: crate::Renderer,
Renderer::Theme: StyleSheet + container::StyleSheet,
{
+ state: &'a mut Tree,
container: Container<'a, Message, Renderer>,
width: u16,
target_height: f32,
@@ -161,18 +171,20 @@ where
style,
} = menu;
- let container =
- Container::new(Scrollable::new(&mut state.scrollable).push(List {
- options,
- hovered_option,
- last_selection,
- font,
- text_size,
- padding,
- style,
- }));
+ let container = Container::new(Scrollable::new(List {
+ options,
+ hovered_option,
+ last_selection,
+ font,
+ text_size,
+ padding,
+ style,
+ }));
+
+ state.tree.diff(&container as &dyn Widget<_, _>);
Self {
+ state: &mut state.tree,
container,
width,
target_height,
@@ -187,6 +199,18 @@ where
Renderer: text::Renderer,
Renderer::Theme: StyleSheet + container::StyleSheet,
{
+ fn tag(&self) -> tree::Tag {
+ self.container.tag()
+ }
+
+ fn state(&self) -> tree::State {
+ self.container.state()
+ }
+
+ fn children(&self) -> Vec<Tree> {
+ self.container.children()
+ }
+
fn layout(
&self,
renderer: &Renderer,
@@ -230,6 +254,7 @@ where
shell: &mut Shell<'_, Message>,
) -> event::Status {
self.container.on_event(
+ self.state,
event,
layout,
cursor_position,
@@ -247,6 +272,7 @@ where
renderer: &Renderer,
) -> mouse::Interaction {
self.container.mouse_interaction(
+ self.state,
layout,
cursor_position,
viewport,
@@ -279,6 +305,7 @@ where
);
self.container.draw(
+ self.state,
renderer,
theme,
style,
@@ -344,6 +371,7 @@ where
fn on_event(
&mut self,
+ _state: &mut Tree,
event: Event,
layout: Layout<'_>,
cursor_position: Point,
@@ -407,6 +435,7 @@ where
fn mouse_interaction(
&self,
+ _state: &Tree,
layout: Layout<'_>,
cursor_position: Point,
_viewport: &Rectangle,
@@ -423,6 +452,7 @@ where
fn draw(
&self,
+ _state: &Tree,
renderer: &mut Renderer,
theme: &Renderer::Theme,
_style: &renderer::Style,