summaryrefslogtreecommitdiffstats
path: root/wgpu/src/widget/canvas
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-04-29 04:25:49 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-04-29 04:25:49 +0200
commitdc51080328caa12d2b1fc02febc72cab70bb9f50 (patch)
tree0a9781223d1b78a8c404d57b17c61fb0136b196e /wgpu/src/widget/canvas
parent5586034d6626e013cdd718aca1c4f19f6a060ff3 (diff)
downloadiced-dc51080328caa12d2b1fc02febc72cab70bb9f50.tar.gz
iced-dc51080328caa12d2b1fc02febc72cab70bb9f50.tar.bz2
iced-dc51080328caa12d2b1fc02febc72cab70bb9f50.zip
Introduce `Cursor` type in `canvas`
Diffstat (limited to 'wgpu/src/widget/canvas')
-rw-r--r--wgpu/src/widget/canvas/cursor.rs50
-rw-r--r--wgpu/src/widget/canvas/program.rs32
2 files changed, 71 insertions, 11 deletions
diff --git a/wgpu/src/widget/canvas/cursor.rs b/wgpu/src/widget/canvas/cursor.rs
new file mode 100644
index 00000000..a559782a
--- /dev/null
+++ b/wgpu/src/widget/canvas/cursor.rs
@@ -0,0 +1,50 @@
+use iced_native::{Point, Rectangle};
+
+#[derive(Debug, Clone, Copy, PartialEq)]
+pub enum Cursor {
+ Available(Point),
+ Unavailable,
+}
+
+impl Cursor {
+ // TODO: Remove this once this type is used in `iced_native` to encode
+ // proper cursor availability
+ pub(crate) fn from_window_position(position: Point) -> Self {
+ if position.x < 0.0 || position.y < 0.0 {
+ Cursor::Unavailable
+ } else {
+ Cursor::Available(position)
+ }
+ }
+
+ pub fn position(&self) -> Option<Point> {
+ match self {
+ Cursor::Available(position) => Some(*position),
+ Cursor::Unavailable => None,
+ }
+ }
+
+ pub fn relative_position(&self, bounds: &Rectangle) -> Option<Point> {
+ match self {
+ Cursor::Available(position) => {
+ Some(Point::new(position.x - bounds.x, position.y - bounds.y))
+ }
+ _ => None,
+ }
+ }
+
+ pub fn internal_position(&self, bounds: &Rectangle) -> Option<Point> {
+ if self.is_over(bounds) {
+ self.relative_position(bounds)
+ } else {
+ None
+ }
+ }
+
+ pub fn is_over(&self, bounds: &Rectangle) -> bool {
+ match self {
+ Cursor::Available(position) => bounds.contains(*position),
+ Cursor::Unavailable => false,
+ }
+ }
+}
diff --git a/wgpu/src/widget/canvas/program.rs b/wgpu/src/widget/canvas/program.rs
index 9e4aca89..f8e54514 100644
--- a/wgpu/src/widget/canvas/program.rs
+++ b/wgpu/src/widget/canvas/program.rs
@@ -1,14 +1,19 @@
-use crate::canvas::{Event, Geometry, Size};
-use iced_native::MouseCursor;
+use crate::canvas::{Cursor, Event, Geometry};
+use iced_native::{MouseCursor, Rectangle};
pub trait Program<Message> {
- fn update(&mut self, _event: Event, _bounds: Size) -> Option<Message> {
+ fn update(
+ &mut self,
+ _event: Event,
+ _bounds: Rectangle,
+ _cursor: Cursor,
+ ) -> Option<Message> {
None
}
- fn draw(&self, bounds: Size) -> Vec<Geometry>;
+ fn draw(&self, bounds: Rectangle, cursor: Cursor) -> Vec<Geometry>;
- fn mouse_cursor(&self, _bounds: Size) -> MouseCursor {
+ fn mouse_cursor(&self, _bounds: Rectangle, _cursor: Cursor) -> MouseCursor {
MouseCursor::default()
}
}
@@ -17,15 +22,20 @@ impl<T, Message> Program<Message> for &mut T
where
T: Program<Message>,
{
- fn update(&mut self, event: Event, bounds: Size) -> Option<Message> {
- T::update(self, event, bounds)
+ fn update(
+ &mut self,
+ event: Event,
+ bounds: Rectangle,
+ cursor: Cursor,
+ ) -> Option<Message> {
+ T::update(self, event, bounds, cursor)
}
- fn draw(&self, bounds: Size) -> Vec<Geometry> {
- T::draw(self, bounds)
+ fn draw(&self, bounds: Rectangle, cursor: Cursor) -> Vec<Geometry> {
+ T::draw(self, bounds, cursor)
}
- fn mouse_cursor(&self, bounds: Size) -> MouseCursor {
- T::mouse_cursor(self, bounds)
+ fn mouse_cursor(&self, bounds: Rectangle, cursor: Cursor) -> MouseCursor {
+ T::mouse_cursor(self, bounds, cursor)
}
}