summaryrefslogtreecommitdiffstats
path: root/glow/src/renderer
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--glow/src/backend.rs (renamed from glow/src/renderer.rs)86
-rw-r--r--glow/src/renderer/widget.rs19
-rw-r--r--glow/src/renderer/widget/button.rs93
-rw-r--r--glow/src/renderer/widget/checkbox.rs63
-rw-r--r--glow/src/renderer/widget/image.rs22
-rw-r--r--glow/src/renderer/widget/row.rs34
-rw-r--r--glow/src/renderer/widget/slider.rs106
-rw-r--r--glow/src/renderer/widget/space.rs8
-rw-r--r--glow/src/renderer/widget/svg.rs22
-rw-r--r--glow/src/renderer/widget/text_input.rs261
-rw-r--r--graphics/src/renderer/widget/column.rs (renamed from glow/src/renderer/widget/column.rs)11
-rw-r--r--graphics/src/renderer/widget/container.rs (renamed from glow/src/renderer/widget/container.rs)9
-rw-r--r--graphics/src/renderer/widget/pane_grid.rs (renamed from glow/src/renderer/widget/pane_grid.rs)15
-rw-r--r--graphics/src/renderer/widget/progress_bar.rs (renamed from glow/src/renderer/widget/progress_bar.rs)8
-rw-r--r--graphics/src/renderer/widget/radio.rs (renamed from glow/src/renderer/widget/radio.rs)7
-rw-r--r--graphics/src/renderer/widget/scrollable.rs (renamed from glow/src/renderer/widget/scrollable.rs)11
-rw-r--r--graphics/src/renderer/widget/text.rs (renamed from glow/src/renderer/widget/text.rs)8
17 files changed, 75 insertions, 708 deletions
diff --git a/glow/src/renderer.rs b/glow/src/backend.rs
index 40228a6b..7293eba1 100644
--- a/glow/src/renderer.rs
+++ b/glow/src/backend.rs
@@ -1,19 +1,17 @@
-use crate::{
- quad, text, triangle, Defaults, Primitive, Quad, Settings, Transformation,
- Viewport,
-};
-
-use iced_native::{
- layout, mouse, Background, Color, Layout, Point, Rectangle, Vector, Widget,
-};
-
-mod widget;
+use crate::quad;
+use crate::text;
+use crate::triangle;
+use crate::{Quad, Settings, Transformation, Viewport};
+use iced_graphics::backend;
+use iced_graphics::Primitive;
+use iced_native::mouse;
+use iced_native::{Background, Font, Point, Rectangle, Size, Vector};
/// A [`glow`] renderer.
///
/// [`glow`]: https://github.com/grovesNL/glow
#[derive(Debug)]
-pub struct Renderer {
+pub struct Backend {
quad_pipeline: quad::Pipeline,
text_pipeline: text::Pipeline,
triangle_pipeline: triangle::Pipeline,
@@ -43,7 +41,7 @@ impl<'a> Layer<'a> {
}
}
-impl Renderer {
+impl Backend {
/// Creates a new [`Renderer`].
///
/// [`Renderer`]: struct.Renderer.html
@@ -399,57 +397,27 @@ impl Renderer {
}
}
-impl iced_native::Renderer for Renderer {
- type Output = (Primitive, mouse::Interaction);
- type Defaults = Defaults;
-
- fn layout<'a, Message>(
- &mut self,
- element: &iced_native::Element<'a, Message, Self>,
- limits: &iced_native::layout::Limits,
- ) -> iced_native::layout::Node {
- let node = element.layout(self, limits);
-
- self.text_pipeline.clear_measurement_cache();
-
- node
+impl iced_graphics::Backend for Backend {
+ fn trim_measurements(&mut self) {
+ self.text_pipeline.trim_measurement_cache()
}
}
-impl layout::Debugger for Renderer {
- fn explain<Message>(
- &mut self,
- defaults: &Defaults,
- widget: &dyn Widget<Message, Self>,
- layout: Layout<'_>,
- cursor_position: Point,
- color: Color,
- ) -> Self::Output {
- let mut primitives = Vec::new();
- let (primitive, cursor) =
- widget.draw(self, defaults, layout, cursor_position);
-
- explain_layout(layout, color, &mut primitives);
- primitives.push(primitive);
-
- (Primitive::Group { primitives }, cursor)
+impl backend::Text for Backend {
+ const ICON_FONT: Font = text::BUILTIN_ICONS;
+ const CHECKMARK_ICON: char = text::CHECKMARK_ICON;
+
+ fn measure(
+ &self,
+ contents: &str,
+ size: f32,
+ font: Font,
+ bounds: Size,
+ ) -> (f32, f32) {
+ self.text_pipeline.measure(contents, size, font, bounds)
}
-}
-fn explain_layout(
- layout: Layout<'_>,
- color: Color,
- primitives: &mut Vec<Primitive>,
-) {
- primitives.push(Primitive::Quad {
- bounds: layout.bounds(),
- background: Background::Color(Color::TRANSPARENT),
- border_radius: 0,
- border_width: 1,
- border_color: [0.6, 0.6, 0.6, 0.5].into(),
- });
-
- for child in layout.children() {
- explain_layout(child, color, primitives);
+ fn space_width(&self, size: f32) -> f32 {
+ self.text_pipeline.space_width(size)
}
}
diff --git a/glow/src/renderer/widget.rs b/glow/src/renderer/widget.rs
deleted file mode 100644
index 37421fbe..00000000
--- a/glow/src/renderer/widget.rs
+++ /dev/null
@@ -1,19 +0,0 @@
-mod button;
-mod checkbox;
-mod column;
-mod container;
-mod pane_grid;
-mod progress_bar;
-mod radio;
-mod row;
-mod scrollable;
-mod slider;
-mod space;
-mod text;
-mod text_input;
-
-#[cfg(feature = "svg")]
-mod svg;
-
-#[cfg(feature = "image")]
-mod image;
diff --git a/glow/src/renderer/widget/button.rs b/glow/src/renderer/widget/button.rs
deleted file mode 100644
index eb225038..00000000
--- a/glow/src/renderer/widget/button.rs
+++ /dev/null
@@ -1,93 +0,0 @@
-use crate::{button::StyleSheet, defaults, Defaults, Primitive, Renderer};
-use iced_native::{
- mouse, Background, Color, Element, Layout, Point, Rectangle, Vector,
-};
-
-impl iced_native::button::Renderer for Renderer {
- const DEFAULT_PADDING: u16 = 5;
-
- type Style = Box<dyn StyleSheet>;
-
- fn draw<Message>(
- &mut self,
- _defaults: &Defaults,
- bounds: Rectangle,
- cursor_position: Point,
- is_disabled: bool,
- is_pressed: bool,
- style: &Box<dyn StyleSheet>,
- content: &Element<'_, Message, Self>,
- content_layout: Layout<'_>,
- ) -> Self::Output {
- let is_mouse_over = bounds.contains(cursor_position);
-
- let styling = if is_disabled {
- style.disabled()
- } else if is_mouse_over {
- if is_pressed {
- style.pressed()
- } else {
- style.hovered()
- }
- } else {
- style.active()
- };
-
- let (content, _) = content.draw(
- self,
- &Defaults {
- text: defaults::Text {
- color: styling.text_color,
- },
- },
- content_layout,
- cursor_position,
- );
-
- (
- if styling.background.is_some() || styling.border_width > 0 {
- let background = Primitive::Quad {
- bounds,
- background: styling
- .background
- .unwrap_or(Background::Color(Color::TRANSPARENT)),
- border_radius: styling.border_radius,
- border_width: styling.border_width,
- border_color: styling.border_color,
- };
-
- if styling.shadow_offset == Vector::default() {
- Primitive::Group {
- primitives: vec![background, content],
- }
- } else {
- // TODO: Implement proper shadow support
- let shadow = Primitive::Quad {
- bounds: Rectangle {
- x: bounds.x + styling.shadow_offset.x,
- y: bounds.y + styling.shadow_offset.y,
- ..bounds
- },
- background: Background::Color(
- [0.0, 0.0, 0.0, 0.5].into(),
- ),
- border_radius: styling.border_radius,
- border_width: 0,
- border_color: Color::TRANSPARENT,
- };
-
- Primitive::Group {
- primitives: vec![shadow, background, content],
- }
- }
- } else {
- content
- },
- if is_mouse_over {
- mouse::Interaction::Pointer
- } else {
- mouse::Interaction::default()
- },
- )
- }
-}
diff --git a/glow/src/renderer/widget/checkbox.rs b/glow/src/renderer/widget/checkbox.rs
deleted file mode 100644
index 0340bf62..00000000
--- a/glow/src/renderer/widget/checkbox.rs
+++ /dev/null
@@ -1,63 +0,0 @@
-use crate::{checkbox::StyleSheet, Primitive, Renderer};
-use iced_native::{
- checkbox, mouse, HorizontalAlignment, Rectangle, VerticalAlignment,
-};
-
-impl checkbox::Renderer for Renderer {
- type Style = Box<dyn StyleSheet>;
-
- const DEFAULT_SIZE: u16 = 20;
- const DEFAULT_SPACING: u16 = 15;
-
- fn draw(
- &mut self,
- bounds: Rectangle,
- is_checked: bool,
- is_mouse_over: bool,
- (label, _): Self::Output,
- style_sheet: &Self::Style,
- ) -> Self::Output {
- let style = if is_mouse_over {
- style_sheet.hovered(is_checked)
- } else {
- style_sheet.active(is_checked)
- };
-
- let checkbox = Primitive::Quad {
- bounds,
- background: style.background,
- border_radius: style.border_radius,
- border_width: style.border_width,
- border_color: style.border_color,
- };
-
- (
- Primitive::Group {
- primitives: if is_checked {
- let check = Primitive::Text {
- content: crate::text::CHECKMARK_ICON.to_string(),
- font: crate::text::BUILTIN_ICONS,
- size: bounds.height * 0.7,
- bounds: Rectangle {
- x: bounds.center_x(),
- y: bounds.center_y(),
- ..bounds
- },
- color: style.checkmark_color,
- horizontal_alignment: HorizontalAlignment::Center,
- vertical_alignment: VerticalAlignment::Center,
- };
-
- vec![checkbox, check, label]
- } else {
- vec![checkbox, label]
- },
- },
- if is_mouse_over {
- mouse::Interaction::Pointer
- } else {
- mouse::Interaction::default()
- },
- )
- }
-}
diff --git a/glow/src/renderer/widget/image.rs b/glow/src/renderer/widget/image.rs
deleted file mode 100644
index c4c04984..00000000
--- a/glow/src/renderer/widget/image.rs
+++ /dev/null
@@ -1,22 +0,0 @@
-use crate::{Primitive, Renderer};
-use iced_native::{image, mouse, Layout};
-
-impl image::Renderer for Renderer {
- fn dimensions(&self, handle: &image::Handle) -> (u32, u32) {
- self.image_pipeline.dimensions(handle)
- }
-
- fn draw(
- &mut self,
- handle: image::Handle,
- layout: Layout<'_>,
- ) -> Self::Output {
- (
- Primitive::Image {
- handle,
- bounds: layout.bounds(),
- },
- mouse::Interaction::default(),
- )
- }
-}
diff --git a/glow/src/renderer/widget/row.rs b/glow/src/renderer/widget/row.rs
deleted file mode 100644
index d0b7ef09..00000000
--- a/glow/src/renderer/widget/row.rs
+++ /dev/null
@@ -1,34 +0,0 @@
-use crate::{Primitive, Renderer};
-use iced_native::{mouse, row, Element, Layout, Point};
-
-impl row::Renderer for Renderer {
- fn draw<Message>(
- &mut self,
- defaults: &Self::Defaults,
- children: &[Element<'_, Message, Self>],
- layout: Layout<'_>,
- cursor_position: Point,
- ) -> Self::Output {
- let mut mouse_interaction = mouse::Interaction::default();
-
- (
- Primitive::Group {
- primitives: children
- .iter()
- .zip(layout.children())
- .map(|(child, layout)| {
- let (primitive, new_mouse_interaction) =
- child.draw(self, defaults, layout, cursor_position);
-
- if new_mouse_interaction > mouse_interaction {
- mouse_interaction = new_mouse_interaction;
- }
-
- primitive
- })
- .collect(),
- },
- mouse_interaction,
- )
- }
-}
diff --git a/glow/src/renderer/widget/slider.rs b/glow/src/renderer/widget/slider.rs
deleted file mode 100644
index 220feace..00000000
--- a/glow/src/renderer/widget/slider.rs
+++ /dev/null
@@ -1,106 +0,0 @@
-use crate::{
- slider::{HandleShape, StyleSheet},
- Primitive, Renderer,
-};
-use iced_native::{mouse, slider, Background, Color, Point, Rectangle};
-
-const HANDLE_HEIGHT: f32 = 22.0;
-
-impl slider::Renderer for Renderer {
- type Style = Box<dyn StyleSheet>;
-
- fn height(&self) -> u32 {
- 30
- }
-
- fn draw(
- &mut self,
- bounds: Rectangle,
- cursor_position: Point,
- range: std::ops::RangeInclusive<f32>,
- value: f32,
- is_dragging: bool,
- style_sheet: &Self::Style,
- ) -> Self::Output {
- let is_mouse_over = bounds.contains(cursor_position);
-
- let style = if is_dragging {
- style_sheet.dragging()
- } else if is_mouse_over {
- style_sheet.hovered()
- } else {
- style_sheet.active()
- };
-
- let rail_y = bounds.y + (bounds.height / 2.0).round();
-
- let (rail_top, rail_bottom) = (
- Primitive::Quad {
- bounds: Rectangle {
- x: bounds.x,
- y: rail_y,
- width: bounds.width,
- height: 2.0,
- },
- background: Background::Color(style.rail_colors.0),
- border_radius: 0,
- border_width: 0,
- border_color: Color::TRANSPARENT,
- },
- Primitive::Quad {
- bounds: Rectangle {
- x: bounds.x,
- y: rail_y + 2.0,
- width: bounds.width,
- height: 2.0,
- },
- background: Background::Color(style.rail_colors.1),
- border_radius: 0,
- border_width: 0,
- border_color: Color::TRANSPARENT,
- },
- );
-
- let (range_start, range_end) = range.into_inner();
-
- let (handle_width, handle_height, handle_border_radius) =
- match style.handle.shape {
- HandleShape::Circle { radius } => {
- (f32::from(radius * 2), f32::from(radius * 2), radius)
- }
- HandleShape::Rectangle {
- width,
- border_radius,
- } => (f32::from(width), HANDLE_HEIGHT, border_radius),
- };
-
- let handle_offset = (bounds.width - handle_width)
- * ((value - range_start) / (range_end - range_start).max(1.0));
-
- let handle = Primitive::Quad {
- bounds: Rectangle {
- x: bounds.x + handle_offset.round(),
- y: rail_y - handle_height / 2.0,
- width: handle_width,
- height: handle_height,
- },
- background: Background::Color(style.handle.color),
- border_radius: handle_border_radius,
- border_width: style.handle.border_width,
- border_color: style.handle.border_color,
- };
-
- (
- Primitive::Group {
- primitives: vec![rail_top, rail_bottom, handle],
- },
- if is_dragging {
- mouse::Interaction::Grabbing
- } else if is_mouse_over {
- mouse::Interaction::Grab
- } else {
- mouse::Interaction::default()
- },
- )
- }
-}
diff --git a/glow/src/renderer/widget/space.rs b/glow/src/renderer/widget/space.rs
deleted file mode 100644
index 225f7e6c..00000000
--- a/glow/src/renderer/widget/space.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use crate::{Primitive, Renderer};
-use iced_native::{mouse, space, Rectangle};
-
-impl space::Renderer for Renderer {
- fn draw(&mut self, _bounds: Rectangle) -> Self::Output {
- (Primitive::None, mouse::Interaction::default())
- }
-}
diff --git a/glow/src/renderer/widget/svg.rs b/glow/src/renderer/widget/svg.rs
deleted file mode 100644
index f6d6d0ba..00000000
--- a/glow/src/renderer/widget/svg.rs
+++ /dev/null
@@ -1,22 +0,0 @@
-use crate::{Primitive, Renderer};
-use iced_native::{mouse, svg, Layout};
-
-impl svg::Renderer for Renderer {
- fn dimensions(&self, handle: &svg::Handle) -> (u32, u32) {
- self.image_pipeline.viewport_dimensions(handle)
- }
-
- fn draw(
- &mut self,
- handle: svg::Handle,
- layout: Layout<'_>,
- ) -> Self::Output {
- (
- Primitive::Svg {
- handle,
- bounds: layout.bounds(),
- },
- mouse::Interaction::default(),
- )
- }
-}
diff --git a/glow/src/renderer/widget/text_input.rs b/glow/src/renderer/widget/text_input.rs
deleted file mode 100644
index 57be6692..00000000
--- a/glow/src/renderer/widget/text_input.rs
+++ /dev/null
@@ -1,261 +0,0 @@
-use crate::{text_input::StyleSheet, Primitive, Renderer};
-
-use iced_native::{
- mouse,
- text_input::{self, cursor},
- Background, Color, Font, HorizontalAlignment, Point, Rectangle, Size,
- Vector, VerticalAlignment,
-};
-use std::f32;
-
-impl text_input::Renderer for Renderer {
- type Style = Box<dyn StyleSheet>;
-
- fn default_size(&self) -> u16 {
- // TODO: Make this configurable
- 20
- }
-
- fn measure_value(&self, value: &str, size: u16, font: Font) -> f32 {
- let (mut width, _) = self.text_pipeline.measure(
- value,
- f32::from(size),
- font,
- Size::INFINITY,
- );
-
- let spaces_around = value.len() - value.trim().len();
-
- if spaces_around > 0 {
- let space_width = self.text_pipeline.space_width(size as f32);
- width += spaces_around as f32 * space_width;
- }
-
- width
- }
-
- fn offset(
- &self,
- text_bounds: Rectangle,
- font: Font,
- size: u16,
- value: &text_input::Value,
- state: &text_input::State,
- ) -> f32 {
- if state.is_focused() {
- let cursor = state.cursor();
-
- let focus_position = match cursor.state(value) {
- cursor::State::Index(i) => i,
- cursor::State::Selection { end, .. } => end,
- };
-
- let (_, offset) = measure_cursor_and_scroll_offset(
- self,
- text_bounds,
- value,
- size,
- focus_position,
- font,
- );
-
- offset
- } else {
- 0.0
- }
- }
-
- fn draw(
- &mut self,
- bounds: Rectangle,
- text_bounds: Rectangle,
- cursor_position: Point,
- font: Font,
- size: u16,
- placeholder: &str,
- value: &text_input::Value,
- state: &text_input::State,
- style_sheet: &Self::Style,
- ) -> Self::Output {
- let is_mouse_over = bounds.contains(cursor_position);
-
- let style = if state.is_focused() {
- style_sheet.focused()
- } else if is_mouse_over {
- style_sheet.hovered()
- } else {
- style_sheet.active()
- };
-
- let input = Primitive::Quad {
- bounds,
- background: style.background,
- border_radius: style.border_radius,
- border_width: style.border_width,
- border_color: style.border_color,
- };
-
- let text = value.to_string();
-
- let text_value = Primitive::Text {
- content: if text.is_empty() {
- placeholder.to_string()
- } else {
- text.clone()
- },
- color: if text.is_empty() {
- style_sheet.placeholder_color()
- } else {
- style_sheet.value_color()
- },
- font,
- bounds: Rectangle {
- y: text_bounds.center_y(),
- width: f32::INFINITY,
- ..text_bounds
- },
- size: f32::from(size),
- horizontal_alignment: HorizontalAlignment::Left,
- vertical_alignment: VerticalAlignment::Center,
- };
-
- let (contents_primitive, offset) = if state.is_focused() {
- let cursor = state.cursor();
-
- let (cursor_primitive, offset) = match cursor.state(value) {
- cursor::State::Index(position) => {
- let (text_value_width, offset) =
- measure_cursor_and_scroll_offset(
- self,
- text_bounds,
- value,
- size,
- position,
- font,
- );
-
- (
- Primitive::Quad {
- bounds: Rectangle {
- x: text_bounds.x + text_value_width,
- y: text_bounds.y,
- width: 1.0,
- height: text_bounds.height,
- },
- background: Background::Color(
- style_sheet.value_color(),
- ),
- border_radius: 0,
- border_width: 0,
- border_color: Color::TRANSPARENT,
- },
- offset,
- )
- }
- cursor::State::Selection { start, end } => {
- let left = start.min(end);
- let right = end.max(start);
-
- let (left_position, left_offset) =
- measure_cursor_and_scroll_offset(
- self,
- text_bounds,
- value,
- size,
- left,
- font,
- );
-
- let (right_position, right_offset) =
- measure_cursor_and_scroll_offset(
- self,
- text_bounds,
- value,
- size,
- right,
- font,
- );
-
- let width = right_position - left_position;
-
- (
- Primitive::Quad {
- bounds: Rectangle {
- x: text_bounds.x + left_position,
- y: text_bounds.y,
- width,
- height: text_bounds.height,
- },
- background: Background::Color(
- style_sheet.selection_color(),
- ),
- border_radius: 0,
- border_width: 0,
- border_color: Color::TRANSPARENT,
- },
- if end == right {
- right_offset
- } else {
- left_offset
- },
- )
- }
- };
-
- (
- Primitive::Group {
- primitives: vec![cursor_primitive, text_value],
- },
- Vector::new(offset as u32, 0),
- )
- } else {
- (text_value, Vector::new(0, 0))
- };
-
- let text_width = self.measure_value(
- if text.is_empty() { placeholder } else { &text },
- size,
- font,
- );
-
- let contents = if text_width > text_bounds.width {
- Primitive::Clip {
- bounds: text_bounds,
- offset,
- content: Box::new(contents_primitive),
- }
- } else {
- contents_primitive
- };
-
- (
- Primitive::Group {
- primitives: vec![input, contents],
- },
- if is_mouse_over {
- mouse::Interaction::Text
- } else {
- mouse::Interaction::default()
- },
- )
- }
-}
-
-fn measure_cursor_and_scroll_offset(
- renderer: &Renderer,
- text_bounds: Rectangle,
- value: &text_input::Value,
- size: u16,
- cursor_index: usize,
- font: Font,
-) -> (f32, f32) {
- use iced_native::text_input::Renderer;
-
- let text_before_cursor = value.until(cursor_index).to_string();
-
- let text_value_width =
- renderer.measure_value(&text_before_cursor, size, font);
- let offset = ((text_value_width + 5.0) - text_bounds.width).max(0.0);
-
- (text_value_width, offset)
-}
diff --git a/glow/src/renderer/widget/column.rs b/graphics/src/renderer/widget/column.rs
index b853276d..b70d2338 100644
--- a/glow/src/renderer/widget/column.rs
+++ b/graphics/src/renderer/widget/column.rs
@@ -1,7 +1,12 @@
-use crate::{Primitive, Renderer};
-use iced_native::{column, mouse, Element, Layout, Point};
+use crate::{Backend, Primitive, Renderer};
+use iced_native::column;
+use iced_native::mouse;
+use iced_native::{Element, Layout, Point};
-impl column::Renderer for Renderer {
+impl<B> column::Renderer for Renderer<B>
+where
+ B: Backend,
+{
fn draw<Message>(
&mut self,
defaults: &Self::Defaults,
diff --git a/glow/src/renderer/widget/container.rs b/graphics/src/renderer/widget/container.rs
index 30cc3f07..a1f6a211 100644
--- a/glow/src/renderer/widget/container.rs
+++ b/graphics/src/renderer/widget/container.rs
@@ -1,7 +1,12 @@
-use crate::{container, defaults, Defaults, Primitive, Renderer};
+use crate::container;
+use crate::defaults::{self, Defaults};
+use crate::{Backend, Primitive, Renderer};
use iced_native::{Background, Color, Element, Layout, Point, Rectangle};
-impl iced_native::container::Renderer for Renderer {
+impl<B> iced_native::container::Renderer for Renderer<B>
+where
+ B: Backend,
+{
type Style = Box<dyn container::StyleSheet>;
fn draw<Message>(
diff --git a/glow/src/renderer/widget/pane_grid.rs b/graphics/src/renderer/widget/pane_grid.rs
index 2253e4af..3fa171f5 100644
--- a/glow/src/renderer/widget/pane_grid.rs
+++ b/graphics/src/renderer/widget/pane_grid.rs
@@ -1,11 +1,12 @@
-use crate::{Primitive, Renderer};
-use iced_native::{
- mouse,
- pane_grid::{self, Axis, Pane},
- Element, Layout, Point, Rectangle, Vector,
-};
+use crate::{Backend, Primitive, Renderer};
+use iced_native::mouse;
+use iced_native::pane_grid::{self, Axis, Pane};
+use iced_native::{Element, Layout, Point, Rectangle, Vector};
-impl pane_grid::Renderer for Renderer {
+impl<B> pane_grid::Renderer for Renderer<B>
+where
+ B: Backend,
+{
fn draw<Message>(
&mut self,
defaults: &Self::Defaults,
diff --git a/glow/src/renderer/widget/progress_bar.rs b/graphics/src/renderer/widget/progress_bar.rs
index 2baeeb14..d8a145a4 100644
--- a/glow/src/renderer/widget/progress_bar.rs
+++ b/graphics/src/renderer/widget/progress_bar.rs
@@ -1,7 +1,11 @@
-use crate::{progress_bar::StyleSheet, Primitive, Renderer};
+use crate::progress_bar::StyleSheet;
+use crate::{Backend, Primitive, Renderer};
use iced_native::{mouse, progress_bar, Color, Rectangle};
-impl progress_bar::Renderer for Renderer {
+impl<B> progress_bar::Renderer for Renderer<B>
+where
+ B: Backend,
+{
type Style = Box<dyn StyleSheet>;
const DEFAULT_HEIGHT: u16 = 30;
diff --git a/glow/src/renderer/widget/radio.rs b/graphics/src/renderer/widget/radio.rs
index cee0deb6..4da2b60a 100644
--- a/glow/src/renderer/widget/radio.rs
+++ b/graphics/src/renderer/widget/radio.rs
@@ -1,10 +1,13 @@
-use crate::{radio::StyleSheet, Primitive, Renderer};
+use crate::{radio::StyleSheet, Backend, Primitive, Renderer};
use iced_native::{mouse, radio, Background, Color, Rectangle};
const SIZE: f32 = 28.0;
const DOT_SIZE: f32 = SIZE / 2.0;
-impl radio::Renderer for Renderer {
+impl<B> radio::Renderer for Renderer<B>
+where
+ B: Backend,
+{
type Style = Box<dyn StyleSheet>;
const DEFAULT_SIZE: u16 = SIZE as u16;
diff --git a/glow/src/renderer/widget/scrollable.rs b/graphics/src/renderer/widget/scrollable.rs
index 8a400b82..8db17bec 100644
--- a/glow/src/renderer/widget/scrollable.rs
+++ b/graphics/src/renderer/widget/scrollable.rs
@@ -1,10 +1,15 @@
-use crate::{Primitive, Renderer};
-use iced_native::{mouse, scrollable, Background, Color, Rectangle, Vector};
+use crate::{Backend, Primitive, Renderer};
+use iced_native::mouse;
+use iced_native::scrollable;
+use iced_native::{Background, Color, Rectangle, Vector};
const SCROLLBAR_WIDTH: u16 = 10;
const SCROLLBAR_MARGIN: u16 = 2;
-impl scrollable::Renderer for Renderer {
+impl<B> scrollable::Renderer for Renderer<B>
+where
+ B: Backend,
+{
type Style = Box<dyn iced_style::scrollable::StyleSheet>;
fn scrollbar(
diff --git a/glow/src/renderer/widget/text.rs b/graphics/src/renderer/widget/text.rs
index 4605ed06..45cb1be2 100644
--- a/glow/src/renderer/widget/text.rs
+++ b/graphics/src/renderer/widget/text.rs
@@ -1,3 +1,4 @@
+use crate::backend::{self, Backend};
use crate::{Primitive, Renderer};
use iced_native::{
mouse, text, Color, Font, HorizontalAlignment, Rectangle, Size,
@@ -6,7 +7,10 @@ use iced_native::{
use std::f32;
-impl text::Renderer for Renderer {
+impl<B> text::Renderer for Renderer<B>
+where
+ B: Backend + backend::Text,
+{
type Font = Font;
const DEFAULT_SIZE: u16 = 20;
@@ -18,7 +22,7 @@ impl text::Renderer for Renderer {
font: Font,
bounds: Size,
) -> (f32, f32) {
- self.text_pipeline
+ self.backend()
.measure(content, f32::from(size), font, bounds)
}