Draft first-class Theme support
RFC: https://github.com/iced-rs/rfcs/pull/6
This commit is contained in:
parent
5de337f214
commit
664251f3f5
113 changed files with 767 additions and 878 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -181,6 +181,7 @@ where
|
|||
&self,
|
||||
_tree: &Tree,
|
||||
renderer: &mut Renderer,
|
||||
_theme: &Renderer::Theme,
|
||||
_style: &renderer::Style,
|
||||
layout: Layout<'_>,
|
||||
cursor_position: Point,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -195,6 +195,7 @@ where
|
|||
&self,
|
||||
tree: &Tree,
|
||||
renderer: &mut Renderer,
|
||||
theme: &Renderer::Theme,
|
||||
_style: &renderer::Style,
|
||||
layout: Layout<'_>,
|
||||
cursor_position: Point,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -190,6 +190,7 @@ where
|
|||
&self,
|
||||
tree: &Tree,
|
||||
renderer: &mut Renderer,
|
||||
theme: &Renderer::Theme,
|
||||
_style: &renderer::Style,
|
||||
layout: Layout<'_>,
|
||||
cursor_position: Point,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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()),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue