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 'native/src/overlay')
-rw-r--r--native/src/overlay/element.rs10
-rw-r--r--native/src/overlay/menu.rs56
2 files changed, 53 insertions, 13 deletions
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,