Skip to main content

ratatui_code_editor/
click.rs

1use 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