summaryrefslogtreecommitdiffstats
path: root/pure
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2022-05-14 01:47:55 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2022-05-14 01:56:32 +0200
commit664251f3f5c7b76f69a97683af1468094bba887f (patch)
treef43a495036ed117ce5dbb479c62652d872a6d273 /pure
parent5de337f214530faab1d5fe47784afd7006c3f7f0 (diff)
downloadiced-664251f3f5c7b76f69a97683af1468094bba887f.tar.gz
iced-664251f3f5c7b76f69a97683af1468094bba887f.tar.bz2
iced-664251f3f5c7b76f69a97683af1468094bba887f.zip
Draft first-class `Theme` support
RFC: https://github.com/iced-rs/rfcs/pull/6
Diffstat (limited to 'pure')
-rw-r--r--pure/src/element.rs7
-rw-r--r--pure/src/helpers.rs7
-rw-r--r--pure/src/lib.rs6
-rw-r--r--pure/src/overlay.rs5
-rw-r--r--pure/src/widget.rs6
-rw-r--r--pure/src/widget/button.rs32
-rw-r--r--pure/src/widget/checkbox.rs2
-rw-r--r--pure/src/widget/column.rs2
-rw-r--r--pure/src/widget/container.rs2
-rw-r--r--pure/src/widget/image.rs2
-rw-r--r--pure/src/widget/pane_grid.rs2
-rw-r--r--pure/src/widget/pane_grid/content.rs4
-rw-r--r--pure/src/widget/pane_grid/title_bar.rs3
-rw-r--r--pure/src/widget/pick_list.rs1
-rw-r--r--pure/src/widget/progress_bar.rs2
-rw-r--r--pure/src/widget/radio.rs2
-rw-r--r--pure/src/widget/row.rs2
-rw-r--r--pure/src/widget/rule.rs2
-rw-r--r--pure/src/widget/scrollable.rs2
-rw-r--r--pure/src/widget/slider.rs1
-rw-r--r--pure/src/widget/space.rs2
-rw-r--r--pure/src/widget/svg.rs2
-rw-r--r--pure/src/widget/text.rs2
-rw-r--r--pure/src/widget/text_input.rs1
-rw-r--r--pure/src/widget/toggler.rs2
-rw-r--r--pure/src/widget/tooltip.rs3
-rw-r--r--pure/src/widget/tree.rs13
27 files changed, 101 insertions, 16 deletions
diff --git a/pure/src/element.rs b/pure/src/element.rs
index 5450db20..35c68716 100644
--- a/pure/src/element.rs
+++ b/pure/src/element.rs
@@ -25,7 +25,10 @@ pub struct Element<'a, Message, Renderer> {
impl<'a, Message, Renderer> Element<'a, Message, 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, Renderer> + 'a) -> Self
+ where
+ Renderer: iced_native::Renderer,
+ {
Self {
widget: Box::new(widget),
}
@@ -278,6 +281,7 @@ where
&self,
tree: &Tree,
renderer: &mut Renderer,
+ theme: &Renderer::Theme,
style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
@@ -286,6 +290,7 @@ where
self.widget.draw(
tree,
renderer,
+ theme,
style,
layout,
cursor_position,
diff --git a/pure/src/helpers.rs b/pure/src/helpers.rs
index 746b807d..ad6f10b1 100644
--- a/pure/src/helpers.rs
+++ b/pure/src/helpers.rs
@@ -50,7 +50,12 @@ where
/// [`Button`]: widget::Button
pub fn button<'a, Message, Renderer>(
content: impl Into<Element<'a, Message, Renderer>>,
-) -> widget::Button<'a, Message, Renderer> {
+) -> widget::Button<'a, Message, Renderer>
+where
+ Renderer: iced_native::Renderer,
+ Renderer::Theme: widget::button::StyleSheet,
+ <Renderer::Theme as widget::button::StyleSheet>::Variant: Default,
+{
widget::Button::new(content)
}
diff --git a/pure/src/lib.rs b/pure/src/lib.rs
index fa5fd46f..95aa3098 100644
--- a/pure/src/lib.rs
+++ b/pure/src/lib.rs
@@ -174,7 +174,9 @@ impl State {
fn diff<Message, Renderer>(
&mut self,
new_element: &Element<'_, Message, Renderer>,
- ) {
+ ) where
+ Renderer: iced_native::Renderer,
+ {
self.state_tree.diff(new_element);
}
}
@@ -224,6 +226,7 @@ where
fn draw(
&self,
renderer: &mut Renderer,
+ theme: &Renderer::Theme,
style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
@@ -232,6 +235,7 @@ where
self.element.as_widget().draw(
&self.state.state_tree,
renderer,
+ theme,
style,
layout,
cursor_position,
diff --git a/pure/src/overlay.rs b/pure/src/overlay.rs
index fecaa2ac..b82d8a67 100644
--- a/pure/src/overlay.rs
+++ b/pure/src/overlay.rs
@@ -14,7 +14,10 @@ pub fn from_children<'a, Message, Renderer>(
tree: &'a mut Tree,
layout: Layout<'_>,
renderer: &Renderer,
-) -> Option<Element<'a, Message, Renderer>> {
+) -> Option<Element<'a, Message, Renderer>>
+where
+ Renderer: iced_native::Renderer,
+{
children
.iter()
.zip(&mut tree.children)
diff --git a/pure/src/widget.rs b/pure/src/widget.rs
index cc04cc96..ab63f7cc 100644
--- a/pure/src/widget.rs
+++ b/pure/src/widget.rs
@@ -53,7 +53,10 @@ use iced_native::{Clipboard, Length, Point, Rectangle, Shell};
///
/// If you want to build your own widgets, you will need to implement this
/// trait.
-pub trait Widget<Message, Renderer> {
+pub trait Widget<Message, Renderer>
+where
+ Renderer: iced_native::Renderer,
+{
/// Returns the width of the [`Widget`].
fn width(&self) -> Length;
@@ -75,6 +78,7 @@ pub trait Widget<Message, Renderer> {
&self,
state: &Tree,
renderer: &mut Renderer,
+ theme: &Renderer::Theme,
style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
diff --git a/pure/src/widget/button.rs b/pure/src/widget/button.rs
index 456c2509..45f4a6aa 100644
--- a/pure/src/widget/button.rs
+++ b/pure/src/widget/button.rs
@@ -50,25 +50,34 @@ use button::State;
/// disabled_button().on_press(Message::ButtonPressed)
/// }
/// ```
-pub struct Button<'a, Message, Renderer> {
+pub struct Button<'a, Message, Renderer>
+where
+ Renderer: iced_native::Renderer,
+ Renderer::Theme: StyleSheet,
+{
content: Element<'a, Message, Renderer>,
on_press: Option<Message>,
- style_sheet: Box<dyn StyleSheet + 'a>,
width: Length,
height: Length,
padding: Padding,
+ variant: <Renderer::Theme as StyleSheet>::Variant,
}
-impl<'a, Message, Renderer> Button<'a, Message, Renderer> {
+impl<'a, Message, Renderer> Button<'a, Message, Renderer>
+where
+ Renderer: iced_native::Renderer,
+ Renderer::Theme: StyleSheet,
+ <Renderer::Theme as StyleSheet>::Variant: Default,
+{
/// Creates a new [`Button`] with the given content.
pub fn new(content: impl Into<Element<'a, Message, Renderer>>) -> Self {
Button {
content: content.into(),
on_press: None,
- style_sheet: Default::default(),
width: Length::Shrink,
height: Length::Shrink,
padding: Padding::new(5),
+ variant: <Renderer::Theme as StyleSheet>::Variant::default(),
}
}
@@ -98,12 +107,12 @@ impl<'a, Message, Renderer> Button<'a, Message, Renderer> {
self
}
- /// Sets the style of the [`Button`].
+ /// Sets the style variant of this [`Button`].
pub fn style(
mut self,
- style_sheet: impl Into<Box<dyn StyleSheet + 'a>>,
+ variant: <Renderer::Theme as StyleSheet>::Variant,
) -> Self {
- self.style_sheet = style_sheet.into();
+ self.variant = variant;
self
}
}
@@ -113,6 +122,8 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>
where
Message: 'a + Clone,
Renderer: 'a + iced_native::Renderer,
+ Renderer::Theme: StyleSheet,
+ <Renderer::Theme as StyleSheet>::Variant: Copy,
{
fn tag(&self) -> tree::Tag {
tree::Tag::of::<State>()
@@ -191,6 +202,7 @@ where
&self,
tree: &Tree,
renderer: &mut Renderer,
+ theme: &Renderer::Theme,
_style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
@@ -204,13 +216,15 @@ where
bounds,
cursor_position,
self.on_press.is_some(),
- self.style_sheet.as_ref(),
+ theme,
+ self.variant,
|| tree.state.downcast_ref::<State>(),
);
self.content.as_widget().draw(
&tree.children[0],
renderer,
+ theme,
&renderer::Style {
text_color: styling.text_color,
},
@@ -254,6 +268,8 @@ impl<'a, Message, Renderer> Into<Element<'a, Message, Renderer>>
where
Message: Clone + 'a,
Renderer: iced_native::Renderer + 'a,
+ Renderer::Theme: StyleSheet,
+ <Renderer::Theme as StyleSheet>::Variant: Copy,
{
fn into(self) -> Element<'a, Message, Renderer> {
Element::new(self)
diff --git a/pure/src/widget/checkbox.rs b/pure/src/widget/checkbox.rs
index 98f55a56..a6a6f8de 100644
--- a/pure/src/widget/checkbox.rs
+++ b/pure/src/widget/checkbox.rs
@@ -59,6 +59,7 @@ where
&self,
_tree: &Tree,
renderer: &mut Renderer,
+ theme: &Renderer::Theme,
style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
@@ -67,6 +68,7 @@ where
<Self as iced_native::Widget<Message, Renderer>>::draw(
self,
renderer,
+ theme,
style,
layout,
cursor_position,
diff --git a/pure/src/widget/column.rs b/pure/src/widget/column.rs
index 7256f474..74d789a1 100644
--- a/pure/src/widget/column.rs
+++ b/pure/src/widget/column.rs
@@ -194,6 +194,7 @@ where
&self,
tree: &Tree,
renderer: &mut Renderer,
+ theme: &Renderer::Theme,
style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
@@ -208,6 +209,7 @@ where
child.as_widget().draw(
state,
renderer,
+ theme,
style,
layout,
cursor_position,
diff --git a/pure/src/widget/container.rs b/pure/src/widget/container.rs
index 91db1f3f..0ec2351a 100644
--- a/pure/src/widget/container.rs
+++ b/pure/src/widget/container.rs
@@ -201,6 +201,7 @@ where
&self,
tree: &Tree,
renderer: &mut Renderer,
+ theme: &Renderer::Theme,
renderer_style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
@@ -213,6 +214,7 @@ where
self.content.as_widget().draw(
&tree.children[0],
renderer,
+ theme,
&renderer::Style {
text_color: style
.text_color
diff --git a/pure/src/widget/image.rs b/pure/src/widget/image.rs
index ef764ec2..c42113dc 100644
--- a/pure/src/widget/image.rs
+++ b/pure/src/widget/image.rs
@@ -38,6 +38,7 @@ where
&self,
_tree: &Tree,
renderer: &mut Renderer,
+ theme: &Renderer::Theme,
style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
@@ -46,6 +47,7 @@ where
<Self as iced_native::Widget<Message, Renderer>>::draw(
self,
renderer,
+ theme,
style,
layout,
cursor_position,
diff --git a/pure/src/widget/pane_grid.rs b/pure/src/widget/pane_grid.rs
index c532a6de..168fe12b 100644
--- a/pure/src/widget/pane_grid.rs
+++ b/pure/src/widget/pane_grid.rs
@@ -331,6 +331,7 @@ where
&self,
tree: &Tree,
renderer: &mut Renderer,
+ theme: &Renderer::Theme,
style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
@@ -360,6 +361,7 @@ where
content.draw(
tree,
renderer,
+ theme,
style,
layout,
cursor_position,
diff --git a/pure/src/widget/pane_grid/content.rs b/pure/src/widget/pane_grid/content.rs
index e66ac40b..5069bd4a 100644
--- a/pure/src/widget/pane_grid/content.rs
+++ b/pure/src/widget/pane_grid/content.rs
@@ -89,6 +89,7 @@ where
&self,
tree: &Tree,
renderer: &mut Renderer,
+ theme: &Renderer::Theme,
style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
@@ -112,6 +113,7 @@ where
title_bar.draw(
&tree.children[1],
renderer,
+ theme,
style,
title_bar_layout,
cursor_position,
@@ -122,6 +124,7 @@ where
self.body.as_widget().draw(
&tree.children[0],
renderer,
+ theme,
style,
body_layout,
cursor_position,
@@ -131,6 +134,7 @@ where
self.body.as_widget().draw(
&tree.children[0],
renderer,
+ theme,
style,
layout,
cursor_position,
diff --git a/pure/src/widget/pane_grid/title_bar.rs b/pure/src/widget/pane_grid/title_bar.rs
index 4a7c8c17..28a3d7fc 100644
--- a/pure/src/widget/pane_grid/title_bar.rs
+++ b/pure/src/widget/pane_grid/title_bar.rs
@@ -113,6 +113,7 @@ where
&self,
tree: &Tree,
renderer: &mut Renderer,
+ theme: &Renderer::Theme,
inherited_style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
@@ -136,6 +137,7 @@ where
self.content.as_widget().draw(
&tree.children[0],
renderer,
+ theme,
&inherited_style,
title_layout,
cursor_position,
@@ -149,6 +151,7 @@ where
controls.as_widget().draw(
&tree.children[1],
renderer,
+ theme,
&inherited_style,
controls_layout,
cursor_position,
diff --git a/pure/src/widget/pick_list.rs b/pure/src/widget/pick_list.rs
index 255e3681..78302a7d 100644
--- a/pure/src/widget/pick_list.rs
+++ b/pure/src/widget/pick_list.rs
@@ -181,6 +181,7 @@ where
&self,
_tree: &Tree,
renderer: &mut Renderer,
+ _theme: &Renderer::Theme,
_style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
diff --git a/pure/src/widget/progress_bar.rs b/pure/src/widget/progress_bar.rs
index 3016a81a..47a299ac 100644
--- a/pure/src/widget/progress_bar.rs
+++ b/pure/src/widget/progress_bar.rs
@@ -57,6 +57,7 @@ where
&self,
_tree: &Tree,
renderer: &mut Renderer,
+ theme: &Renderer::Theme,
style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
@@ -65,6 +66,7 @@ where
<Self as iced_native::Widget<Message, Renderer>>::draw(
self,
renderer,
+ theme,
style,
layout,
cursor_position,
diff --git a/pure/src/widget/radio.rs b/pure/src/widget/radio.rs
index 7c98c937..c92c8dbc 100644
--- a/pure/src/widget/radio.rs
+++ b/pure/src/widget/radio.rs
@@ -60,6 +60,7 @@ where
&self,
_tree: &Tree,
renderer: &mut Renderer,
+ theme: &Renderer::Theme,
style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
@@ -68,6 +69,7 @@ where
<Self as iced_native::Widget<Message, Renderer>>::draw(
self,
renderer,
+ theme,
style,
layout,
cursor_position,
diff --git a/pure/src/widget/row.rs b/pure/src/widget/row.rs
index 0385b8bd..e747adfc 100644
--- a/pure/src/widget/row.rs
+++ b/pure/src/widget/row.rs
@@ -181,6 +181,7 @@ where
&self,
tree: &Tree,
renderer: &mut Renderer,
+ theme: &Renderer::Theme,
style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
@@ -195,6 +196,7 @@ where
child.as_widget().draw(
state,
renderer,
+ theme,
style,
layout,
cursor_position,
diff --git a/pure/src/widget/rule.rs b/pure/src/widget/rule.rs
index ab8537ae..8e6af58e 100644
--- a/pure/src/widget/rule.rs
+++ b/pure/src/widget/rule.rs
@@ -57,6 +57,7 @@ where
&self,
_tree: &Tree,
renderer: &mut Renderer,
+ theme: &Renderer::Theme,
style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
@@ -65,6 +66,7 @@ where
<Self as iced_native::Widget<Message, Renderer>>::draw(
self,
renderer,
+ theme,
style,
layout,
cursor_position,
diff --git a/pure/src/widget/scrollable.rs b/pure/src/widget/scrollable.rs
index 70e951ef..a0180dc0 100644
--- a/pure/src/widget/scrollable.rs
+++ b/pure/src/widget/scrollable.rs
@@ -171,6 +171,7 @@ where
&self,
tree: &Tree,
renderer: &mut Renderer,
+ theme: &Renderer::Theme,
style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
@@ -189,6 +190,7 @@ where
self.content.as_widget().draw(
&tree.children[0],
renderer,
+ theme,
style,
layout,
cursor_position,
diff --git a/pure/src/widget/slider.rs b/pure/src/widget/slider.rs
index 4d8bbce4..2f934a48 100644
--- a/pure/src/widget/slider.rs
+++ b/pure/src/widget/slider.rs
@@ -195,6 +195,7 @@ where
&self,
tree: &Tree,
renderer: &mut Renderer,
+ theme: &Renderer::Theme,
_style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
diff --git a/pure/src/widget/space.rs b/pure/src/widget/space.rs
index b408153b..7d95ebd7 100644
--- a/pure/src/widget/space.rs
+++ b/pure/src/widget/space.rs
@@ -56,6 +56,7 @@ where
&self,
_tree: &Tree,
renderer: &mut Renderer,
+ theme: &Renderer::Theme,
style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
@@ -64,6 +65,7 @@ where
<Self as iced_native::Widget<Message, Renderer>>::draw(
self,
renderer,
+ theme,
style,
layout,
cursor_position,
diff --git a/pure/src/widget/svg.rs b/pure/src/widget/svg.rs
index 14180097..501d9bfa 100644
--- a/pure/src/widget/svg.rs
+++ b/pure/src/widget/svg.rs
@@ -36,6 +36,7 @@ where
&self,
_tree: &Tree,
renderer: &mut Renderer,
+ theme: &Renderer::Theme,
style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
@@ -44,6 +45,7 @@ where
<Self as iced_native::Widget<Message, Renderer>>::draw(
self,
renderer,
+ theme,
style,
layout,
cursor_position,
diff --git a/pure/src/widget/text.rs b/pure/src/widget/text.rs
index 58a939c1..0a51b628 100644
--- a/pure/src/widget/text.rs
+++ b/pure/src/widget/text.rs
@@ -34,6 +34,7 @@ where
&self,
_tree: &Tree,
renderer: &mut Renderer,
+ theme: &Renderer::Theme,
style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
@@ -42,6 +43,7 @@ where
<Self as iced_native::Widget<Message, Renderer>>::draw(
self,
renderer,
+ theme,
style,
layout,
cursor_position,
diff --git a/pure/src/widget/text_input.rs b/pure/src/widget/text_input.rs
index 57ad26d9..7d768513 100644
--- a/pure/src/widget/text_input.rs
+++ b/pure/src/widget/text_input.rs
@@ -190,6 +190,7 @@ where
&self,
tree: &Tree,
renderer: &mut Renderer,
+ theme: &Renderer::Theme,
_style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
diff --git a/pure/src/widget/toggler.rs b/pure/src/widget/toggler.rs
index b9c5ec02..e08b5f47 100644
--- a/pure/src/widget/toggler.rs
+++ b/pure/src/widget/toggler.rs
@@ -38,6 +38,7 @@ where
&self,
_state: &Tree,
renderer: &mut Renderer,
+ theme: &Renderer::Theme,
style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
@@ -46,6 +47,7 @@ where
<Self as iced_native::Widget<Message, Renderer>>::draw(
self,
renderer,
+ theme,
style,
layout,
cursor_position,
diff --git a/pure/src/widget/tooltip.rs b/pure/src/widget/tooltip.rs
index 3887732a..15aa32fe 100644
--- a/pure/src/widget/tooltip.rs
+++ b/pure/src/widget/tooltip.rs
@@ -157,6 +157,7 @@ where
&self,
tree: &Tree,
renderer: &mut Renderer,
+ theme: &Renderer::Theme,
inherited_style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
@@ -165,6 +166,7 @@ where
self.content.as_widget().draw(
&tree.children[0],
renderer,
+ theme,
inherited_style,
layout,
cursor_position,
@@ -191,6 +193,7 @@ where
tooltip,
&Tree::empty(),
renderer,
+ theme,
defaults,
layout,
cursor_position,
diff --git a/pure/src/widget/tree.rs b/pure/src/widget/tree.rs
index 0bb3107a..2f876523 100644
--- a/pure/src/widget/tree.rs
+++ b/pure/src/widget/tree.rs
@@ -31,7 +31,10 @@ impl Tree {
/// Creates a new [`Tree`] for the provided [`Element`].
pub fn new<'a, Message, Renderer>(
widget: impl Borrow<dyn Widget<Message, Renderer> + 'a>,
- ) -> Self {
+ ) -> Self
+ where
+ Renderer: iced_native::Renderer,
+ {
let widget = widget.borrow();
Self {
@@ -52,7 +55,9 @@ impl Tree {
pub fn diff<'a, Message, Renderer>(
&mut self,
new: impl Borrow<dyn Widget<Message, Renderer> + 'a>,
- ) {
+ ) where
+ Renderer: iced_native::Renderer,
+ {
if self.tag == new.borrow().tag() {
new.borrow().diff(self)
} else {
@@ -64,7 +69,9 @@ impl Tree {
pub fn diff_children<'a, Message, Renderer>(
&mut self,
new_children: &[impl Borrow<dyn Widget<Message, Renderer> + 'a>],
- ) {
+ ) where
+ Renderer: iced_native::Renderer,
+ {
self.diff_children_custom(
new_children,
|tree, widget| tree.diff(widget.borrow()),