From 5a5ca34b5fcab9266359d3f0885782969f8c058e Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sat, 5 Oct 2019 19:22:51 +0200 Subject: Modularize `iced_wgpu` --- wgpu/src/renderer/button.rs | 18 ++++++++++ wgpu/src/renderer/checkbox.rs | 18 ++++++++++ wgpu/src/renderer/column.rs | 22 +++++++++++++ wgpu/src/renderer/image.rs | 16 +++++++++ wgpu/src/renderer/radio.rs | 17 ++++++++++ wgpu/src/renderer/row.rs | 22 +++++++++++++ wgpu/src/renderer/slider.rs | 17 ++++++++++ wgpu/src/renderer/text.rs | 77 +++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 207 insertions(+) create mode 100644 wgpu/src/renderer/button.rs create mode 100644 wgpu/src/renderer/checkbox.rs create mode 100644 wgpu/src/renderer/column.rs create mode 100644 wgpu/src/renderer/image.rs create mode 100644 wgpu/src/renderer/radio.rs create mode 100644 wgpu/src/renderer/row.rs create mode 100644 wgpu/src/renderer/slider.rs create mode 100644 wgpu/src/renderer/text.rs (limited to 'wgpu/src/renderer') diff --git a/wgpu/src/renderer/button.rs b/wgpu/src/renderer/button.rs new file mode 100644 index 00000000..24bc1de6 --- /dev/null +++ b/wgpu/src/renderer/button.rs @@ -0,0 +1,18 @@ +use crate::{Primitive, Renderer}; +use iced_native::{button, Button, Layout, Node, Point, Style}; + +impl button::Renderer for Renderer { + fn node(&self, _button: &Button) -> Node { + Node::new(Style::default()) + } + + fn draw( + &mut self, + _button: &Button, + _layout: Layout<'_>, + _cursor_position: Point, + ) -> Self::Primitive { + // TODO + Primitive::None + } +} diff --git a/wgpu/src/renderer/checkbox.rs b/wgpu/src/renderer/checkbox.rs new file mode 100644 index 00000000..c94a2157 --- /dev/null +++ b/wgpu/src/renderer/checkbox.rs @@ -0,0 +1,18 @@ +use crate::{Primitive, Renderer}; +use iced_native::{checkbox, Checkbox, Layout, Node, Point, Style}; + +impl checkbox::Renderer for Renderer { + fn node(&mut self, _checkbox: &Checkbox) -> Node { + Node::new(Style::default()) + } + + fn draw( + &mut self, + _checkbox: &Checkbox, + _layout: Layout<'_>, + _cursor_position: Point, + ) -> Self::Primitive { + // TODO + Primitive::None + } +} diff --git a/wgpu/src/renderer/column.rs b/wgpu/src/renderer/column.rs new file mode 100644 index 00000000..1b9adad6 --- /dev/null +++ b/wgpu/src/renderer/column.rs @@ -0,0 +1,22 @@ +use crate::{Primitive, Renderer}; +use iced_native::{column, Column, Layout, Point}; + +impl column::Renderer for Renderer { + fn draw( + &mut self, + column: &Column<'_, Message, Self>, + layout: Layout<'_>, + cursor_position: Point, + ) -> Self::Primitive { + Primitive::Group { + primitives: column + .children + .iter() + .zip(layout.children()) + .map(|(child, layout)| { + child.draw(self, layout, cursor_position) + }) + .collect(), + } + } +} diff --git a/wgpu/src/renderer/image.rs b/wgpu/src/renderer/image.rs new file mode 100644 index 00000000..6ff39d30 --- /dev/null +++ b/wgpu/src/renderer/image.rs @@ -0,0 +1,16 @@ +use crate::{Primitive, Renderer}; +use iced_native::{image, Image, Layout, Node, Style}; + +impl image::Renderer<&str> for Renderer { + fn node(&mut self, _image: &Image<&str>) -> Node { + Node::new(Style::default()) + } + + fn draw( + &mut self, + _image: &Image<&str>, + _layout: Layout<'_>, + ) -> Self::Primitive { + Primitive::None + } +} diff --git a/wgpu/src/renderer/radio.rs b/wgpu/src/renderer/radio.rs new file mode 100644 index 00000000..ce419ae0 --- /dev/null +++ b/wgpu/src/renderer/radio.rs @@ -0,0 +1,17 @@ +use crate::{Primitive, Renderer}; +use iced_native::{radio, Layout, Node, Point, Radio, Style}; + +impl radio::Renderer for Renderer { + fn node(&mut self, _checkbox: &Radio) -> Node { + Node::new(Style::default()) + } + + fn draw( + &mut self, + _radio: &Radio, + _layout: Layout<'_>, + _cursor_position: Point, + ) -> Self::Primitive { + Primitive::None + } +} diff --git a/wgpu/src/renderer/row.rs b/wgpu/src/renderer/row.rs new file mode 100644 index 00000000..be9e4ede --- /dev/null +++ b/wgpu/src/renderer/row.rs @@ -0,0 +1,22 @@ +use crate::{Primitive, Renderer}; +use iced_native::{row, Layout, Point, Row}; + +impl row::Renderer for Renderer { + fn draw( + &mut self, + row: &Row<'_, Message, Self>, + layout: Layout<'_>, + cursor_position: Point, + ) -> Self::Primitive { + Primitive::Group { + primitives: row + .children + .iter() + .zip(layout.children()) + .map(|(child, layout)| { + child.draw(self, layout, cursor_position) + }) + .collect(), + } + } +} diff --git a/wgpu/src/renderer/slider.rs b/wgpu/src/renderer/slider.rs new file mode 100644 index 00000000..2e76022d --- /dev/null +++ b/wgpu/src/renderer/slider.rs @@ -0,0 +1,17 @@ +use crate::{Primitive, Renderer}; +use iced_native::{slider, Layout, Node, Point, Slider, Style}; + +impl slider::Renderer for Renderer { + fn node(&self, _slider: &Slider) -> Node { + Node::new(Style::default()) + } + + fn draw( + &mut self, + _slider: &Slider, + _layout: Layout<'_>, + _cursor_position: Point, + ) -> Self::Primitive { + Primitive::None + } +} diff --git a/wgpu/src/renderer/text.rs b/wgpu/src/renderer/text.rs new file mode 100644 index 00000000..4434cc22 --- /dev/null +++ b/wgpu/src/renderer/text.rs @@ -0,0 +1,77 @@ +use crate::{Primitive, Renderer}; +use iced_native::{text, Layout, Node, Style, Text}; + +use wgpu_glyph::{GlyphCruncher, Section}; + +use std::cell::RefCell; +use std::f32; + +impl text::Renderer for Renderer { + fn node(&self, text: &Text) -> Node { + let glyph_brush = self.glyph_brush.clone(); + let content = text.content.clone(); + + // TODO: Investigate why stretch tries to measure this MANY times + // with every ancestor's bounds. + // Bug? Using the library wrong? I should probably open an issue on + // the stretch repository. + // I noticed that the first measure is the one that matters in + // practice. Here, we use a RefCell to store the cached measurement. + let measure = RefCell::new(None); + let size = text.size.map(f32::from).unwrap_or(20.0); + + let style = Style::default().width(text.width); + + iced_native::Node::with_measure(style, move |bounds| { + let mut measure = measure.borrow_mut(); + + if measure.is_none() { + let bounds = ( + match bounds.width { + iced_native::Number::Undefined => f32::INFINITY, + iced_native::Number::Defined(w) => w, + }, + match bounds.height { + iced_native::Number::Undefined => f32::INFINITY, + iced_native::Number::Defined(h) => h, + }, + ); + + let text = Section { + text: &content, + scale: wgpu_glyph::Scale { x: size, y: size }, + bounds, + ..Default::default() + }; + + let (width, height) = if let Some(bounds) = + glyph_brush.borrow_mut().glyph_bounds(&text) + { + (bounds.width(), bounds.height()) + } else { + (0.0, 0.0) + }; + + let size = iced_native::Size { width, height }; + + // If the text has no width boundary we avoid caching as the + // layout engine may just be measuring text in a row. + if bounds.0 == f32::INFINITY { + return size; + } else { + *measure = Some(size); + } + } + + measure.unwrap() + }) + } + + fn draw(&mut self, text: &Text, layout: Layout<'_>) -> Self::Primitive { + Primitive::Text { + content: text.content.clone(), + size: f32::from(text.size.unwrap_or(20)), + bounds: layout.bounds(), + } + } +} -- cgit From 7765e6da50a3448501ee1b639e580c94a4fbda8a Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 6 Oct 2019 19:22:25 +0200 Subject: Draft `Box` primitive --- wgpu/src/renderer/button.rs | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) (limited to 'wgpu/src/renderer') diff --git a/wgpu/src/renderer/button.rs b/wgpu/src/renderer/button.rs index 24bc1de6..b9dfb9ac 100644 --- a/wgpu/src/renderer/button.rs +++ b/wgpu/src/renderer/button.rs @@ -1,18 +1,40 @@ -use crate::{Primitive, Renderer}; -use iced_native::{button, Button, Layout, Node, Point, Style}; +use crate::{Background, Primitive, Renderer}; +use iced_native::{button, Button, Color, Layout, Length, Node, Point, Style}; impl button::Renderer for Renderer { - fn node(&self, _button: &Button) -> Node { - Node::new(Style::default()) + fn node(&self, button: &Button) -> Node { + let style = Style::default() + .width(button.width) + .min_height(Length::Units(30)) + .min_width(Length::Units(100)) + .align_self(button.align_self); + + Node::new(style) } fn draw( &mut self, - _button: &Button, - _layout: Layout<'_>, + button: &Button, + layout: Layout<'_>, _cursor_position: Point, ) -> Self::Primitive { - // TODO - Primitive::None + Primitive::Group { + primitives: vec![ + Primitive::Box { + bounds: layout.bounds(), + background: Background::Color(Color { + r: 0.0, + b: 1.0, + g: 0.0, + a: 1.0, + }), + }, + Primitive::Text { + content: button.label.clone(), + size: 20.0, + bounds: layout.bounds(), + }, + ], + } } } -- cgit From 70c17b053b10741f6018b2559bb46c5f289cadb9 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Mon, 7 Oct 2019 02:17:40 +0200 Subject: Rename `Box` primitive to `Quad` --- wgpu/src/renderer/button.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'wgpu/src/renderer') diff --git a/wgpu/src/renderer/button.rs b/wgpu/src/renderer/button.rs index b9dfb9ac..fd874832 100644 --- a/wgpu/src/renderer/button.rs +++ b/wgpu/src/renderer/button.rs @@ -20,7 +20,7 @@ impl button::Renderer for Renderer { ) -> Self::Primitive { Primitive::Group { primitives: vec![ - Primitive::Box { + Primitive::Quad { bounds: layout.bounds(), background: Background::Color(Color { r: 0.0, -- cgit From c9510db551893775d3233340dd114d971e24323a Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Mon, 7 Oct 2019 03:56:16 +0200 Subject: Render colored quads --- wgpu/src/renderer/button.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'wgpu/src/renderer') diff --git a/wgpu/src/renderer/button.rs b/wgpu/src/renderer/button.rs index fd874832..f75b44f7 100644 --- a/wgpu/src/renderer/button.rs +++ b/wgpu/src/renderer/button.rs @@ -18,14 +18,16 @@ impl button::Renderer for Renderer { layout: Layout<'_>, _cursor_position: Point, ) -> Self::Primitive { + let bounds = layout.bounds(); + Primitive::Group { primitives: vec![ Primitive::Quad { - bounds: layout.bounds(), + bounds, background: Background::Color(Color { - r: 0.0, - b: 1.0, - g: 0.0, + r: 0.8, + b: 0.8, + g: 0.8, a: 1.0, }), }, -- cgit From 10e10e5e06841574425d2633f1c2916733f7b4ff Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 8 Oct 2019 03:13:41 +0200 Subject: Make `iced_core::Button` customizable Now it supports: - Any kind of content - Custom border radius - Custom background --- wgpu/src/renderer/button.rs | 45 +++++++++++++++++++++++++------------------ wgpu/src/renderer/checkbox.rs | 2 +- wgpu/src/renderer/image.rs | 2 +- wgpu/src/renderer/radio.rs | 2 +- wgpu/src/renderer/text.rs | 5 ++++- 5 files changed, 33 insertions(+), 23 deletions(-) (limited to 'wgpu/src/renderer') diff --git a/wgpu/src/renderer/button.rs b/wgpu/src/renderer/button.rs index f75b44f7..00fcd0eb 100644 --- a/wgpu/src/renderer/button.rs +++ b/wgpu/src/renderer/button.rs @@ -1,22 +1,26 @@ -use crate::{Background, Primitive, Renderer}; -use iced_native::{button, Button, Color, Layout, Length, Node, Point, Style}; +use crate::{Primitive, Renderer}; +use iced_native::{ + button, Align, Background, Button, Color, Layout, Length, Node, Point, + Style, +}; impl button::Renderer for Renderer { - fn node(&self, button: &Button) -> Node { + fn node(&self, button: &Button) -> Node { let style = Style::default() .width(button.width) - .min_height(Length::Units(30)) + .padding(button.padding) .min_width(Length::Units(100)) - .align_self(button.align_self); + .align_self(button.align_self) + .align_items(Align::Stretch); - Node::new(style) + Node::with_children(style, vec![button.content.node(self)]) } fn draw( &mut self, - button: &Button, + button: &Button, layout: Layout<'_>, - _cursor_position: Point, + cursor_position: Point, ) -> Self::Primitive { let bounds = layout.bounds(); @@ -24,18 +28,21 @@ impl button::Renderer for Renderer { primitives: vec![ Primitive::Quad { bounds, - background: Background::Color(Color { - r: 0.8, - b: 0.8, - g: 0.8, - a: 1.0, - }), - }, - Primitive::Text { - content: button.label.clone(), - size: 20.0, - bounds: layout.bounds(), + background: button.background.unwrap_or(Background::Color( + Color { + r: 0.8, + b: 0.8, + g: 0.8, + a: 1.0, + }, + )), + border_radius: button.border_radius, }, + button.content.draw( + self, + layout.children().next().unwrap(), + cursor_position, + ), ], } } diff --git a/wgpu/src/renderer/checkbox.rs b/wgpu/src/renderer/checkbox.rs index c94a2157..16d5734f 100644 --- a/wgpu/src/renderer/checkbox.rs +++ b/wgpu/src/renderer/checkbox.rs @@ -2,7 +2,7 @@ use crate::{Primitive, Renderer}; use iced_native::{checkbox, Checkbox, Layout, Node, Point, Style}; impl checkbox::Renderer for Renderer { - fn node(&mut self, _checkbox: &Checkbox) -> Node { + fn node(&self, _checkbox: &Checkbox) -> Node { Node::new(Style::default()) } diff --git a/wgpu/src/renderer/image.rs b/wgpu/src/renderer/image.rs index 6ff39d30..bacc430d 100644 --- a/wgpu/src/renderer/image.rs +++ b/wgpu/src/renderer/image.rs @@ -2,7 +2,7 @@ use crate::{Primitive, Renderer}; use iced_native::{image, Image, Layout, Node, Style}; impl image::Renderer<&str> for Renderer { - fn node(&mut self, _image: &Image<&str>) -> Node { + fn node(&self, _image: &Image<&str>) -> Node { Node::new(Style::default()) } diff --git a/wgpu/src/renderer/radio.rs b/wgpu/src/renderer/radio.rs index ce419ae0..fdc0a0fc 100644 --- a/wgpu/src/renderer/radio.rs +++ b/wgpu/src/renderer/radio.rs @@ -2,7 +2,7 @@ use crate::{Primitive, Renderer}; use iced_native::{radio, Layout, Node, Point, Radio, Style}; impl radio::Renderer for Renderer { - fn node(&mut self, _checkbox: &Radio) -> Node { + fn node(&self, _checkbox: &Radio) -> Node { Node::new(Style::default()) } diff --git a/wgpu/src/renderer/text.rs b/wgpu/src/renderer/text.rs index 4434cc22..c89c0b3e 100644 --- a/wgpu/src/renderer/text.rs +++ b/wgpu/src/renderer/text.rs @@ -1,5 +1,5 @@ use crate::{Primitive, Renderer}; -use iced_native::{text, Layout, Node, Style, Text}; +use iced_native::{text, Color, Layout, Node, Style, Text}; use wgpu_glyph::{GlyphCruncher, Section}; @@ -72,6 +72,9 @@ impl text::Renderer for Renderer { content: text.content.clone(), size: f32::from(text.size.unwrap_or(20)), bounds: layout.bounds(), + color: text.color.unwrap_or(Color::BLACK), + horizontal_alignment: text.horizontal_alignment, + vertical_alignment: text.vertical_alignment, } } } -- cgit From 8846a239cf14edd464b1d09f6d6d57ad9b5c9fc7 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Fri, 11 Oct 2019 22:15:39 +0200 Subject: Rename `Renderer::Primitive` to `Renderer::Output` --- wgpu/src/renderer/button.rs | 2 +- wgpu/src/renderer/checkbox.rs | 2 +- wgpu/src/renderer/column.rs | 2 +- wgpu/src/renderer/image.rs | 2 +- wgpu/src/renderer/radio.rs | 2 +- wgpu/src/renderer/row.rs | 2 +- wgpu/src/renderer/slider.rs | 2 +- wgpu/src/renderer/text.rs | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) (limited to 'wgpu/src/renderer') diff --git a/wgpu/src/renderer/button.rs b/wgpu/src/renderer/button.rs index 00fcd0eb..33789379 100644 --- a/wgpu/src/renderer/button.rs +++ b/wgpu/src/renderer/button.rs @@ -21,7 +21,7 @@ impl button::Renderer for Renderer { button: &Button, layout: Layout<'_>, cursor_position: Point, - ) -> Self::Primitive { + ) -> Self::Output { let bounds = layout.bounds(); Primitive::Group { diff --git a/wgpu/src/renderer/checkbox.rs b/wgpu/src/renderer/checkbox.rs index 16d5734f..003df7e5 100644 --- a/wgpu/src/renderer/checkbox.rs +++ b/wgpu/src/renderer/checkbox.rs @@ -11,7 +11,7 @@ impl checkbox::Renderer for Renderer { _checkbox: &Checkbox, _layout: Layout<'_>, _cursor_position: Point, - ) -> Self::Primitive { + ) -> Self::Output { // TODO Primitive::None } diff --git a/wgpu/src/renderer/column.rs b/wgpu/src/renderer/column.rs index 1b9adad6..c83a7de1 100644 --- a/wgpu/src/renderer/column.rs +++ b/wgpu/src/renderer/column.rs @@ -7,7 +7,7 @@ impl column::Renderer for Renderer { column: &Column<'_, Message, Self>, layout: Layout<'_>, cursor_position: Point, - ) -> Self::Primitive { + ) -> Self::Output { Primitive::Group { primitives: column .children diff --git a/wgpu/src/renderer/image.rs b/wgpu/src/renderer/image.rs index bacc430d..f77a95db 100644 --- a/wgpu/src/renderer/image.rs +++ b/wgpu/src/renderer/image.rs @@ -10,7 +10,7 @@ impl image::Renderer<&str> for Renderer { &mut self, _image: &Image<&str>, _layout: Layout<'_>, - ) -> Self::Primitive { + ) -> Self::Output { Primitive::None } } diff --git a/wgpu/src/renderer/radio.rs b/wgpu/src/renderer/radio.rs index fdc0a0fc..0a34fee9 100644 --- a/wgpu/src/renderer/radio.rs +++ b/wgpu/src/renderer/radio.rs @@ -11,7 +11,7 @@ impl radio::Renderer for Renderer { _radio: &Radio, _layout: Layout<'_>, _cursor_position: Point, - ) -> Self::Primitive { + ) -> Self::Output { Primitive::None } } diff --git a/wgpu/src/renderer/row.rs b/wgpu/src/renderer/row.rs index be9e4ede..b6baf61f 100644 --- a/wgpu/src/renderer/row.rs +++ b/wgpu/src/renderer/row.rs @@ -7,7 +7,7 @@ impl row::Renderer for Renderer { row: &Row<'_, Message, Self>, layout: Layout<'_>, cursor_position: Point, - ) -> Self::Primitive { + ) -> Self::Output { Primitive::Group { primitives: row .children diff --git a/wgpu/src/renderer/slider.rs b/wgpu/src/renderer/slider.rs index 2e76022d..2eacdc89 100644 --- a/wgpu/src/renderer/slider.rs +++ b/wgpu/src/renderer/slider.rs @@ -11,7 +11,7 @@ impl slider::Renderer for Renderer { _slider: &Slider, _layout: Layout<'_>, _cursor_position: Point, - ) -> Self::Primitive { + ) -> Self::Output { Primitive::None } } diff --git a/wgpu/src/renderer/text.rs b/wgpu/src/renderer/text.rs index c89c0b3e..61349533 100644 --- a/wgpu/src/renderer/text.rs +++ b/wgpu/src/renderer/text.rs @@ -67,7 +67,7 @@ impl text::Renderer for Renderer { }) } - fn draw(&mut self, text: &Text, layout: Layout<'_>) -> Self::Primitive { + fn draw(&mut self, text: &Text, layout: Layout<'_>) -> Self::Output { Primitive::Text { content: text.content.clone(), size: f32::from(text.size.unwrap_or(20)), -- cgit From a031a6f2130b3913a2419e4cea859c22aa388213 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Fri, 11 Oct 2019 23:30:53 +0200 Subject: Handle mouse cursor in `iced_wgpu` --- wgpu/src/renderer/button.rs | 55 +++++++++++++++++++++++++------------------ wgpu/src/renderer/checkbox.rs | 6 +++-- wgpu/src/renderer/column.rs | 34 +++++++++++++++++--------- wgpu/src/renderer/image.rs | 4 ++-- wgpu/src/renderer/radio.rs | 4 ++-- wgpu/src/renderer/row.rs | 34 +++++++++++++++++--------- wgpu/src/renderer/slider.rs | 4 ++-- wgpu/src/renderer/text.rs | 21 ++++++++++------- 8 files changed, 100 insertions(+), 62 deletions(-) (limited to 'wgpu/src/renderer') diff --git a/wgpu/src/renderer/button.rs b/wgpu/src/renderer/button.rs index 33789379..275c870f 100644 --- a/wgpu/src/renderer/button.rs +++ b/wgpu/src/renderer/button.rs @@ -1,7 +1,7 @@ use crate::{Primitive, Renderer}; use iced_native::{ - button, Align, Background, Button, Color, Layout, Length, Node, Point, - Style, + button, Align, Background, Button, Color, Layout, Length, MouseCursor, + Node, Point, Style, }; impl button::Renderer for Renderer { @@ -24,26 +24,35 @@ impl button::Renderer for Renderer { ) -> Self::Output { let bounds = layout.bounds(); - Primitive::Group { - primitives: vec![ - Primitive::Quad { - bounds, - background: button.background.unwrap_or(Background::Color( - Color { - r: 0.8, - b: 0.8, - g: 0.8, - a: 1.0, - }, - )), - border_radius: button.border_radius, - }, - button.content.draw( - self, - layout.children().next().unwrap(), - cursor_position, - ), - ], - } + let (content, _) = button.content.draw( + self, + layout.children().next().unwrap(), + cursor_position, + ); + + ( + Primitive::Group { + primitives: vec![ + Primitive::Quad { + bounds, + background: button.background.unwrap_or( + Background::Color(Color { + r: 0.8, + b: 0.8, + g: 0.8, + a: 1.0, + }), + ), + border_radius: button.border_radius, + }, + content, + ], + }, + if bounds.contains(cursor_position) { + MouseCursor::Pointer + } else { + MouseCursor::OutOfBounds + }, + ) } } diff --git a/wgpu/src/renderer/checkbox.rs b/wgpu/src/renderer/checkbox.rs index 003df7e5..7b06d397 100644 --- a/wgpu/src/renderer/checkbox.rs +++ b/wgpu/src/renderer/checkbox.rs @@ -1,5 +1,7 @@ use crate::{Primitive, Renderer}; -use iced_native::{checkbox, Checkbox, Layout, Node, Point, Style}; +use iced_native::{ + checkbox, Checkbox, Layout, MouseCursor, Node, Point, Style, +}; impl checkbox::Renderer for Renderer { fn node(&self, _checkbox: &Checkbox) -> Node { @@ -13,6 +15,6 @@ impl checkbox::Renderer for Renderer { _cursor_position: Point, ) -> Self::Output { // TODO - Primitive::None + (Primitive::None, MouseCursor::OutOfBounds) } } diff --git a/wgpu/src/renderer/column.rs b/wgpu/src/renderer/column.rs index c83a7de1..cac6da77 100644 --- a/wgpu/src/renderer/column.rs +++ b/wgpu/src/renderer/column.rs @@ -1,5 +1,5 @@ use crate::{Primitive, Renderer}; -use iced_native::{column, Column, Layout, Point}; +use iced_native::{column, Column, Layout, MouseCursor, Point}; impl column::Renderer for Renderer { fn draw( @@ -8,15 +8,27 @@ impl column::Renderer for Renderer { layout: Layout<'_>, cursor_position: Point, ) -> Self::Output { - Primitive::Group { - primitives: column - .children - .iter() - .zip(layout.children()) - .map(|(child, layout)| { - child.draw(self, layout, cursor_position) - }) - .collect(), - } + let mut mouse_cursor = MouseCursor::OutOfBounds; + + ( + Primitive::Group { + primitives: column + .children + .iter() + .zip(layout.children()) + .map(|(child, layout)| { + let (primitive, new_mouse_cursor) = + child.draw(self, layout, cursor_position); + + if new_mouse_cursor > mouse_cursor { + mouse_cursor = new_mouse_cursor; + } + + primitive + }) + .collect(), + }, + mouse_cursor, + ) } } diff --git a/wgpu/src/renderer/image.rs b/wgpu/src/renderer/image.rs index f77a95db..a29a3d49 100644 --- a/wgpu/src/renderer/image.rs +++ b/wgpu/src/renderer/image.rs @@ -1,5 +1,5 @@ use crate::{Primitive, Renderer}; -use iced_native::{image, Image, Layout, Node, Style}; +use iced_native::{image, Image, Layout, MouseCursor, Node, Style}; impl image::Renderer<&str> for Renderer { fn node(&self, _image: &Image<&str>) -> Node { @@ -11,6 +11,6 @@ impl image::Renderer<&str> for Renderer { _image: &Image<&str>, _layout: Layout<'_>, ) -> Self::Output { - Primitive::None + (Primitive::None, MouseCursor::OutOfBounds) } } diff --git a/wgpu/src/renderer/radio.rs b/wgpu/src/renderer/radio.rs index 0a34fee9..712a7104 100644 --- a/wgpu/src/renderer/radio.rs +++ b/wgpu/src/renderer/radio.rs @@ -1,5 +1,5 @@ use crate::{Primitive, Renderer}; -use iced_native::{radio, Layout, Node, Point, Radio, Style}; +use iced_native::{radio, Layout, MouseCursor, Node, Point, Radio, Style}; impl radio::Renderer for Renderer { fn node(&self, _checkbox: &Radio) -> Node { @@ -12,6 +12,6 @@ impl radio::Renderer for Renderer { _layout: Layout<'_>, _cursor_position: Point, ) -> Self::Output { - Primitive::None + (Primitive::None, MouseCursor::OutOfBounds) } } diff --git a/wgpu/src/renderer/row.rs b/wgpu/src/renderer/row.rs index b6baf61f..bbfef9a1 100644 --- a/wgpu/src/renderer/row.rs +++ b/wgpu/src/renderer/row.rs @@ -1,5 +1,5 @@ use crate::{Primitive, Renderer}; -use iced_native::{row, Layout, Point, Row}; +use iced_native::{row, Layout, MouseCursor, Point, Row}; impl row::Renderer for Renderer { fn draw( @@ -8,15 +8,27 @@ impl row::Renderer for Renderer { layout: Layout<'_>, cursor_position: Point, ) -> Self::Output { - Primitive::Group { - primitives: row - .children - .iter() - .zip(layout.children()) - .map(|(child, layout)| { - child.draw(self, layout, cursor_position) - }) - .collect(), - } + let mut mouse_cursor = MouseCursor::OutOfBounds; + + ( + Primitive::Group { + primitives: row + .children + .iter() + .zip(layout.children()) + .map(|(child, layout)| { + let (primitive, new_mouse_cursor) = + child.draw(self, layout, cursor_position); + + if new_mouse_cursor > mouse_cursor { + mouse_cursor = new_mouse_cursor; + } + + primitive + }) + .collect(), + }, + mouse_cursor, + ) } } diff --git a/wgpu/src/renderer/slider.rs b/wgpu/src/renderer/slider.rs index 2eacdc89..d1a30244 100644 --- a/wgpu/src/renderer/slider.rs +++ b/wgpu/src/renderer/slider.rs @@ -1,5 +1,5 @@ use crate::{Primitive, Renderer}; -use iced_native::{slider, Layout, Node, Point, Slider, Style}; +use iced_native::{slider, Layout, MouseCursor, Node, Point, Slider, Style}; impl slider::Renderer for Renderer { fn node(&self, _slider: &Slider) -> Node { @@ -12,6 +12,6 @@ impl slider::Renderer for Renderer { _layout: Layout<'_>, _cursor_position: Point, ) -> Self::Output { - Primitive::None + (Primitive::None, MouseCursor::OutOfBounds) } } diff --git a/wgpu/src/renderer/text.rs b/wgpu/src/renderer/text.rs index 61349533..8fbade4e 100644 --- a/wgpu/src/renderer/text.rs +++ b/wgpu/src/renderer/text.rs @@ -1,5 +1,5 @@ use crate::{Primitive, Renderer}; -use iced_native::{text, Color, Layout, Node, Style, Text}; +use iced_native::{text, Color, Layout, MouseCursor, Node, Style, Text}; use wgpu_glyph::{GlyphCruncher, Section}; @@ -68,13 +68,16 @@ impl text::Renderer for Renderer { } fn draw(&mut self, text: &Text, layout: Layout<'_>) -> Self::Output { - Primitive::Text { - content: text.content.clone(), - size: f32::from(text.size.unwrap_or(20)), - bounds: layout.bounds(), - color: text.color.unwrap_or(Color::BLACK), - horizontal_alignment: text.horizontal_alignment, - vertical_alignment: text.vertical_alignment, - } + ( + Primitive::Text { + content: text.content.clone(), + size: f32::from(text.size.unwrap_or(20)), + bounds: layout.bounds(), + color: text.color.unwrap_or(Color::BLACK), + horizontal_alignment: text.horizontal_alignment, + vertical_alignment: text.vertical_alignment, + }, + MouseCursor::OutOfBounds, + ) } } -- cgit From e74f1179769cc4dc3e91cb0b5794526b3a8c0dcd Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sat, 12 Oct 2019 02:32:16 +0200 Subject: Add a slight shadow to buttons for feedback --- wgpu/src/renderer/button.rs | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'wgpu/src/renderer') diff --git a/wgpu/src/renderer/button.rs b/wgpu/src/renderer/button.rs index 275c870f..aa48da93 100644 --- a/wgpu/src/renderer/button.rs +++ b/wgpu/src/renderer/button.rs @@ -1,7 +1,7 @@ use crate::{Primitive, Renderer}; use iced_native::{ button, Align, Background, Button, Color, Layout, Length, MouseCursor, - Node, Point, Style, + Node, Point, Rectangle, Style, }; impl button::Renderer for Renderer { @@ -30,9 +30,35 @@ impl button::Renderer for Renderer { cursor_position, ); + let is_hover = bounds.contains(cursor_position); + + // TODO: Render proper shadows + // TODO: Make hovering and pressed styles configurable + let shadow_offset = if button.state.is_pressed { + 0.0 + } else if is_hover { + 2.0 + } else { + 1.0 + }; + ( Primitive::Group { primitives: vec![ + Primitive::Quad { + bounds: Rectangle { + x: bounds.x + 1.0, + y: bounds.y + shadow_offset, + ..bounds + }, + background: Background::Color(Color { + r: 0.0, + b: 0.0, + g: 0.0, + a: 0.5, + }), + border_radius: button.border_radius, + }, Primitive::Quad { bounds, background: button.background.unwrap_or( @@ -48,7 +74,7 @@ impl button::Renderer for Renderer { content, ], }, - if bounds.contains(cursor_position) { + if is_hover { MouseCursor::Pointer } else { MouseCursor::OutOfBounds -- cgit From afacb35f9bf87ae10f59091b18b001a4c114a589 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sat, 12 Oct 2019 05:07:00 +0200 Subject: Draw sliders in `iced_wgpu` --- wgpu/src/renderer/slider.rs | 125 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 118 insertions(+), 7 deletions(-) (limited to 'wgpu/src/renderer') diff --git a/wgpu/src/renderer/slider.rs b/wgpu/src/renderer/slider.rs index d1a30244..4ae3abc4 100644 --- a/wgpu/src/renderer/slider.rs +++ b/wgpu/src/renderer/slider.rs @@ -1,17 +1,128 @@ use crate::{Primitive, Renderer}; -use iced_native::{slider, Layout, MouseCursor, Node, Point, Slider, Style}; +use iced_native::{ + slider, Background, Color, Layout, Length, MouseCursor, Node, Point, + Rectangle, Slider, Style, +}; + +const HANDLE_WIDTH: f32 = 8.0; +const HANDLE_HEIGHT: f32 = 22.0; impl slider::Renderer for Renderer { - fn node(&self, _slider: &Slider) -> Node { - Node::new(Style::default()) + fn node(&self, slider: &Slider) -> Node { + let style = Style::default() + .width(slider.width) + .height(Length::Units(HANDLE_HEIGHT as u16)) + .min_width(Length::Units(100)); + + Node::new(style) } fn draw( &mut self, - _slider: &Slider, - _layout: Layout<'_>, - _cursor_position: Point, + slider: &Slider, + layout: Layout<'_>, + cursor_position: Point, ) -> Self::Output { - (Primitive::None, MouseCursor::OutOfBounds) + let bounds = layout.bounds(); + + let is_mouse_over = bounds.contains(cursor_position); + + 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(Color { + r: 0.6, + g: 0.6, + b: 0.6, + a: 1.0, + }), + border_radius: 0, + }, + Primitive::Quad { + bounds: Rectangle { + x: bounds.x, + y: rail_y + 2.0, + width: bounds.width, + height: 2.0, + }, + background: Background::Color(Color::WHITE), + border_radius: 0, + }, + ); + + let (range_start, range_end) = slider.range.clone().into_inner(); + + let handle_offset = (bounds.width - HANDLE_WIDTH) + * ((slider.value - range_start) + / (range_end - range_start).max(1.0)); + + let (handle_border, handle) = ( + Primitive::Quad { + bounds: Rectangle { + x: bounds.x + handle_offset.round() - 1.0, + y: rail_y - HANDLE_HEIGHT / 2.0 - 1.0, + width: HANDLE_WIDTH + 2.0, + height: HANDLE_HEIGHT + 2.0, + }, + background: Background::Color(Color { + r: 0.6, + g: 0.6, + b: 0.6, + a: 1.0, + }), + border_radius: 5, + }, + 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(if slider.state.is_dragging() { + Color { + r: 0.85, + g: 0.85, + b: 0.85, + a: 1.0, + } + } else if is_mouse_over { + Color { + r: 0.9, + g: 0.9, + b: 0.9, + a: 1.0, + } + } else { + Color { + r: 0.95, + g: 0.95, + b: 0.95, + a: 1.0, + } + }), + border_radius: 4, + }, + ); + + ( + Primitive::Group { + primitives: vec![rail_top, rail_bottom, handle_border, handle], + }, + if slider.state.is_dragging() { + MouseCursor::Grabbing + } else if is_mouse_over { + MouseCursor::Grab + } else { + MouseCursor::OutOfBounds + }, + ) } } -- cgit From a444819799345d12ab74b09fc8c82ba360b9eeeb Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sat, 12 Oct 2019 05:07:29 +0200 Subject: Fix button shadow feedback in `iced_wgpu` --- wgpu/src/renderer/button.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'wgpu/src/renderer') diff --git a/wgpu/src/renderer/button.rs b/wgpu/src/renderer/button.rs index aa48da93..ad2186d6 100644 --- a/wgpu/src/renderer/button.rs +++ b/wgpu/src/renderer/button.rs @@ -30,14 +30,16 @@ impl button::Renderer for Renderer { cursor_position, ); - let is_hover = bounds.contains(cursor_position); + let is_mouse_over = bounds.contains(cursor_position); // TODO: Render proper shadows // TODO: Make hovering and pressed styles configurable - let shadow_offset = if button.state.is_pressed { - 0.0 - } else if is_hover { - 2.0 + let shadow_offset = if is_mouse_over { + if button.state.is_pressed { + 0.0 + } else { + 2.0 + } } else { 1.0 }; @@ -74,7 +76,7 @@ impl button::Renderer for Renderer { content, ], }, - if is_hover { + if is_mouse_over { MouseCursor::Pointer } else { MouseCursor::OutOfBounds -- cgit From 8c3dabb5a1640ed77c35f895ca866262bb4f885c Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sat, 12 Oct 2019 18:48:35 +0200 Subject: Draw radio buttons in `iced_wgpu` --- wgpu/src/renderer/radio.rs | 106 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 99 insertions(+), 7 deletions(-) (limited to 'wgpu/src/renderer') diff --git a/wgpu/src/renderer/radio.rs b/wgpu/src/renderer/radio.rs index 712a7104..97b4f70e 100644 --- a/wgpu/src/renderer/radio.rs +++ b/wgpu/src/renderer/radio.rs @@ -1,17 +1,109 @@ use crate::{Primitive, Renderer}; -use iced_native::{radio, Layout, MouseCursor, Node, Point, Radio, Style}; +use iced_native::{ + radio, text, Align, Background, Color, Column, Layout, Length, MouseCursor, + Node, Point, Radio, Rectangle, Row, Text, Widget, +}; + +const SIZE: f32 = 28.0; +const DOT_SIZE: f32 = SIZE / 2.0; impl radio::Renderer for Renderer { - fn node(&self, _checkbox: &Radio) -> Node { - Node::new(Style::default()) + fn node(&self, radio: &Radio) -> Node { + Row::<(), Self>::new() + .spacing(15) + .align_items(Align::Center) + .push( + Column::new() + .width(Length::Units(SIZE as u16)) + .height(Length::Units(SIZE as u16)), + ) + .push(Text::new(&radio.label)) + .node(self) } fn draw( &mut self, - _radio: &Radio, - _layout: Layout<'_>, - _cursor_position: Point, + radio: &Radio, + layout: Layout<'_>, + cursor_position: Point, ) -> Self::Output { - (Primitive::None, MouseCursor::OutOfBounds) + let bounds = layout.bounds(); + let mut children = layout.children(); + + let radio_bounds = children.next().unwrap().bounds(); + let label_layout = children.next().unwrap(); + + let (label, _) = + text::Renderer::draw(self, &Text::new(&radio.label), label_layout); + + let is_mouse_over = bounds.contains(cursor_position); + + let (radio_border, radio_box) = ( + Primitive::Quad { + bounds: radio_bounds, + background: Background::Color(Color { + r: 0.6, + g: 0.6, + b: 0.6, + a: 1.0, + }), + border_radius: (SIZE / 2.0) as u16, + }, + Primitive::Quad { + bounds: Rectangle { + x: radio_bounds.x + 1.0, + y: radio_bounds.y + 1.0, + width: radio_bounds.width - 2.0, + height: radio_bounds.height - 2.0, + }, + background: Background::Color(if is_mouse_over { + Color { + r: 0.90, + g: 0.90, + b: 0.90, + a: 1.0, + } + } else { + Color { + r: 0.95, + g: 0.95, + b: 0.95, + a: 1.0, + } + }), + border_radius: (SIZE / 2.0 - 1.0) as u16, + }, + ); + + ( + Primitive::Group { + primitives: if radio.is_selected { + let radio_circle = Primitive::Quad { + bounds: Rectangle { + x: radio_bounds.x + DOT_SIZE / 2.0, + y: radio_bounds.y + DOT_SIZE / 2.0, + width: radio_bounds.width - DOT_SIZE, + height: radio_bounds.height - DOT_SIZE, + }, + background: Background::Color(Color { + r: 0.30, + g: 0.30, + b: 0.30, + a: 1.0, + }), + border_radius: (DOT_SIZE / 2.0) as u16, + }; + + vec![radio_border, radio_box, radio_circle, label] + } else { + vec![radio_border, radio_box, label] + }, + }, + if is_mouse_over { + MouseCursor::Pointer + } else { + MouseCursor::OutOfBounds + }, + ) } } -- cgit From ccc463a7c051b1096bc8a9f17ec64c2912a11247 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 13 Oct 2019 18:10:12 +0200 Subject: Draw checkbox in `iced_wgpu` --- wgpu/src/renderer/checkbox.rs | 102 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 94 insertions(+), 8 deletions(-) (limited to 'wgpu/src/renderer') diff --git a/wgpu/src/renderer/checkbox.rs b/wgpu/src/renderer/checkbox.rs index 7b06d397..fd3f08b1 100644 --- a/wgpu/src/renderer/checkbox.rs +++ b/wgpu/src/renderer/checkbox.rs @@ -1,20 +1,106 @@ use crate::{Primitive, Renderer}; use iced_native::{ - checkbox, Checkbox, Layout, MouseCursor, Node, Point, Style, + checkbox, text, text::HorizontalAlignment, text::VerticalAlignment, Align, + Background, Checkbox, Color, Column, Layout, Length, MouseCursor, Node, + Point, Rectangle, Row, Text, Widget, }; +const SIZE: f32 = 28.0; + impl checkbox::Renderer for Renderer { - fn node(&self, _checkbox: &Checkbox) -> Node { - Node::new(Style::default()) + fn node(&self, checkbox: &Checkbox) -> Node { + Row::<(), Self>::new() + .spacing(15) + .align_items(Align::Center) + .push( + Column::new() + .width(Length::Units(SIZE as u16)) + .height(Length::Units(SIZE as u16)), + ) + .push(Text::new(&checkbox.label)) + .node(self) } fn draw( &mut self, - _checkbox: &Checkbox, - _layout: Layout<'_>, - _cursor_position: Point, + checkbox: &Checkbox, + layout: Layout<'_>, + cursor_position: Point, ) -> Self::Output { - // TODO - (Primitive::None, MouseCursor::OutOfBounds) + let bounds = layout.bounds(); + let mut children = layout.children(); + + let checkbox_layout = children.next().unwrap(); + let label_layout = children.next().unwrap(); + let checkbox_bounds = checkbox_layout.bounds(); + + let (label, _) = text::Renderer::draw( + self, + &Text::new(&checkbox.label), + label_layout, + ); + + let is_mouse_over = bounds.contains(cursor_position); + + let (checkbox_border, checkbox_box) = ( + Primitive::Quad { + bounds: checkbox_bounds, + background: Background::Color(Color { + r: 0.6, + g: 0.6, + b: 0.6, + a: 1.0, + }), + border_radius: 6, + }, + Primitive::Quad { + bounds: Rectangle { + x: checkbox_bounds.x + 1.0, + y: checkbox_bounds.y + 1.0, + width: checkbox_bounds.width - 2.0, + height: checkbox_bounds.height - 2.0, + }, + background: Background::Color(if is_mouse_over { + Color { + r: 0.90, + g: 0.90, + b: 0.90, + a: 1.0, + } + } else { + Color { + r: 0.95, + g: 0.95, + b: 0.95, + a: 1.0, + } + }), + border_radius: 6, + }, + ); + + ( + Primitive::Group { + primitives: if checkbox.is_checked { + // TODO: Draw an actual icon + let (check, _) = text::Renderer::draw( + self, + &Text::new("X") + .horizontal_alignment(HorizontalAlignment::Center) + .vertical_alignment(VerticalAlignment::Center), + checkbox_layout, + ); + + vec![checkbox_border, checkbox_box, check, label] + } else { + vec![checkbox_border, checkbox_box, label] + }, + }, + if is_mouse_over { + MouseCursor::Pointer + } else { + MouseCursor::OutOfBounds + }, + ) } } -- cgit From f8a232c8af4c50557fbf0c2e0b2ba46fb63f6adc Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 22 Oct 2019 23:20:24 +0200 Subject: Remove generic handle in `Image` For now, we will simply assume images will be loaded from a given path. --- wgpu/src/renderer/image.rs | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) (limited to 'wgpu/src/renderer') diff --git a/wgpu/src/renderer/image.rs b/wgpu/src/renderer/image.rs index a29a3d49..85ac3ad5 100644 --- a/wgpu/src/renderer/image.rs +++ b/wgpu/src/renderer/image.rs @@ -1,16 +1,12 @@ use crate::{Primitive, Renderer}; use iced_native::{image, Image, Layout, MouseCursor, Node, Style}; -impl image::Renderer<&str> for Renderer { - fn node(&self, _image: &Image<&str>) -> Node { +impl image::Renderer for Renderer { + fn node(&self, _image: &Image) -> Node { Node::new(Style::default()) } - fn draw( - &mut self, - _image: &Image<&str>, - _layout: Layout<'_>, - ) -> Self::Output { + fn draw(&mut self, _image: &Image, _layout: Layout<'_>) -> Self::Output { (Primitive::None, MouseCursor::OutOfBounds) } } -- cgit From 38b6c84e7761c049b17d178deb9c866386a53946 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Wed, 23 Oct 2019 01:21:23 +0200 Subject: Implement basic image rendering in `iced_wgpu` --- wgpu/src/renderer/image.rs | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) (limited to 'wgpu/src/renderer') diff --git a/wgpu/src/renderer/image.rs b/wgpu/src/renderer/image.rs index 85ac3ad5..1a9b01bb 100644 --- a/wgpu/src/renderer/image.rs +++ b/wgpu/src/renderer/image.rs @@ -1,12 +1,33 @@ use crate::{Primitive, Renderer}; -use iced_native::{image, Image, Layout, MouseCursor, Node, Style}; +use iced_native::{image, Image, Layout, Length, MouseCursor, Node, Style}; impl image::Renderer for Renderer { - fn node(&self, _image: &Image) -> Node { - Node::new(Style::default()) + fn node(&self, image: &Image) -> Node { + let (width, height) = self.image_pipeline.dimensions(&image.path); + + let aspect_ratio = width as f32 / height as f32; + + let mut style = Style::default().align_self(image.align_self); + + style = match (image.width, image.height) { + (Length::Units(width), _) => style.width(image.width).height( + Length::Units((width as f32 / aspect_ratio).round() as u16), + ), + (_, _) => style + .width(Length::Units(width as u16)) + .height(Length::Units(height as u16)), + }; + + Node::new(style) } - fn draw(&mut self, _image: &Image, _layout: Layout<'_>) -> Self::Output { - (Primitive::None, MouseCursor::OutOfBounds) + fn draw(&mut self, image: &Image, layout: Layout<'_>) -> Self::Output { + ( + Primitive::Image { + path: image.path.clone(), + bounds: layout.bounds(), + }, + MouseCursor::OutOfBounds, + ) } } -- cgit From 871eb414303804233ed50d43bb9b98a7037cbd4c Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Wed, 23 Oct 2019 01:34:58 +0200 Subject: Add `TODO` to `image::Renderer::node` --- wgpu/src/renderer/image.rs | 1 + 1 file changed, 1 insertion(+) (limited to 'wgpu/src/renderer') diff --git a/wgpu/src/renderer/image.rs b/wgpu/src/renderer/image.rs index 1a9b01bb..0e312706 100644 --- a/wgpu/src/renderer/image.rs +++ b/wgpu/src/renderer/image.rs @@ -9,6 +9,7 @@ impl image::Renderer for Renderer { let mut style = Style::default().align_self(image.align_self); + // TODO: Deal with additional cases style = match (image.width, image.height) { (Length::Units(width), _) => style.width(image.width).height( Length::Units((width as f32 / aspect_ratio).round() as u16), -- cgit