From c6c8cabdaf03f90b1739be828cf140d8ddb92e65 Mon Sep 17 00:00:00 2001 From: FabianLars Date: Mon, 24 Feb 2020 18:03:42 +0100 Subject: moved cursor into own file moved click tracking as a new State struct to input::mouse made cursor field of text_input state private brought back cursor type(Index, Selection) representation with a state enum cleaned out some stuff (but not enough/all) TODO: Documentation (sigh) TODO: Editor struct TODO: some (hopefully) small improvements here and there --- native/src/input/mouse.rs | 64 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) (limited to 'native/src/input') diff --git a/native/src/input/mouse.rs b/native/src/input/mouse.rs index 69dc6b4c..22c81e15 100644 --- a/native/src/input/mouse.rs +++ b/native/src/input/mouse.rs @@ -2,5 +2,69 @@ mod button; mod event; +use crate::Point; pub use button::Button; pub use event::{Event, ScrollDelta}; +use std::time::{Duration, SystemTime}; + +/// enum to track the type of the last click +#[derive(Debug, Copy, Clone)] +pub enum Interaction { + /// Last Click was a single click + Click(Point), + /// Last Click was a double click + DoubleClick(Point), + /// Last Click was a triple click + TripleClick(Point), +} + +/// Compiler bully +#[derive(Debug, Copy, Clone)] +pub struct State { + last_click: Option, + last_click_timestamp: Option, +} + +impl Default for State { + fn default() -> Self { + State { + last_click: None, + last_click_timestamp: None, + } + } +} + +impl State { + /// processes left click to check for double/triple clicks + /// return amount of repetitive mouse clicks + /// (1 -> double click, 2 -> triple click) + pub fn update(&mut self, position: Point) -> Interaction { + self.last_click_timestamp = Some(SystemTime::now()); + self.last_click = match self.last_click { + None => Some(Interaction::Click(position)), + Some(x) => match x { + Interaction::Click(p) if self.process_click(p, position) => { + Some(Interaction::DoubleClick(position)) + } + Interaction::DoubleClick(p) + if self.process_click(p, position) => + { + Some(Interaction::TripleClick(position)) + } + _ => Some(Interaction::Click(position)), + }, + }; + self.last_click.unwrap_or(Interaction::Click(position)) + } + + fn process_click(&self, old_position: Point, new_position: Point) -> bool { + old_position == new_position + && SystemTime::now() + .duration_since( + self.last_click_timestamp.unwrap_or(SystemTime::UNIX_EPOCH), + ) + .unwrap_or(Duration::from_secs(1)) + .as_millis() + <= 500 + } +} -- cgit From c47e30e960a403631b6dff7a522a775050d59f87 Mon Sep 17 00:00:00 2001 From: FabianLars Date: Mon, 24 Feb 2020 20:10:20 +0100 Subject: double click fixed --- native/src/input/mouse.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'native/src/input') diff --git a/native/src/input/mouse.rs b/native/src/input/mouse.rs index 22c81e15..eaac52f3 100644 --- a/native/src/input/mouse.rs +++ b/native/src/input/mouse.rs @@ -39,7 +39,6 @@ impl State { /// return amount of repetitive mouse clicks /// (1 -> double click, 2 -> triple click) pub fn update(&mut self, position: Point) -> Interaction { - self.last_click_timestamp = Some(SystemTime::now()); self.last_click = match self.last_click { None => Some(Interaction::Click(position)), Some(x) => match x { @@ -54,6 +53,7 @@ impl State { _ => Some(Interaction::Click(position)), }, }; + self.last_click_timestamp = Some(SystemTime::now()); self.last_click.unwrap_or(Interaction::Click(position)) } -- cgit From 1ad83889be32b1bdb746e751aa620fad85b864b0 Mon Sep 17 00:00:00 2001 From: FabianLars Date: Wed, 26 Feb 2020 21:58:34 +0100 Subject: really small cleanup --- native/src/input/mouse.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'native/src/input') diff --git a/native/src/input/mouse.rs b/native/src/input/mouse.rs index eaac52f3..ca3daeb1 100644 --- a/native/src/input/mouse.rs +++ b/native/src/input/mouse.rs @@ -36,8 +36,7 @@ impl Default for State { impl State { /// processes left click to check for double/triple clicks - /// return amount of repetitive mouse clicks - /// (1 -> double click, 2 -> triple click) + /// return amount of repetitive mouse clicks as enum pub fn update(&mut self, position: Point) -> Interaction { self.last_click = match self.last_click { None => Some(Interaction::Click(position)), -- cgit From 7cb1452d29ddfdcd29fd7ecc7c96a79ea2681fce Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 24 Mar 2020 19:03:17 +0100 Subject: Convert `mouse::State` into `mouse::Click` --- native/src/input/mouse.rs | 66 ++----------------------------------- native/src/input/mouse/click.rs | 73 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 63 deletions(-) create mode 100644 native/src/input/mouse/click.rs (limited to 'native/src/input') diff --git a/native/src/input/mouse.rs b/native/src/input/mouse.rs index ca3daeb1..7198b233 100644 --- a/native/src/input/mouse.rs +++ b/native/src/input/mouse.rs @@ -2,68 +2,8 @@ mod button; mod event; -use crate::Point; +pub mod click; + pub use button::Button; +pub use click::Click; pub use event::{Event, ScrollDelta}; -use std::time::{Duration, SystemTime}; - -/// enum to track the type of the last click -#[derive(Debug, Copy, Clone)] -pub enum Interaction { - /// Last Click was a single click - Click(Point), - /// Last Click was a double click - DoubleClick(Point), - /// Last Click was a triple click - TripleClick(Point), -} - -/// Compiler bully -#[derive(Debug, Copy, Clone)] -pub struct State { - last_click: Option, - last_click_timestamp: Option, -} - -impl Default for State { - fn default() -> Self { - State { - last_click: None, - last_click_timestamp: None, - } - } -} - -impl State { - /// processes left click to check for double/triple clicks - /// return amount of repetitive mouse clicks as enum - pub fn update(&mut self, position: Point) -> Interaction { - self.last_click = match self.last_click { - None => Some(Interaction::Click(position)), - Some(x) => match x { - Interaction::Click(p) if self.process_click(p, position) => { - Some(Interaction::DoubleClick(position)) - } - Interaction::DoubleClick(p) - if self.process_click(p, position) => - { - Some(Interaction::TripleClick(position)) - } - _ => Some(Interaction::Click(position)), - }, - }; - self.last_click_timestamp = Some(SystemTime::now()); - self.last_click.unwrap_or(Interaction::Click(position)) - } - - fn process_click(&self, old_position: Point, new_position: Point) -> bool { - old_position == new_position - && SystemTime::now() - .duration_since( - self.last_click_timestamp.unwrap_or(SystemTime::UNIX_EPOCH), - ) - .unwrap_or(Duration::from_secs(1)) - .as_millis() - <= 500 - } -} diff --git a/native/src/input/mouse/click.rs b/native/src/input/mouse/click.rs new file mode 100644 index 00000000..60ae056b --- /dev/null +++ b/native/src/input/mouse/click.rs @@ -0,0 +1,73 @@ +//! Track mouse clicks. +use crate::Point; +use std::time::Instant; + +/// A mouse click. +#[derive(Debug, Clone, Copy)] +pub struct Click { + kind: Kind, + position: Point, + time: Instant, +} + +/// The kind of mouse click. +#[derive(Debug, Clone, Copy)] +pub enum Kind { + /// A single click + Single, + + /// A double click + Double, + + /// A triple click + Triple, +} + +impl Kind { + fn next(&self) -> Kind { + match self { + Kind::Single => Kind::Double, + Kind::Double => Kind::Triple, + Kind::Triple => Kind::Double, + } + } +} + +impl Click { + /// Creates a new [`Click`] with the given position and previous last + /// [`Click`]. + /// + /// [`Click`]: struct.Click.html + pub fn new(position: Point, previous: Option) -> Click { + let time = Instant::now(); + + let kind = if let Some(previous) = previous { + if previous.is_consecutive(position, time) { + previous.kind.next() + } else { + Kind::Single + } + } else { + Kind::Single + }; + + Click { + kind, + position, + time, + } + } + + /// Returns the [`Kind`] of [`Click`]. + /// + /// [`Kind`]: enum.Kind.html + /// [`Click`]: struct.Click.html + pub fn kind(&self) -> Kind { + self.kind + } + + fn is_consecutive(&self, new_position: Point, time: Instant) -> bool { + self.position == new_position + && time.duration_since(self.time).as_millis() <= 300 + } +} -- cgit From 763f64b653e69b46715dcd8f7918ed769639098c Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 24 Mar 2020 19:14:27 +0100 Subject: Avoid panic in `Click::is_consecutive` --- native/src/input/mouse/click.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'native/src/input') diff --git a/native/src/input/mouse/click.rs b/native/src/input/mouse/click.rs index 60ae056b..d27bc67e 100644 --- a/native/src/input/mouse/click.rs +++ b/native/src/input/mouse/click.rs @@ -68,6 +68,9 @@ impl Click { fn is_consecutive(&self, new_position: Point, time: Instant) -> bool { self.position == new_position - && time.duration_since(self.time).as_millis() <= 300 + && time + .checked_duration_since(self.time) + .map(|duration| duration.as_millis() <= 300) + .unwrap_or(false) } } -- cgit