Introduce Widget::overlay 🎉

This commit is contained in:
Héctor Ramón Jiménez 2020-04-14 12:11:10 +02:00
parent 5c4f5ae5ec
commit c901f40fd6
25 changed files with 80 additions and 32 deletions

View file

@ -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 where
B: Backend, B: Backend,
{ {

View file

@ -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 where
B: Backend, B: Backend,
{ {

View file

@ -425,7 +425,7 @@ impl Filter {
} }
} }
fn loading_message() -> Element<'static, Message> { fn loading_message<'a>() -> Element<'a, Message> {
Container::new( Container::new(
Text::new("Loading...") Text::new("Loading...")
.horizontal_alignment(HorizontalAlignment::Center) .horizontal_alignment(HorizontalAlignment::Center)
@ -437,7 +437,7 @@ fn loading_message() -> Element<'static, Message> {
.into() .into()
} }
fn empty_message(message: &str) -> Element<'static, Message> { fn empty_message<'a>(message: &str) -> Element<'a, Message> {
Container::new( Container::new(
Text::new(message) Text::new(message)
.width(Length::Fill) .width(Length::Fill)

View file

@ -62,7 +62,7 @@ where
fn explain<Message>( fn explain<Message>(
&mut self, &mut self,
defaults: &Defaults, defaults: &Defaults,
widget: &dyn Widget<Message, Self>, widget: &dyn Widget<'_, Message, Self>,
layout: Layout<'_>, layout: Layout<'_>,
cursor_position: Point, cursor_position: Point,
color: Color, color: Color,

View file

@ -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 where
P: Program<Message>, P: Program<Message>,
B: Backend, B: Backend,

View file

@ -1,5 +1,6 @@
use crate::{ use crate::{
layout, Clipboard, Color, Event, Hasher, Layout, Length, Point, Widget, layout, Clipboard, Color, Event, Hasher, Layout, Length, Overlay, Point,
Widget,
}; };
/// A generic [`Widget`]. /// A generic [`Widget`].
@ -15,7 +16,7 @@ use crate::{
/// [`Element`]: struct.Element.html /// [`Element`]: struct.Element.html
#[allow(missing_debug_implementations)] #[allow(missing_debug_implementations)]
pub struct Element<'a, Message, Renderer> { 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> impl<'a, Message, Renderer> Element<'a, Message, Renderer>
@ -27,7 +28,7 @@ where
/// [`Element`]: struct.Element.html /// [`Element`]: struct.Element.html
/// [`Widget`]: widget/trait.Widget.html /// [`Widget`]: widget/trait.Widget.html
pub fn new( pub fn new(
widget: impl Widget<Message, Renderer> + 'a, widget: impl Widget<'a, Message, Renderer> + 'a,
) -> Element<'a, Message, Renderer> { ) -> Element<'a, Message, Renderer> {
Element { Element {
widget: Box::new(widget), widget: Box::new(widget),
@ -270,16 +271,22 @@ where
pub fn hash_layout(&self, state: &mut Hasher) { pub fn hash_layout(&self, state: &mut Hasher) {
self.widget.hash_layout(state); 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> { 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>, mapper: Box<dyn Fn(A) -> B>,
} }
impl<'a, A, B, Renderer> Map<'a, A, B, Renderer> { impl<'a, A, B, Renderer> Map<'a, A, B, Renderer> {
pub fn new<F>( pub fn new<F>(
widget: Box<dyn Widget<A, Renderer> + 'a>, widget: Box<dyn Widget<'a, A, Renderer> + 'a>,
mapper: F, mapper: F,
) -> Map<'a, A, B, Renderer> ) -> Map<'a, A, B, Renderer>
where 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 where
Renderer: crate::Renderer, 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> for Explain<'a, Message, Renderer>
where where
Renderer: crate::Renderer + layout::Debugger, Renderer: crate::Renderer + layout::Debugger,

View file

@ -18,7 +18,7 @@ pub trait Debugger: Renderer {
fn explain<Message>( fn explain<Message>(
&mut self, &mut self,
defaults: &Self::Defaults, defaults: &Self::Defaults,
widget: &dyn Widget<Message, Self>, widget: &dyn Widget<'_, Message, Self>,
layout: Layout<'_>, layout: Layout<'_>,
cursor_position: Point, cursor_position: Point,
color: Color, color: Color,

View file

@ -30,7 +30,7 @@
//! [`Widget`]: widget/trait.Widget.html //! [`Widget`]: widget/trait.Widget.html
//! [`UserInterface`]: struct.UserInterface.html //! [`UserInterface`]: struct.UserInterface.html
//! [renderer]: renderer/index.html //! [renderer]: renderer/index.html
#![deny(missing_docs)] //#![deny(missing_docs)]
#![deny(missing_debug_implementations)] #![deny(missing_debug_implementations)]
#![deny(unused_results)] #![deny(unused_results)]
#![forbid(unsafe_code)] #![forbid(unsafe_code)]
@ -48,6 +48,7 @@ mod clipboard;
mod element; mod element;
mod event; mod event;
mod hasher; mod hasher;
mod overlay;
mod runtime; mod runtime;
mod user_interface; mod user_interface;
@ -75,6 +76,7 @@ pub use element::Element;
pub use event::Event; pub use event::Event;
pub use hasher::Hasher; pub use hasher::Hasher;
pub use layout::Layout; pub use layout::Layout;
pub use overlay::Overlay;
pub use program::Program; pub use program::Program;
pub use renderer::Renderer; pub use renderer::Renderer;
pub use runtime::Runtime; pub use runtime::Runtime;

33
native/src/overlay.rs Normal file
View file

@ -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>,
) {
}
}

View file

@ -67,7 +67,7 @@ pub use text::Text;
#[doc(no_inline)] #[doc(no_inline)]
pub use text_input::TextInput; 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. /// 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 /// [`geometry`]: https://github.com/hecrj/iced/tree/0.1/examples/geometry
/// [`lyon`]: https://github.com/nical/lyon /// [`lyon`]: https://github.com/nical/lyon
/// [`iced_wgpu`]: https://github.com/hecrj/iced/tree/0.1/wgpu /// [`iced_wgpu`]: https://github.com/hecrj/iced/tree/0.1/wgpu
pub trait Widget<Message, Renderer> pub trait Widget<'a, Message, Renderer>
where where
Renderer: crate::Renderer, Renderer: crate::Renderer,
{ {
@ -175,4 +175,8 @@ where
_clipboard: Option<&dyn Clipboard>, _clipboard: Option<&dyn Clipboard>,
) { ) {
} }
fn overlay(&mut self) -> Option<Box<dyn Overlay<Message, Renderer> + 'a>> {
None
}
} }

View file

@ -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> for Button<'a, Message, Renderer>
where where
Renderer: self::Renderer, Renderer: self::Renderer,

View file

@ -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> for Checkbox<Message, Renderer>
where where
Renderer: self::Renderer + text::Renderer + row::Renderer, Renderer: self::Renderer + text::Renderer + row::Renderer,

View file

@ -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> for Column<'a, Message, Renderer>
where where
Renderer: self::Renderer, Renderer: self::Renderer,

View file

@ -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> for Container<'a, Message, Renderer>
where where
Renderer: self::Renderer, Renderer: self::Renderer,

View file

@ -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 where
Renderer: self::Renderer, Renderer: self::Renderer,
{ {

View file

@ -387,7 +387,7 @@ pub struct KeyPressEvent {
pub modifiers: keyboard::ModifiersState, pub modifiers: keyboard::ModifiersState,
} }
impl<'a, Message, Renderer> Widget<Message, Renderer> impl<'a, Message, Renderer> Widget<'a, Message, Renderer>
for PaneGrid<'a, Message, Renderer> for PaneGrid<'a, Message, Renderer>
where where
Renderer: self::Renderer, Renderer: self::Renderer,

View file

@ -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 where
Renderer: self::Renderer, Renderer: self::Renderer,
{ {

View file

@ -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 where
Renderer: self::Renderer + text::Renderer + row::Renderer, Renderer: self::Renderer + text::Renderer + row::Renderer,
Message: Clone, Message: Clone,

View file

@ -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> for Row<'a, Message, Renderer>
where where
Renderer: self::Renderer, Renderer: self::Renderer,

View file

@ -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> for Scrollable<'a, Message, Renderer>
where where
Renderer: self::Renderer + column::Renderer, Renderer: self::Renderer + column::Renderer,

View file

@ -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> for Slider<'a, T, Message, Renderer>
where where
T: Copy + Into<f64> + num_traits::FromPrimitive, T: Copy + Into<f64> + num_traits::FromPrimitive,

View file

@ -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 where
Renderer: self::Renderer, Renderer: self::Renderer,
{ {

View file

@ -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 where
Renderer: self::Renderer, Renderer: self::Renderer,
{ {

View file

@ -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 where
Renderer: self::Renderer, Renderer: self::Renderer,
{ {

View file

@ -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> for TextInput<'a, Message, Renderer>
where where
Renderer: self::Renderer, Renderer: self::Renderer,