Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Themer widget #2209

Merged
merged 2 commits into from
Jan 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 44 additions & 34 deletions core/src/element.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,13 @@ use std::borrow::Borrow;
///
/// [built-in widget]: crate::widget
#[allow(missing_debug_implementations)]
pub struct Element<'a, Message, Renderer> {
widget: Box<dyn Widget<Message, Renderer> + 'a>,
pub struct Element<'a, Message, Theme, Renderer> {
widget: Box<dyn Widget<Message, Theme, Renderer> + 'a>,
}

impl<'a, Message, Renderer> Element<'a, Message, Renderer> {
impl<'a, Message, Theme, Renderer> Element<'a, Message, Theme, Renderer> {
/// Creates a new [`Element`] containing the given [`Widget`].
pub fn new(widget: impl Widget<Message, Renderer> + 'a) -> Self
pub fn new(widget: impl Widget<Message, Theme, Renderer> + 'a) -> Self
where
Renderer: crate::Renderer,
{
Expand All @@ -39,12 +39,14 @@ impl<'a, Message, Renderer> Element<'a, Message, Renderer> {
}

/// Returns a reference to the [`Widget`] of the [`Element`],
pub fn as_widget(&self) -> &dyn Widget<Message, Renderer> {
pub fn as_widget(&self) -> &dyn Widget<Message, Theme, Renderer> {
self.widget.as_ref()
}

/// Returns a mutable reference to the [`Widget`] of the [`Element`],
pub fn as_widget_mut(&mut self) -> &mut dyn Widget<Message, Renderer> {
pub fn as_widget_mut(
&mut self,
) -> &mut dyn Widget<Message, Theme, Renderer> {
self.widget.as_mut()
}

Expand Down Expand Up @@ -100,7 +102,7 @@ impl<'a, Message, Renderer> Element<'a, Message, Renderer> {
/// # impl Counter {
/// # pub fn view(
/// # &self,
/// # ) -> iced_core::Element<Message, iced_core::renderer::Null> {
/// # ) -> iced_core::Element<Message, (), iced_core::renderer::Null> {
/// # unimplemented!()
/// # }
/// # }
Expand All @@ -126,7 +128,7 @@ impl<'a, Message, Renderer> Element<'a, Message, Renderer> {
/// #
/// # pub fn push(
/// # mut self,
/// # _: iced_core::Element<Message, iced_core::renderer::Null>,
/// # _: iced_core::Element<Message, (), iced_core::renderer::Null>,
/// # ) -> Self {
/// # unimplemented!()
/// # }
Expand Down Expand Up @@ -155,7 +157,7 @@ impl<'a, Message, Renderer> Element<'a, Message, Renderer> {
/// Row::new().spacing(20),
/// |row, (index, counter)| {
/// // We display the counter
/// let element: Element<counter::Message, Renderer> =
/// let element: Element<counter::Message, _, _> =
/// counter.view().into();
///
/// row.push(
Expand Down Expand Up @@ -210,9 +212,10 @@ impl<'a, Message, Renderer> Element<'a, Message, Renderer> {
pub fn map<B>(
self,
f: impl Fn(Message) -> B + 'a,
) -> Element<'a, B, Renderer>
) -> Element<'a, B, Theme, Renderer>
where
Message: 'a,
Theme: 'a,
Renderer: crate::Renderer + 'a,
B: 'a,
{
Expand All @@ -228,9 +231,10 @@ impl<'a, Message, Renderer> Element<'a, Message, Renderer> {
pub fn explain<C: Into<Color>>(
self,
color: C,
) -> Element<'a, Message, Renderer>
) -> Element<'a, Message, Theme, Renderer>
where
Message: 'static,
Message: 'a,
Theme: 'a,
Renderer: crate::Renderer + 'a,
{
Element {
Expand All @@ -239,32 +243,34 @@ impl<'a, Message, Renderer> Element<'a, Message, Renderer> {
}
}

impl<'a, Message, Renderer> Borrow<dyn Widget<Message, Renderer> + 'a>
for Element<'a, Message, Renderer>
impl<'a, Message, Theme, Renderer>
Borrow<dyn Widget<Message, Theme, Renderer> + 'a>
for Element<'a, Message, Theme, Renderer>
{
fn borrow(&self) -> &(dyn Widget<Message, Renderer> + 'a) {
fn borrow(&self) -> &(dyn Widget<Message, Theme, Renderer> + 'a) {
self.widget.borrow()
}
}

impl<'a, Message, Renderer> Borrow<dyn Widget<Message, Renderer> + 'a>
for &Element<'a, Message, Renderer>
impl<'a, Message, Theme, Renderer>
Borrow<dyn Widget<Message, Theme, Renderer> + 'a>
for &Element<'a, Message, Theme, Renderer>
{
fn borrow(&self) -> &(dyn Widget<Message, Renderer> + 'a) {
fn borrow(&self) -> &(dyn Widget<Message, Theme, Renderer> + 'a) {
self.widget.borrow()
}
}

struct Map<'a, A, B, Renderer> {
widget: Box<dyn Widget<A, Renderer> + 'a>,
struct Map<'a, A, B, Theme, Renderer> {
widget: Box<dyn Widget<A, Theme, Renderer> + 'a>,
mapper: Box<dyn Fn(A) -> B + 'a>,
}

impl<'a, A, B, Renderer> Map<'a, A, B, Renderer> {
impl<'a, A, B, Theme, Renderer> Map<'a, A, B, Theme, Renderer> {
pub fn new<F>(
widget: Box<dyn Widget<A, Renderer> + 'a>,
widget: Box<dyn Widget<A, Theme, Renderer> + 'a>,
mapper: F,
) -> Map<'a, A, B, Renderer>
) -> Map<'a, A, B, Theme, Renderer>
where
F: 'a + Fn(A) -> B,
{
Expand All @@ -275,7 +281,8 @@ 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, Theme, Renderer> Widget<B, Theme, Renderer>
for Map<'a, A, B, Theme, Renderer>
where
Renderer: crate::Renderer + 'a,
A: 'a,
Expand Down Expand Up @@ -408,7 +415,7 @@ where
&self,
tree: &Tree,
renderer: &mut Renderer,
theme: &Renderer::Theme,
theme: &Theme,
style: &renderer::Style,
layout: Layout<'_>,
cursor: mouse::Cursor,
Expand All @@ -435,7 +442,7 @@ where
tree: &'b mut Tree,
layout: Layout<'_>,
renderer: &Renderer,
) -> Option<overlay::Element<'b, B, Renderer>> {
) -> Option<overlay::Element<'b, B, Theme, Renderer>> {
let mapper = &self.mapper;

self.widget
Expand All @@ -444,22 +451,25 @@ where
}
}

struct Explain<'a, Message, Renderer: crate::Renderer> {
element: Element<'a, Message, Renderer>,
struct Explain<'a, Message, Theme, Renderer: crate::Renderer> {
element: Element<'a, Message, Theme, Renderer>,
color: Color,
}

impl<'a, Message, Renderer> Explain<'a, Message, Renderer>
impl<'a, Message, Theme, Renderer> Explain<'a, Message, Theme, Renderer>
where
Renderer: crate::Renderer,
{
fn new(element: Element<'a, Message, Renderer>, color: Color) -> Self {
fn new(
element: Element<'a, Message, Theme, Renderer>,
color: Color,
) -> Self {
Explain { element, color }
}
}

impl<'a, Message, Renderer> Widget<Message, Renderer>
for Explain<'a, Message, Renderer>
impl<'a, Message, Theme, Renderer> Widget<Message, Theme, Renderer>
for Explain<'a, Message, Theme, Renderer>
where
Renderer: crate::Renderer,
{
Expand Down Expand Up @@ -524,7 +534,7 @@ where
&self,
state: &Tree,
renderer: &mut Renderer,
theme: &Renderer::Theme,
theme: &Theme,
style: &renderer::Style,
layout: Layout<'_>,
cursor: mouse::Cursor,
Expand Down Expand Up @@ -578,7 +588,7 @@ where
state: &'b mut Tree,
layout: Layout<'_>,
renderer: &Renderer,
) -> Option<overlay::Element<'b, Message, Renderer>> {
) -> Option<overlay::Element<'b, Message, Theme, Renderer>> {
self.element.widget.overlay(state, layout, renderer)
}
}
4 changes: 2 additions & 2 deletions core/src/layout/flex.rs
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ impl Axis {
/// padding and alignment to the items as needed.
///
/// It returns a new layout [`Node`].
pub fn resolve<Message, Renderer>(
pub fn resolve<Message, Theme, Renderer>(
axis: Axis,
renderer: &Renderer,
limits: &Limits,
Expand All @@ -68,7 +68,7 @@ pub fn resolve<Message, Renderer>(
padding: Padding,
spacing: f32,
align_items: Alignment,
items: &[Element<'_, Message, Renderer>],
items: &[Element<'_, Message, Theme, Renderer>],
trees: &mut [widget::Tree],
) -> Node
where
Expand Down
12 changes: 6 additions & 6 deletions core/src/overlay.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ use crate::widget::Tree;
use crate::{Clipboard, Layout, Point, Rectangle, Shell, Size, Vector};

/// An interactive component that can be displayed on top of other widgets.
pub trait Overlay<Message, Renderer>
pub trait Overlay<Message, Theme, Renderer>
where
Renderer: crate::Renderer,
{
Expand All @@ -36,7 +36,7 @@ where
fn draw(
&self,
renderer: &mut Renderer,
theme: &Renderer::Theme,
theme: &Theme,
style: &renderer::Style,
layout: Layout<'_>,
cursor: mouse::Cursor,
Expand Down Expand Up @@ -106,7 +106,7 @@ where
&'a mut self,
_layout: Layout<'_>,
_renderer: &Renderer,
) -> Option<Element<'a, Message, Renderer>> {
) -> Option<Element<'a, Message, Theme, Renderer>> {
None
}
}
Expand All @@ -115,12 +115,12 @@ where
///
/// 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 mut [crate::Element<'_, Message, Renderer>],
pub fn from_children<'a, Message, Theme, Renderer>(
children: &'a mut [crate::Element<'_, Message, Theme, Renderer>],
tree: &'a mut Tree,
layout: Layout<'_>,
renderer: &Renderer,
) -> Option<Element<'a, Message, Renderer>>
) -> Option<Element<'a, Message, Theme, Renderer>>
where
Renderer: crate::Renderer,
{
Expand Down
35 changes: 20 additions & 15 deletions core/src/overlay/element.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,20 @@ use std::any::Any;

/// A generic [`Overlay`].
#[allow(missing_debug_implementations)]
pub struct Element<'a, Message, Renderer> {
pub struct Element<'a, Message, Theme, Renderer> {
position: Point,
translation: Vector,
overlay: Box<dyn Overlay<Message, Renderer> + 'a>,
overlay: Box<dyn Overlay<Message, Theme, Renderer> + 'a>,
}

impl<'a, Message, Renderer> Element<'a, Message, Renderer>
impl<'a, Message, Theme, Renderer> Element<'a, Message, Theme, Renderer>
where
Renderer: crate::Renderer,
{
/// Creates a new [`Element`] containing the given [`Overlay`].
pub fn new(
position: Point,
overlay: Box<dyn Overlay<Message, Renderer> + 'a>,
overlay: Box<dyn Overlay<Message, Theme, Renderer> + 'a>,
) -> Self {
Self {
position,
Expand All @@ -46,9 +46,13 @@ where
}

/// Applies a transformation to the produced message of the [`Element`].
pub fn map<B>(self, f: &'a dyn Fn(Message) -> B) -> Element<'a, B, Renderer>
pub fn map<B>(
self,
f: &'a dyn Fn(Message) -> B,
) -> Element<'a, B, Theme, Renderer>
where
Message: 'a,
Theme: 'a,
Renderer: 'a,
B: 'a,
{
Expand Down Expand Up @@ -104,7 +108,7 @@ where
pub fn draw(
&self,
renderer: &mut Renderer,
theme: &Renderer::Theme,
theme: &Theme,
style: &renderer::Style,
layout: Layout<'_>,
cursor: mouse::Cursor,
Expand Down Expand Up @@ -137,26 +141,27 @@ where
&'b mut self,
layout: Layout<'_>,
renderer: &Renderer,
) -> Option<Element<'b, Message, Renderer>> {
) -> Option<Element<'b, Message, Theme, Renderer>> {
self.overlay.overlay(layout, renderer)
}
}

struct Map<'a, A, B, Renderer> {
content: Box<dyn Overlay<A, Renderer> + 'a>,
struct Map<'a, A, B, Theme, Renderer> {
content: Box<dyn Overlay<A, Theme, Renderer> + 'a>,
mapper: &'a dyn Fn(A) -> B,
}

impl<'a, A, B, Renderer> Map<'a, A, B, Renderer> {
impl<'a, A, B, Theme, Renderer> Map<'a, A, B, Theme, Renderer> {
pub fn new(
content: Box<dyn Overlay<A, Renderer> + 'a>,
content: Box<dyn Overlay<A, Theme, Renderer> + 'a>,
mapper: &'a dyn Fn(A) -> B,
) -> Map<'a, A, B, Renderer> {
) -> Map<'a, A, B, Theme, Renderer> {
Map { content, mapper }
}
}

impl<'a, A, B, Renderer> Overlay<B, Renderer> for Map<'a, A, B, Renderer>
impl<'a, A, B, Theme, Renderer> Overlay<B, Theme, Renderer>
for Map<'a, A, B, Theme, Renderer>
where
Renderer: crate::Renderer,
{
Expand Down Expand Up @@ -269,7 +274,7 @@ where
fn draw(
&self,
renderer: &mut Renderer,
theme: &Renderer::Theme,
theme: &Theme,
style: &renderer::Style,
layout: Layout<'_>,
cursor: mouse::Cursor,
Expand All @@ -290,7 +295,7 @@ where
&'b mut self,
layout: Layout<'_>,
renderer: &Renderer,
) -> Option<Element<'b, B, Renderer>> {
) -> Option<Element<'b, B, Theme, Renderer>> {
self.content
.overlay(layout, renderer)
.map(|overlay| overlay.map(self.mapper))
Expand Down
Loading
Loading