ratatui_code_editor/
click.rs1use std::time::{Duration, Instant};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq)]
4pub enum ClickKind {
5 Single,
6 Double,
7 Triple,
8}
9
10#[derive(Debug, Clone, Copy)]
11pub struct ClickTracker {
12 pub last: Option<(Instant, usize)>,
13 pub prev: Option<(Instant, usize)>,
14 pub max_dt: Duration,
15}
16
17impl ClickTracker {
18 pub fn new(max_dt: Duration) -> Self {
19 Self { last: None, prev: None, max_dt }
20 }
21
22 pub fn register(&mut self, cursor: usize) -> ClickKind {
23 let now = Instant::now();
24 let dbl = self.last
25 .map(|(t, p)| p == cursor && now.duration_since(t) < self.max_dt)
26 .unwrap_or(false);
27 let tpl = self.last.zip(self.prev)
28 .map(|((t1, p1), (t0, p0))| {
29 p0 == cursor && p1 == cursor &&
30 now.duration_since(t0) < self.max_dt &&
31 t1.duration_since(t0) < self.max_dt
32 })
33 .unwrap_or(false);
34
35 self.prev = self.last;
36 self.last = Some((now, cursor));
37
38 if tpl { ClickKind::Triple }
39 else if dbl { ClickKind::Double }
40 else { ClickKind::Single }
41 }
42}
43
44