summaryrefslogtreecommitdiffstats
path: root/graphics
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 /graphics
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 '')
-rw-r--r--graphics/src/renderer.rs18
-rw-r--r--graphics/src/widget/canvas.rs19
-rw-r--r--graphics/src/widget/pure/canvas.rs19
-rw-r--r--graphics/src/widget/pure/qr_code.rs21
-rw-r--r--graphics/src/widget/qr_code.rs12
5 files changed, 53 insertions, 36 deletions
diff --git a/graphics/src/renderer.rs b/graphics/src/renderer.rs
index cb31ea5f..3c19fbfb 100644
--- a/graphics/src/renderer.rs
+++ b/graphics/src/renderer.rs
@@ -10,19 +10,23 @@ use iced_native::{Background, Element, Font, Point, Rectangle, Size};
pub use iced_native::renderer::Style;
+use std::marker::PhantomData;
+
/// A backend-agnostic renderer that supports all the built-in widgets.
#[derive(Debug)]
-pub struct Renderer<B: Backend> {
+pub struct Renderer<B: Backend, Theme> {
backend: B,
primitives: Vec<Primitive>,
+ theme: PhantomData<Theme>,
}
-impl<B: Backend> Renderer<B> {
+impl<B: Backend, T> Renderer<B, T> {
/// Creates a new [`Renderer`] from the given [`Backend`].
pub fn new(backend: B) -> Self {
Self {
backend,
primitives: Vec::new(),
+ theme: PhantomData,
}
}
@@ -43,10 +47,12 @@ impl<B: Backend> Renderer<B> {
}
}
-impl<B> iced_native::Renderer for Renderer<B>
+impl<B, T> iced_native::Renderer for Renderer<B, T>
where
B: Backend,
{
+ type Theme = T;
+
fn layout<'a, Message>(
&mut self,
element: &Element<'a, Message, Self>,
@@ -114,7 +120,7 @@ where
}
}
-impl<B> text::Renderer for Renderer<B>
+impl<B, T> text::Renderer for Renderer<B, T>
where
B: Backend + backend::Text,
{
@@ -171,7 +177,7 @@ where
}
}
-impl<B> image::Renderer for Renderer<B>
+impl<B, T> image::Renderer for Renderer<B, T>
where
B: Backend + backend::Image,
{
@@ -186,7 +192,7 @@ where
}
}
-impl<B> svg::Renderer for Renderer<B>
+impl<B, T> svg::Renderer for Renderer<B, T>
where
B: Backend + backend::Svg,
{
diff --git a/graphics/src/widget/canvas.rs b/graphics/src/widget/canvas.rs
index 23444b2b..0de08b01 100644
--- a/graphics/src/widget/canvas.rs
+++ b/graphics/src/widget/canvas.rs
@@ -127,7 +127,7 @@ impl<Message, P: Program<Message>> Canvas<Message, P> {
}
}
-impl<Message, P, B> Widget<Message, Renderer<B>> for Canvas<Message, P>
+impl<Message, P, B, T> Widget<Message, Renderer<B, T>> for Canvas<Message, P>
where
P: Program<Message>,
B: Backend,
@@ -142,7 +142,7 @@ where
fn layout(
&self,
- _renderer: &Renderer<B>,
+ _renderer: &Renderer<B, T>,
limits: &layout::Limits,
) -> layout::Node {
let limits = limits.width(self.width).height(self.height);
@@ -156,7 +156,7 @@ where
event: iced_native::Event,
layout: Layout<'_>,
cursor_position: Point,
- _renderer: &Renderer<B>,
+ _renderer: &Renderer<B, T>,
_clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
) -> event::Status {
@@ -193,7 +193,7 @@ where
layout: Layout<'_>,
cursor_position: Point,
_viewport: &Rectangle,
- _renderer: &Renderer<B>,
+ _renderer: &Renderer<B, T>,
) -> mouse::Interaction {
let bounds = layout.bounds();
let cursor = Cursor::from_window_position(cursor_position);
@@ -203,7 +203,8 @@ where
fn draw(
&self,
- renderer: &mut Renderer<B>,
+ renderer: &mut Renderer<B, T>,
+ _theme: &T,
_style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
@@ -233,14 +234,16 @@ where
}
}
-impl<'a, Message, P, B> From<Canvas<Message, P>>
- for Element<'a, Message, Renderer<B>>
+impl<'a, Message, P, B, T> From<Canvas<Message, P>>
+ for Element<'a, Message, Renderer<B, T>>
where
Message: 'static,
P: Program<Message> + 'a,
B: Backend,
{
- fn from(canvas: Canvas<Message, P>) -> Element<'a, Message, Renderer<B>> {
+ fn from(
+ canvas: Canvas<Message, P>,
+ ) -> Element<'a, Message, Renderer<B, T>> {
Element::new(canvas)
}
}
diff --git a/graphics/src/widget/pure/canvas.rs b/graphics/src/widget/pure/canvas.rs
index 2e3e7ede..d53b20f6 100644
--- a/graphics/src/widget/pure/canvas.rs
+++ b/graphics/src/widget/pure/canvas.rs
@@ -103,7 +103,7 @@ where
}
}
-impl<Message, P, B> Widget<Message, Renderer<B>> for Canvas<Message, P>
+impl<Message, P, B, T> Widget<Message, Renderer<B, T>> for Canvas<Message, P>
where
P: Program<Message>,
B: Backend,
@@ -126,7 +126,7 @@ where
fn layout(
&self,
- _renderer: &Renderer<B>,
+ _renderer: &Renderer<B, T>,
limits: &layout::Limits,
) -> layout::Node {
let limits = limits.width(self.width).height(self.height);
@@ -141,7 +141,7 @@ where
event: iced_native::Event,
layout: Layout<'_>,
cursor_position: Point,
- _renderer: &Renderer<B>,
+ _renderer: &Renderer<B, T>,
_clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
) -> event::Status {
@@ -181,7 +181,7 @@ where
layout: Layout<'_>,
cursor_position: Point,
_viewport: &Rectangle,
- _renderer: &Renderer<B>,
+ _renderer: &Renderer<B, T>,
) -> mouse::Interaction {
let bounds = layout.bounds();
let cursor = Cursor::from_window_position(cursor_position);
@@ -193,7 +193,8 @@ where
fn draw(
&self,
tree: &Tree,
- renderer: &mut Renderer<B>,
+ renderer: &mut Renderer<B, T>,
+ _theme: &T,
_style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
@@ -224,14 +225,16 @@ where
}
}
-impl<'a, Message, P, B> From<Canvas<Message, P>>
- for Element<'a, Message, Renderer<B>>
+impl<'a, Message, P, B, T> From<Canvas<Message, P>>
+ for Element<'a, Message, Renderer<B, T>>
where
Message: 'a,
P: Program<Message> + 'a,
B: Backend,
{
- fn from(canvas: Canvas<Message, P>) -> Element<'a, Message, Renderer<B>> {
+ fn from(
+ canvas: Canvas<Message, P>,
+ ) -> Element<'a, Message, Renderer<B, T>> {
Element::new(canvas)
}
}
diff --git a/graphics/src/widget/pure/qr_code.rs b/graphics/src/widget/pure/qr_code.rs
index 9d517374..23a8ceb6 100644
--- a/graphics/src/widget/pure/qr_code.rs
+++ b/graphics/src/widget/pure/qr_code.rs
@@ -9,24 +9,24 @@ use iced_native::{Length, Point, Rectangle};
use iced_pure::widget::tree::Tree;
use iced_pure::{Element, Widget};
-impl<'a, Message, B> Widget<Message, Renderer<B>> for QRCode<'a>
+impl<'a, Message, B, T> Widget<Message, Renderer<B, T>> for QRCode<'a>
where
B: Backend,
{
fn width(&self) -> Length {
- <Self as iced_native::Widget<Message, Renderer<B>>>::width(self)
+ <Self as iced_native::Widget<Message, Renderer<B, T>>>::width(self)
}
fn height(&self) -> Length {
- <Self as iced_native::Widget<Message, Renderer<B>>>::height(self)
+ <Self as iced_native::Widget<Message, Renderer<B, T>>>::height(self)
}
fn layout(
&self,
- renderer: &Renderer<B>,
+ renderer: &Renderer<B, T>,
limits: &layout::Limits,
) -> layout::Node {
- <Self as iced_native::Widget<Message, Renderer<B>>>::layout(
+ <Self as iced_native::Widget<Message, Renderer<B, T>>>::layout(
self, renderer, limits,
)
}
@@ -34,15 +34,17 @@ where
fn draw(
&self,
_tree: &Tree,
- renderer: &mut Renderer<B>,
+ renderer: &mut Renderer<B, T>,
+ theme: &T,
style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
viewport: &Rectangle,
) {
- <Self as iced_native::Widget<Message, Renderer<B>>>::draw(
+ <Self as iced_native::Widget<Message, Renderer<B, T>>>::draw(
self,
renderer,
+ theme,
style,
layout,
cursor_position,
@@ -51,11 +53,12 @@ where
}
}
-impl<'a, Message, B> Into<Element<'a, Message, Renderer<B>>> for QRCode<'a>
+impl<'a, Message, B, T> Into<Element<'a, Message, Renderer<B, T>>>
+ for QRCode<'a>
where
B: Backend,
{
- fn into(self) -> Element<'a, Message, Renderer<B>> {
+ fn into(self) -> Element<'a, Message, Renderer<B, T>> {
Element::new(self)
}
}
diff --git a/graphics/src/widget/qr_code.rs b/graphics/src/widget/qr_code.rs
index 907794b7..1eb862ba 100644
--- a/graphics/src/widget/qr_code.rs
+++ b/graphics/src/widget/qr_code.rs
@@ -47,7 +47,7 @@ impl<'a> QRCode<'a> {
}
}
-impl<'a, Message, B> Widget<Message, Renderer<B>> for QRCode<'a>
+impl<'a, Message, B, T> Widget<Message, Renderer<B, T>> for QRCode<'a>
where
B: Backend,
{
@@ -61,7 +61,7 @@ where
fn layout(
&self,
- _renderer: &Renderer<B>,
+ _renderer: &Renderer<B, T>,
_limits: &layout::Limits,
) -> layout::Node {
let side_length = (self.state.width + 2 * QUIET_ZONE) as f32
@@ -75,7 +75,8 @@ where
fn draw(
&self,
- renderer: &mut Renderer<B>,
+ renderer: &mut Renderer<B, T>,
+ _theme: &T,
_style: &renderer::Style,
layout: Layout<'_>,
_cursor_position: Point,
@@ -127,11 +128,12 @@ where
}
}
-impl<'a, Message, B> Into<Element<'a, Message, Renderer<B>>> for QRCode<'a>
+impl<'a, Message, B, T> Into<Element<'a, Message, Renderer<B, T>>>
+ for QRCode<'a>
where
B: Backend,
{
- fn into(self) -> Element<'a, Message, Renderer<B>> {
+ fn into(self) -> Element<'a, Message, Renderer<B, T>> {
Element::new(self)
}
}