summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-04-14 12:11:10 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-07-08 10:34:14 +0200
commitc901f40fd6c5aa39f4dc056b2b59bc7133b287e6 (patch)
treeef71165b0c0958e517ccac0e234cbb20aa385afa
parent5c4f5ae5ecb36703a95cafb2cd58692529c9466d (diff)
downloadiced-c901f40fd6c5aa39f4dc056b2b59bc7133b287e6.tar.gz
iced-c901f40fd6c5aa39f4dc056b2b59bc7133b287e6.tar.bz2
iced-c901f40fd6c5aa39f4dc056b2b59bc7133b287e6.zip
Introduce `Widget::overlay` :tada:
-rw-r--r--examples/custom_widget/src/main.rs2
-rw-r--r--examples/geometry/src/main.rs2
-rw-r--r--examples/todos/src/main.rs4
-rw-r--r--graphics/src/renderer.rs2
-rw-r--r--graphics/src/widget/canvas.rs2
-rw-r--r--native/src/element.rs21
-rw-r--r--native/src/layout/debugger.rs2
-rw-r--r--native/src/lib.rs4
-rw-r--r--native/src/overlay.rs33
-rw-r--r--native/src/widget.rs8
-rw-r--r--native/src/widget/button.rs2
-rw-r--r--native/src/widget/checkbox.rs2
-rw-r--r--native/src/widget/column.rs2
-rw-r--r--native/src/widget/container.rs2
-rw-r--r--native/src/widget/image.rs2
-rw-r--r--native/src/widget/pane_grid.rs2
-rw-r--r--native/src/widget/progress_bar.rs3
-rw-r--r--native/src/widget/radio.rs3
-rw-r--r--native/src/widget/row.rs2
-rw-r--r--native/src/widget/scrollable.rs2
-rw-r--r--native/src/widget/slider.rs2
-rw-r--r--native/src/widget/space.rs2
-rw-r--r--native/src/widget/svg.rs2
-rw-r--r--native/src/widget/text.rs2
-rw-r--r--native/src/widget/text_input.rs2
25 files changed, 80 insertions, 32 deletions
diff --git a/examples/custom_widget/src/main.rs b/examples/custom_widget/src/main.rs
index bcf896b0..a6068f91 100644
--- a/examples/custom_widget/src/main.rs
+++ b/examples/custom_widget/src/main.rs
@@ -25,7 +25,7 @@ mod circle {
}
}
- impl<Message, B> Widget<Message, Renderer<B>> for Circle
+ impl<'a, Message, B> Widget<'a, Message, Renderer<B>> for Circle
where
B: Backend,
{
diff --git a/examples/geometry/src/main.rs b/examples/geometry/src/main.rs
index 71ce0d8c..3795323a 100644
--- a/examples/geometry/src/main.rs
+++ b/examples/geometry/src/main.rs
@@ -27,7 +27,7 @@ mod rainbow {
}
}
- impl<Message, B> Widget<Message, Renderer<B>> for Rainbow
+ impl<'a, Message, B> Widget<'a, Message, Renderer<B>> for Rainbow
where
B: Backend,
{
diff --git a/examples/todos/src/main.rs b/examples/todos/src/main.rs
index c9cbcc69..5713a6f2 100644
--- a/examples/todos/src/main.rs
+++ b/examples/todos/src/main.rs
@@ -425,7 +425,7 @@ impl Filter {
}
}
-fn loading_message() -> Element<'static, Message> {
+fn loading_message<'a>() -> Element<'a, Message> {
Container::new(
Text::new("Loading...")
.horizontal_alignment(HorizontalAlignment::Center)
@@ -437,7 +437,7 @@ fn loading_message() -> Element<'static, Message> {
.into()
}
-fn empty_message(message: &str) -> Element<'static, Message> {
+fn empty_message<'a>(message: &str) -> Element<'a, Message> {
Container::new(
Text::new(message)
.width(Length::Fill)
diff --git a/graphics/src/renderer.rs b/graphics/src/renderer.rs
index c9360f3a..44bacd4e 100644
--- a/graphics/src/renderer.rs
+++ b/graphics/src/renderer.rs
@@ -62,7 +62,7 @@ where
fn explain<Message>(
&mut self,
defaults: &Defaults,
- widget: &dyn Widget<Message, Self>,
+ widget: &dyn Widget<'_, Message, Self>,
layout: Layout<'_>,
cursor_position: Point,
color: Color,
diff --git a/graphics/src/widget/canvas.rs b/graphics/src/widget/canvas.rs
index b8466239..0257f819 100644
--- a/graphics/src/widget/canvas.rs
+++ b/graphics/src/widget/canvas.rs
@@ -134,7 +134,7 @@ impl<Message, P: Program<Message>> Canvas<Message, P> {
}
}
-impl<Message, P, B> Widget<Message, Renderer<B>> for Canvas<Message, P>
+impl<'a, Message, P, B> Widget<'a, Message, Renderer<B>> for Canvas<Message, P>
where
P: Program<Message>,
B: Backend,
diff --git a/native/src/element.rs b/native/src/element.rs
index 73e39012..c6d65550 100644
--- a/native/src/element.rs
+++ b/native/src/element.rs
@@ -1,5 +1,6 @@
use crate::{
- layout, Clipboard, Color, Event, Hasher, Layout, Length, Point, Widget,
+ layout, Clipboard, Color, Event, Hasher, Layout, Length, Overlay, Point,
+ Widget,
};
/// A generic [`Widget`].
@@ -15,7 +16,7 @@ use crate::{
/// [`Element`]: struct.Element.html
#[allow(missing_debug_implementations)]
pub struct Element<'a, Message, Renderer> {
- pub(crate) widget: Box<dyn Widget<Message, Renderer> + 'a>,
+ pub(crate) widget: Box<dyn Widget<'a, Message, Renderer> + 'a>,
}
impl<'a, Message, Renderer> Element<'a, Message, Renderer>
@@ -27,7 +28,7 @@ where
/// [`Element`]: struct.Element.html
/// [`Widget`]: widget/trait.Widget.html
pub fn new(
- widget: impl Widget<Message, Renderer> + 'a,
+ widget: impl Widget<'a, Message, Renderer> + 'a,
) -> Element<'a, Message, Renderer> {
Element {
widget: Box::new(widget),
@@ -270,16 +271,22 @@ where
pub fn hash_layout(&self, state: &mut Hasher) {
self.widget.hash_layout(state);
}
+
+ pub fn overlay(
+ &mut self,
+ ) -> Option<Box<dyn Overlay<Message, Renderer> + 'a>> {
+ self.widget.overlay()
+ }
}
struct Map<'a, A, B, Renderer> {
- widget: Box<dyn Widget<A, Renderer> + 'a>,
+ widget: Box<dyn Widget<'a, A, Renderer> + 'a>,
mapper: Box<dyn Fn(A) -> B>,
}
impl<'a, A, B, Renderer> Map<'a, A, B, Renderer> {
pub fn new<F>(
- widget: Box<dyn Widget<A, Renderer> + 'a>,
+ widget: Box<dyn Widget<'a, A, Renderer> + 'a>,
mapper: F,
) -> Map<'a, A, B, Renderer>
where
@@ -292,7 +299,7 @@ impl<'a, A, B, Renderer> Map<'a, A, B, Renderer> {
}
}
-impl<'a, A, B, Renderer> Widget<B, Renderer> for Map<'a, A, B, Renderer>
+impl<'a, A, B, Renderer> Widget<'a, B, Renderer> for Map<'a, A, B, Renderer>
where
Renderer: crate::Renderer,
{
@@ -367,7 +374,7 @@ where
}
}
-impl<'a, Message, Renderer> Widget<Message, Renderer>
+impl<'a, Message, Renderer> Widget<'a, Message, Renderer>
for Explain<'a, Message, Renderer>
where
Renderer: crate::Renderer + layout::Debugger,
diff --git a/native/src/layout/debugger.rs b/native/src/layout/debugger.rs
index e4b21609..9c58f4f1 100644
--- a/native/src/layout/debugger.rs
+++ b/native/src/layout/debugger.rs
@@ -18,7 +18,7 @@ pub trait Debugger: Renderer {
fn explain<Message>(
&mut self,
defaults: &Self::Defaults,
- widget: &dyn Widget<Message, Self>,
+ widget: &dyn Widget<'_, Message, Self>,
layout: Layout<'_>,
cursor_position: Point,
color: Color,
diff --git a/native/src/lib.rs b/native/src/lib.rs
index b67ff2a1..dbec068d 100644
--- a/native/src/lib.rs
+++ b/native/src/lib.rs
@@ -30,7 +30,7 @@
//! [`Widget`]: widget/trait.Widget.html
//! [`UserInterface`]: struct.UserInterface.html
//! [renderer]: renderer/index.html
-#![deny(missing_docs)]
+//#![deny(missing_docs)]
#![deny(missing_debug_implementations)]
#![deny(unused_results)]
#![forbid(unsafe_code)]
@@ -48,6 +48,7 @@ mod clipboard;
mod element;
mod event;
mod hasher;
+mod overlay;
mod runtime;
mod user_interface;
@@ -75,6 +76,7 @@ pub use element::Element;
pub use event::Event;
pub use hasher::Hasher;
pub use layout::Layout;
+pub use overlay::Overlay;
pub use program::Program;
pub use renderer::Renderer;
pub use runtime::Runtime;
diff --git a/native/src/overlay.rs b/native/src/overlay.rs
new file mode 100644
index 00000000..d34432a4
--- /dev/null
+++ b/native/src/overlay.rs
@@ -0,0 +1,33 @@
+use crate::{layout, Clipboard, Event, Hasher, Layout, Point};
+
+pub trait Overlay<Message, Renderer>
+where
+ Renderer: crate::Renderer,
+{
+ fn layout(
+ &self,
+ renderer: &Renderer,
+ limits: &layout::Limits,
+ ) -> layout::Node;
+
+ fn draw(
+ &self,
+ renderer: &mut Renderer,
+ defaults: &Renderer::Defaults,
+ layout: Layout<'_>,
+ cursor_position: Point,
+ ) -> Renderer::Output;
+
+ fn hash_layout(&self, state: &mut Hasher);
+
+ fn on_event(
+ &mut self,
+ _event: Event,
+ _layout: Layout<'_>,
+ _cursor_position: Point,
+ _messages: &mut Vec<Message>,
+ _renderer: &Renderer,
+ _clipboard: Option<&dyn Clipboard>,
+ ) {
+ }
+}
diff --git a/native/src/widget.rs b/native/src/widget.rs
index 4453145b..dd1a97d2 100644
--- a/native/src/widget.rs
+++ b/native/src/widget.rs
@@ -67,7 +67,7 @@ pub use text::Text;
#[doc(no_inline)]
pub use text_input::TextInput;
-use crate::{layout, Clipboard, Event, Hasher, Layout, Length, Point};
+use crate::{layout, Clipboard, Event, Hasher, Layout, Length, Overlay, Point};
/// A component that displays information and allows interaction.
///
@@ -94,7 +94,7 @@ use crate::{layout, Clipboard, Event, Hasher, Layout, Length, Point};
/// [`geometry`]: https://github.com/hecrj/iced/tree/0.1/examples/geometry
/// [`lyon`]: https://github.com/nical/lyon
/// [`iced_wgpu`]: https://github.com/hecrj/iced/tree/0.1/wgpu
-pub trait Widget<Message, Renderer>
+pub trait Widget<'a, Message, Renderer>
where
Renderer: crate::Renderer,
{
@@ -175,4 +175,8 @@ where
_clipboard: Option<&dyn Clipboard>,
) {
}
+
+ fn overlay(&mut self) -> Option<Box<dyn Overlay<Message, Renderer> + 'a>> {
+ None
+ }
}
diff --git a/native/src/widget/button.rs b/native/src/widget/button.rs
index c932da2b..72db808b 100644
--- a/native/src/widget/button.rs
+++ b/native/src/widget/button.rs
@@ -139,7 +139,7 @@ impl State {
}
}
-impl<'a, Message, Renderer> Widget<Message, Renderer>
+impl<'a, Message, Renderer> Widget<'a, Message, Renderer>
for Button<'a, Message, Renderer>
where
Renderer: self::Renderer,
diff --git a/native/src/widget/checkbox.rs b/native/src/widget/checkbox.rs
index 44962288..82fd6d1f 100644
--- a/native/src/widget/checkbox.rs
+++ b/native/src/widget/checkbox.rs
@@ -106,7 +106,7 @@ impl<Message, Renderer: self::Renderer + text::Renderer>
}
}
-impl<Message, Renderer> Widget<Message, Renderer>
+impl<'a, Message, Renderer> Widget<'a, Message, Renderer>
for Checkbox<Message, Renderer>
where
Renderer: self::Renderer + text::Renderer + row::Renderer,
diff --git a/native/src/widget/column.rs b/native/src/widget/column.rs
index 259a7e6e..6afc94d6 100644
--- a/native/src/widget/column.rs
+++ b/native/src/widget/column.rs
@@ -121,7 +121,7 @@ impl<'a, Message, Renderer> Column<'a, Message, Renderer> {
}
}
-impl<'a, Message, Renderer> Widget<Message, Renderer>
+impl<'a, Message, Renderer> Widget<'a, Message, Renderer>
for Column<'a, Message, Renderer>
where
Renderer: self::Renderer,
diff --git a/native/src/widget/container.rs b/native/src/widget/container.rs
index 2590fe3b..3ad12eeb 100644
--- a/native/src/widget/container.rs
+++ b/native/src/widget/container.rs
@@ -129,7 +129,7 @@ where
}
}
-impl<'a, Message, Renderer> Widget<Message, Renderer>
+impl<'a, Message, Renderer> Widget<'a, Message, Renderer>
for Container<'a, Message, Renderer>
where
Renderer: self::Renderer,
diff --git a/native/src/widget/image.rs b/native/src/widget/image.rs
index 132f249d..b7c8f4ff 100644
--- a/native/src/widget/image.rs
+++ b/native/src/widget/image.rs
@@ -54,7 +54,7 @@ impl Image {
}
}
-impl<Message, Renderer> Widget<Message, Renderer> for Image
+impl<'a, Message, Renderer> Widget<'a, Message, Renderer> for Image
where
Renderer: self::Renderer,
{
diff --git a/native/src/widget/pane_grid.rs b/native/src/widget/pane_grid.rs
index a8deef0b..faf8da4e 100644
--- a/native/src/widget/pane_grid.rs
+++ b/native/src/widget/pane_grid.rs
@@ -387,7 +387,7 @@ pub struct KeyPressEvent {
pub modifiers: keyboard::ModifiersState,
}
-impl<'a, Message, Renderer> Widget<Message, Renderer>
+impl<'a, Message, Renderer> Widget<'a, Message, Renderer>
for PaneGrid<'a, Message, Renderer>
where
Renderer: self::Renderer,
diff --git a/native/src/widget/progress_bar.rs b/native/src/widget/progress_bar.rs
index 5ab76d47..93d86371 100644
--- a/native/src/widget/progress_bar.rs
+++ b/native/src/widget/progress_bar.rs
@@ -70,7 +70,8 @@ impl<Renderer: self::Renderer> ProgressBar<Renderer> {
}
}
-impl<Message, Renderer> Widget<Message, Renderer> for ProgressBar<Renderer>
+impl<'a, Message, Renderer> Widget<'a, Message, Renderer>
+ for ProgressBar<Renderer>
where
Renderer: self::Renderer,
{
diff --git a/native/src/widget/radio.rs b/native/src/widget/radio.rs
index 5b8d00e9..0d88c740 100644
--- a/native/src/widget/radio.rs
+++ b/native/src/widget/radio.rs
@@ -121,7 +121,8 @@ impl<Message, Renderer: self::Renderer + text::Renderer>
}
}
-impl<Message, Renderer> Widget<Message, Renderer> for Radio<Message, Renderer>
+impl<'a, Message, Renderer> Widget<'a, Message, Renderer>
+ for Radio<Message, Renderer>
where
Renderer: self::Renderer + text::Renderer + row::Renderer,
Message: Clone,
diff --git a/native/src/widget/row.rs b/native/src/widget/row.rs
index 31f7472f..1ebbac6b 100644
--- a/native/src/widget/row.rs
+++ b/native/src/widget/row.rs
@@ -122,7 +122,7 @@ impl<'a, Message, Renderer> Row<'a, Message, Renderer> {
}
}
-impl<'a, Message, Renderer> Widget<Message, Renderer>
+impl<'a, Message, Renderer> Widget<'a, Message, Renderer>
for Row<'a, Message, Renderer>
where
Renderer: self::Renderer,
diff --git a/native/src/widget/scrollable.rs b/native/src/widget/scrollable.rs
index 3c8e5e5b..d7ad98e6 100644
--- a/native/src/widget/scrollable.rs
+++ b/native/src/widget/scrollable.rs
@@ -110,7 +110,7 @@ impl<'a, Message, Renderer: self::Renderer> Scrollable<'a, Message, Renderer> {
}
}
-impl<'a, Message, Renderer> Widget<Message, Renderer>
+impl<'a, Message, Renderer> Widget<'a, Message, Renderer>
for Scrollable<'a, Message, Renderer>
where
Renderer: self::Renderer + column::Renderer,
diff --git a/native/src/widget/slider.rs b/native/src/widget/slider.rs
index 70f2b6ac..e0193342 100644
--- a/native/src/widget/slider.rs
+++ b/native/src/widget/slider.rs
@@ -154,7 +154,7 @@ impl State {
}
}
-impl<'a, T, Message, Renderer> Widget<Message, Renderer>
+impl<'a, T, Message, Renderer> Widget<'a, Message, Renderer>
for Slider<'a, T, Message, Renderer>
where
T: Copy + Into<f64> + num_traits::FromPrimitive,
diff --git a/native/src/widget/space.rs b/native/src/widget/space.rs
index e56a8fe1..8ada40ed 100644
--- a/native/src/widget/space.rs
+++ b/native/src/widget/space.rs
@@ -43,7 +43,7 @@ impl Space {
}
}
-impl<'a, Message, Renderer> Widget<Message, Renderer> for Space
+impl<'a, Message, Renderer> Widget<'a, Message, Renderer> for Space
where
Renderer: self::Renderer,
{
diff --git a/native/src/widget/svg.rs b/native/src/widget/svg.rs
index 114d5e41..3e45aaf6 100644
--- a/native/src/widget/svg.rs
+++ b/native/src/widget/svg.rs
@@ -60,7 +60,7 @@ impl Svg {
}
}
-impl<Message, Renderer> Widget<Message, Renderer> for Svg
+impl<'a, Message, Renderer> Widget<'a, Message, Renderer> for Svg
where
Renderer: self::Renderer,
{
diff --git a/native/src/widget/text.rs b/native/src/widget/text.rs
index 48a69e34..7f75eb9c 100644
--- a/native/src/widget/text.rs
+++ b/native/src/widget/text.rs
@@ -112,7 +112,7 @@ impl<Renderer: self::Renderer> Text<Renderer> {
}
}
-impl<Message, Renderer> Widget<Message, Renderer> for Text<Renderer>
+impl<'a, Message, Renderer> Widget<'a, Message, Renderer> for Text<Renderer>
where
Renderer: self::Renderer,
{
diff --git a/native/src/widget/text_input.rs b/native/src/widget/text_input.rs
index 3f415101..63be6019 100644
--- a/native/src/widget/text_input.rs
+++ b/native/src/widget/text_input.rs
@@ -165,7 +165,7 @@ impl<'a, Message, Renderer: self::Renderer> TextInput<'a, Message, Renderer> {
}
}
-impl<'a, Message, Renderer> Widget<Message, Renderer>
+impl<'a, Message, Renderer> Widget<'a, Message, Renderer>
for TextInput<'a, Message, Renderer>
where
Renderer: self::Renderer,