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
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
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(
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)

View file

@ -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,

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

View file

@ -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,

View file

@ -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,

View file

@ -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;

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)]
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
}
}

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

View file

@ -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,

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