mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-10-03 03:28:11 +08:00
Desktop: Support triple-click inputs (#3671)
* Fix triple-click text to select paragraph on desktop * fixup --------- Co-authored-by: Timon <me@timon.zip>
This commit is contained in:
@@ -139,25 +139,26 @@ impl ClickTracker {
|
|||||||
|
|
||||||
let prev_time = record.time;
|
let prev_time = record.time;
|
||||||
let prev_position = record.position;
|
let prev_position = record.position;
|
||||||
|
let prev_count: ClickCount = record.down_count;
|
||||||
|
|
||||||
let now = Instant::now();
|
let now = Instant::now();
|
||||||
record.time = now;
|
record.time = now;
|
||||||
record.position = position;
|
record.position = position;
|
||||||
|
|
||||||
match state {
|
match state {
|
||||||
ElementState::Pressed if record.down_count == ClickCount::Double => {
|
ElementState::Pressed if record.down_count == ClickCount::Triple => {
|
||||||
*record = ClickRecord {
|
*record = ClickRecord {
|
||||||
down_count: ClickCount::Single,
|
down_count: ClickCount::Double,
|
||||||
..*record
|
..*record
|
||||||
};
|
};
|
||||||
return ClickCount::Single;
|
return ClickCount::Double;
|
||||||
}
|
}
|
||||||
ElementState::Released if record.up_count == ClickCount::Double => {
|
ElementState::Released if record.up_count == ClickCount::Triple => {
|
||||||
*record = ClickRecord {
|
*record = ClickRecord {
|
||||||
up_count: ClickCount::Single,
|
up_count: ClickCount::Double,
|
||||||
..*record
|
..*record
|
||||||
};
|
};
|
||||||
return ClickCount::Single;
|
return ClickCount::Double;
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
@@ -167,7 +168,11 @@ impl ClickTracker {
|
|||||||
let within_dist = dx <= MULTICLICK_ALLOWED_TRAVEL && dy <= MULTICLICK_ALLOWED_TRAVEL;
|
let within_dist = dx <= MULTICLICK_ALLOWED_TRAVEL && dy <= MULTICLICK_ALLOWED_TRAVEL;
|
||||||
let within_time = now.saturating_duration_since(prev_time) <= MULTICLICK_TIMEOUT;
|
let within_time = now.saturating_duration_since(prev_time) <= MULTICLICK_TIMEOUT;
|
||||||
|
|
||||||
let count = if within_time && within_dist { ClickCount::Double } else { ClickCount::Single };
|
let count = match (prev_count, within_time, within_dist) {
|
||||||
|
(ClickCount::Double, true, true) => ClickCount::Triple,
|
||||||
|
(_, true, true) => ClickCount::Double,
|
||||||
|
_ => ClickCount::Single,
|
||||||
|
};
|
||||||
|
|
||||||
*record = match state {
|
*record = match state {
|
||||||
ElementState::Pressed => ClickRecord { down_count: count, ..*record },
|
ElementState::Pressed => ClickRecord { down_count: count, ..*record },
|
||||||
@@ -182,12 +187,14 @@ pub(crate) enum ClickCount {
|
|||||||
#[default]
|
#[default]
|
||||||
Single,
|
Single,
|
||||||
Double,
|
Double,
|
||||||
|
Triple,
|
||||||
}
|
}
|
||||||
impl From<ClickCount> for i32 {
|
impl From<ClickCount> for i32 {
|
||||||
fn from(count: ClickCount) -> i32 {
|
fn from(count: ClickCount) -> i32 {
|
||||||
match count {
|
match count {
|
||||||
ClickCount::Single => 1,
|
ClickCount::Single => 1,
|
||||||
ClickCount::Double => 2,
|
ClickCount::Double => 2,
|
||||||
|
ClickCount::Triple => 3,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user