Draft first-class Theme support

RFC: https://github.com/iced-rs/rfcs/pull/6
This commit is contained in:
Héctor Ramón Jiménez 2022-05-14 01:47:55 +02:00
parent 5de337f214
commit 664251f3f5
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
113 changed files with 767 additions and 878 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -181,6 +181,7 @@ where
&self,
_tree: &Tree,
renderer: &mut Renderer,
_theme: &Renderer::Theme,
_style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -195,6 +195,7 @@ where
&self,
tree: &Tree,
renderer: &mut Renderer,
theme: &Renderer::Theme,
_style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,

View file

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

View file

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

View file

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

View file

@ -190,6 +190,7 @@ where
&self,
tree: &Tree,
renderer: &mut Renderer,
theme: &Renderer::Theme,
_style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,

View file

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

View file

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

View file

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