diff options
author | 2020-03-19 12:17:16 +0100 | |
---|---|---|
committer | 2020-03-19 12:17:16 +0100 | |
commit | d3572e1b819ff4d40de4f39f48eab71b9d0d4d5e (patch) | |
tree | 80d635749e4941004055f16a7ca5c35e11f3caa9 /native | |
parent | e19a07d40049f40f36d879a498fab4ce63778b27 (diff) | |
download | iced-d3572e1b819ff4d40de4f39f48eab71b9d0d4d5e.tar.gz iced-d3572e1b819ff4d40de4f39f48eab71b9d0d4d5e.tar.bz2 iced-d3572e1b819ff4d40de4f39f48eab71b9d0d4d5e.zip |
Turn `Touch` into a struct and add finger id
Diffstat (limited to 'native')
-rw-r--r-- | native/src/event.rs | 6 | ||||
-rw-r--r-- | native/src/input.rs | 1 | ||||
-rw-r--r-- | native/src/input/mouse/event.rs | 9 | ||||
-rw-r--r-- | native/src/input/touch.rs | 69 | ||||
-rw-r--r-- | native/src/user_interface.rs | 11 | ||||
-rw-r--r-- | native/src/widget/button.rs | 24 | ||||
-rw-r--r-- | native/src/widget/checkbox.rs | 7 | ||||
-rw-r--r-- | native/src/widget/radio.rs | 7 | ||||
-rw-r--r-- | native/src/widget/scrollable.rs | 56 | ||||
-rw-r--r-- | native/src/widget/slider.rs | 17 | ||||
-rw-r--r-- | native/src/widget/text_input.rs | 7 |
11 files changed, 129 insertions, 85 deletions
diff --git a/native/src/event.rs b/native/src/event.rs index fb5b9977..99a8e880 100644 --- a/native/src/event.rs +++ b/native/src/event.rs @@ -1,5 +1,5 @@ use crate::{ - input::{keyboard, mouse, touch}, + input::{keyboard, mouse, Touch}, window, }; @@ -9,7 +9,7 @@ use crate::{ /// additional events, feel free to [open an issue] and share your use case!_ /// /// [open an issue]: https://github.com/hecrj/iced/issues -#[derive(PartialEq, Clone, Debug)] +#[derive(Debug, Clone, PartialEq)] pub enum Event { /// A keyboard event Keyboard(keyboard::Event), @@ -21,5 +21,5 @@ pub enum Event { Window(window::Event), /// A touch event - Touch(touch::Touch), + Touch(Touch), } diff --git a/native/src/input.rs b/native/src/input.rs index c08beaf9..514a98ea 100644 --- a/native/src/input.rs +++ b/native/src/input.rs @@ -6,3 +6,4 @@ pub mod touch; mod button_state; pub use button_state::ButtonState; +pub use touch::Touch; diff --git a/native/src/input/mouse/event.rs b/native/src/input/mouse/event.rs index aafc4fe3..5068d634 100644 --- a/native/src/input/mouse/event.rs +++ b/native/src/input/mouse/event.rs @@ -1,5 +1,5 @@ use super::Button; -use crate::input::ButtonState; +use crate::{input::ButtonState, Point}; /// A mouse event. /// @@ -17,11 +17,8 @@ pub enum Event { /// The mouse cursor was moved CursorMoved { - /// The X coordinate of the mouse position - x: f32, - - /// The Y coordinate of the mouse position - y: f32, + /// The new position of the mouse cursor + position: Point, }, /// A mouse button was pressed or released. diff --git a/native/src/input/touch.rs b/native/src/input/touch.rs index 7c4a6210..ea879427 100644 --- a/native/src/input/touch.rs +++ b/native/src/input/touch.rs @@ -1,39 +1,36 @@ //! Build touch events. -/// The touch of a mobile device. + +use crate::Point; + +/// A touch interaction. #[derive(Debug, Clone, Copy, PartialEq)] -pub enum Touch { - /// The touch cursor was started - Started { - /// The X coordinate of the touch position - x: f32, - - /// The Y coordinate of the touch position - y: f32, - }, - /// The touch cursor was ended - Ended { - /// The X coordinate of the touch position - x: f32, - - /// The Y coordinate of the touch position - y: f32, - }, - - /// The touch was moved. - Moved { - /// The X coordinate of the touch position - x: f32, - - /// The Y coordinate of the touch position - y: f32, - }, - - /// Some canceled button. - Cancelled { - /// The X coordinate of the touch position - x: f32, - - /// The Y coordinate of the touch position - y: f32, - }, +pub struct Touch { + /// The finger of the touch. + pub finger: Finger, + + /// The position of the touch. + pub position: Point, + + /// The state of the touch. + pub phase: Phase, +} + +/// A unique identifier representing a finger on a touch interaction. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct Finger(pub u64); + +/// The state of a touch interaction. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Phase { + /// A touch interaction was started. + Started, + + /// An on-going touch interaction was moved. + Moved, + + /// A touch interaction was ended. + Ended, + + /// A touch interaction was canceled. + Canceled, } diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs index 751b2652..b71b9003 100644 --- a/native/src/user_interface.rs +++ b/native/src/user_interface.rs @@ -1,5 +1,5 @@ use crate::{ - input::{mouse, touch}, + input::{mouse, Touch}, layout, Clipboard, Element, Event, Layout, Point, Size, }; @@ -183,12 +183,9 @@ where for event in events { match event { - Event::Mouse(mouse::Event::CursorMoved { x, y }) - | Event::Touch(touch::Touch::Started { x, y }) - | Event::Touch(touch::Touch::Ended { x, y }) - | Event::Touch(touch::Touch::Moved { x, y }) - | Event::Touch(touch::Touch::Cancelled { x, y }) => { - self.cursor_position = Point::new(x, y); + Event::Mouse(mouse::Event::CursorMoved { position }) + | Event::Touch(Touch { position, .. }) => { + self.cursor_position = position; } _ => {} } diff --git a/native/src/widget/button.rs b/native/src/widget/button.rs index 8c397bc1..81dbe7c5 100644 --- a/native/src/widget/button.rs +++ b/native/src/widget/button.rs @@ -5,7 +5,7 @@ //! [`Button`]: struct.Button.html //! [`State`]: struct.State.html use crate::{ - input::{mouse, touch::Touch, ButtonState}, + input::{mouse, touch, ButtonState, Touch}, layout, Clipboard, Element, Event, Hasher, Layout, Length, Point, Rectangle, Widget, }; @@ -189,16 +189,24 @@ where button: mouse::Button::Left, state: ButtonState::Pressed, }) - | Event::Touch(Touch::Started { .. }) => { - let bounds = layout.bounds(); + | Event::Touch(Touch { + phase: touch::Phase::Started, + .. + }) => { + if self.on_press.is_some() { + let bounds = layout.bounds(); - self.state.is_pressed = bounds.contains(cursor_position); + self.state.is_pressed = bounds.contains(cursor_position); + } } Event::Mouse(mouse::Event::Input { button: mouse::Button::Left, state: ButtonState::Released, }) - | Event::Touch(Touch::Ended { .. }) => { + | Event::Touch(Touch { + phase: touch::Phase::Ended, + .. + }) => { if let Some(on_press) = self.on_press.clone() { let bounds = layout.bounds(); let is_clicked = self.state.is_pressed @@ -211,6 +219,12 @@ where } } } + Event::Touch(Touch { + phase: touch::Phase::Canceled, + .. + }) => { + self.state.is_pressed = false; + } _ => {} } } diff --git a/native/src/widget/checkbox.rs b/native/src/widget/checkbox.rs index 26665d8b..7b2345de 100644 --- a/native/src/widget/checkbox.rs +++ b/native/src/widget/checkbox.rs @@ -2,7 +2,7 @@ use std::hash::Hash; use crate::{ - input::{mouse, touch::Touch, ButtonState}, + input::{mouse, touch, ButtonState, Touch}, layout, row, text, Align, Clipboard, Element, Event, Font, Hasher, HorizontalAlignment, Layout, Length, Point, Rectangle, Row, Text, VerticalAlignment, Widget, @@ -156,7 +156,10 @@ where button: mouse::Button::Left, state: ButtonState::Pressed, }) - | Event::Touch(Touch::Started { .. }) => { + | Event::Touch(Touch { + phase: touch::Phase::Started, + .. + }) => { let mouse_over = layout.bounds().contains(cursor_position); if mouse_over { diff --git a/native/src/widget/radio.rs b/native/src/widget/radio.rs index 8a9c02ce..46983db3 100644 --- a/native/src/widget/radio.rs +++ b/native/src/widget/radio.rs @@ -1,6 +1,6 @@ //! Create choices using radio buttons. use crate::{ - input::{mouse, touch, ButtonState}, + input::{mouse, touch, ButtonState, Touch}, layout, row, text, Align, Clipboard, Element, Event, Font, Hasher, HorizontalAlignment, Layout, Length, Point, Rectangle, Row, Text, VerticalAlignment, Widget, @@ -122,7 +122,10 @@ where button: mouse::Button::Left, state: ButtonState::Pressed, }) - | Event::Touch(touch::Touch::Started { .. }) => { + | Event::Touch(Touch { + phase: touch::Phase::Started, + .. + }) => { if layout.bounds().contains(cursor_position) { messages.push(self.on_click.clone()); } diff --git a/native/src/widget/scrollable.rs b/native/src/widget/scrollable.rs index 2a658bcc..2f5a4820 100644 --- a/native/src/widget/scrollable.rs +++ b/native/src/widget/scrollable.rs @@ -1,7 +1,7 @@ //! Navigate an endless amount of content with a scrollbar. use crate::{ column, - input::{mouse, touch, ButtonState}, + input::{mouse, touch, ButtonState, Touch}, layout, Align, Clipboard, Column, Element, Event, Hasher, Layout, Length, Point, Rectangle, Size, Widget, }; @@ -175,22 +175,26 @@ where } } } - Event::Touch(touch::Touch::Started { .. }) => { - self.state.scroll_box_touched_at = Some(cursor_position); - } - Event::Touch(touch::Touch::Moved { .. }) => { - if let Some(scroll_box_touched_at) = - self.state.scroll_box_touched_at - { - let delta = cursor_position.y - scroll_box_touched_at.y; - self.state.scroll(delta, bounds, content_bounds); + Event::Touch(Touch { phase, .. }) => match phase { + touch::Phase::Started => { self.state.scroll_box_touched_at = Some(cursor_position); } - } - Event::Touch(touch::Touch::Ended { .. }) => { - self.state.scroll_box_touched_at = None; - } + touch::Phase::Moved => { + if let Some(scroll_box_touched_at) = + self.state.scroll_box_touched_at + { + let delta = + cursor_position.y - scroll_box_touched_at.y; + self.state.scroll(delta, bounds, content_bounds); + self.state.scroll_box_touched_at = + Some(cursor_position); + } + } + touch::Phase::Ended | touch::Phase::Canceled => { + self.state.scroll_box_touched_at = None; + } + }, _ => {} } } @@ -208,14 +212,24 @@ where button: mouse::Button::Left, state: ButtonState::Released, }) - | Event::Touch(touch::Touch::Ended { .. }) => { + | Event::Touch(Touch { + phase: touch::Phase::Ended, + .. + }) + | Event::Touch(Touch { + phase: touch::Phase::Canceled, + .. + }) => { self.state.scroller_grabbed_at = None; } Event::Mouse(mouse::Event::Input { button: mouse::Button::Left, state: ButtonState::Pressed, }) - | Event::Touch(touch::Touch::Started { .. }) => { + | Event::Touch(Touch { + phase: touch::Phase::Started, + .. + }) => { self.state.scroll_to( cursor_position.y / (bounds.y + bounds.height), bounds, @@ -223,7 +237,10 @@ where ); } Event::Mouse(mouse::Event::CursorMoved { .. }) - | Event::Touch(touch::Touch::Moved { .. }) => { + | Event::Touch(Touch { + phase: touch::Phase::Moved, + .. + }) => { if let (Some(scrollbar), Some(scroller_grabbed_at)) = (scrollbar, self.state.scroller_grabbed_at) { @@ -245,7 +262,10 @@ where button: mouse::Button::Left, state: ButtonState::Pressed, }) - | Event::Touch(touch::Touch::Started { .. }) => { + | Event::Touch(Touch { + phase: touch::Phase::Started, + .. + }) => { if let Some(scrollbar) = scrollbar { if let Some(scroller_grabbed_at) = scrollbar.grab_scroller(cursor_position) diff --git a/native/src/widget/slider.rs b/native/src/widget/slider.rs index 95f63921..c98cebb6 100644 --- a/native/src/widget/slider.rs +++ b/native/src/widget/slider.rs @@ -5,7 +5,7 @@ //! [`Slider`]: struct.Slider.html //! [`State`]: struct.State.html use crate::{ - input::{mouse, touch::Touch, ButtonState}, + input::{mouse, touch, ButtonState, Touch}, layout, Clipboard, Element, Event, Hasher, Layout, Length, Point, Rectangle, Size, Widget, }; @@ -168,7 +168,10 @@ where button: mouse::Button::Left, state: ButtonState::Pressed, }) - | Event::Touch(Touch::Started { .. }) => { + | Event::Touch(Touch { + phase: touch::Phase::Started, + .. + }) => { if layout.bounds().contains(cursor_position) { change(); self.state.is_dragging = true; @@ -178,11 +181,17 @@ where button: mouse::Button::Left, state: ButtonState::Released, }) - | Event::Touch(Touch::Ended { .. }) => { + | Event::Touch(Touch { + phase: touch::Phase::Ended, + .. + }) => { self.state.is_dragging = false; } Event::Mouse(mouse::Event::CursorMoved { .. }) - | Event::Touch(Touch::Moved { .. }) => { + | Event::Touch(Touch { + phase: touch::Phase::Moved, + .. + }) => { if self.state.is_dragging { change(); } diff --git a/native/src/widget/text_input.rs b/native/src/widget/text_input.rs index 9cfc6bf0..c06a8cce 100644 --- a/native/src/widget/text_input.rs +++ b/native/src/widget/text_input.rs @@ -5,7 +5,7 @@ //! [`TextInput`]: struct.TextInput.html //! [`State`]: struct.State.html use crate::{ - input::{keyboard, mouse, touch, ButtonState}, + input::{keyboard, mouse, touch, ButtonState, Touch}, layout, Clipboard, Element, Event, Font, Hasher, Layout, Length, Point, Rectangle, Size, Widget, }; @@ -203,7 +203,10 @@ where button: mouse::Button::Left, state: ButtonState::Pressed, }) - | Event::Touch(touch::Touch::Started { .. }) => { + | Event::Touch(Touch { + phase: touch::Phase::Started, + .. + }) => { let is_clicked = layout.bounds().contains(cursor_position); if is_clicked { |