diff options
author | 2019-10-11 23:30:53 +0200 | |
---|---|---|
committer | 2019-10-11 23:30:53 +0200 | |
commit | a031a6f2130b3913a2419e4cea859c22aa388213 (patch) | |
tree | afa21d830b0c2eefc7f4e083c33d13c5b462c137 /wgpu | |
parent | 8846a239cf14edd464b1d09f6d6d57ad9b5c9fc7 (diff) | |
download | iced-a031a6f2130b3913a2419e4cea859c22aa388213.tar.gz iced-a031a6f2130b3913a2419e4cea859c22aa388213.tar.bz2 iced-a031a6f2130b3913a2419e4cea859c22aa388213.zip |
Handle mouse cursor in `iced_wgpu`
Diffstat (limited to 'wgpu')
-rw-r--r-- | wgpu/src/renderer.rs | 7 | ||||
-rw-r--r-- | wgpu/src/renderer/button.rs | 55 | ||||
-rw-r--r-- | wgpu/src/renderer/checkbox.rs | 6 | ||||
-rw-r--r-- | wgpu/src/renderer/column.rs | 34 | ||||
-rw-r--r-- | wgpu/src/renderer/image.rs | 4 | ||||
-rw-r--r-- | wgpu/src/renderer/radio.rs | 4 | ||||
-rw-r--r-- | wgpu/src/renderer/row.rs | 34 | ||||
-rw-r--r-- | wgpu/src/renderer/slider.rs | 4 | ||||
-rw-r--r-- | wgpu/src/renderer/text.rs | 21 |
9 files changed, 103 insertions, 66 deletions
diff --git a/wgpu/src/renderer.rs b/wgpu/src/renderer.rs index cdb44554..8d54b2c7 100644 --- a/wgpu/src/renderer.rs +++ b/wgpu/src/renderer.rs @@ -100,7 +100,7 @@ impl Renderer { fn draw( &mut self, - primitive: &Primitive, + (primitive, mouse_cursor): &(Primitive, MouseCursor), target: &mut Target, ) -> MouseCursor { log::debug!("Drawing"); @@ -152,7 +152,7 @@ impl Renderer { self.queue.submit(&[encoder.finish()]); - MouseCursor::OutOfBounds + *mouse_cursor } fn draw_primitive(&mut self, primitive: &Primitive) { @@ -243,8 +243,7 @@ impl Renderer { } impl iced_native::Renderer for Renderer { - // TODO: Add `MouseCursor` here (?) - type Output = Primitive; + type Output = (Primitive, MouseCursor); } impl Windowed for 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<Message>(&self, _checkbox: &Checkbox<Message>) -> 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<Message>( @@ -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<Message>(&self, _checkbox: &Radio<Message>) -> 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<Message>( @@ -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<Message>(&self, _slider: &Slider<Message>) -> 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, + ) } } |