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
|
|
@ -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,
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue