Skip to main content

par_term/app/
mouse.rs

1use crate::selection::Selection;
2use crate::url_detection;
3use std::time::Instant;
4
5/// State related to mouse interaction, selection, and URL detection
6pub struct MouseState {
7    pub selection: Option<Selection>, // Current text selection
8    pub is_selecting: bool,           // Whether currently dragging to select
9
10    pub position: (f64, f64),             // Current mouse position in pixels
11    pub button_pressed: bool, // Whether any mouse button is currently pressed (for motion tracking)
12    pub last_click_time: Option<Instant>, // Time of last mouse click
13    pub click_count: u32,     // Number of sequential clicks (1 = single, 2 = double, 3 = triple)
14    pub click_position: Option<(usize, usize)>, // Position of last click in cell coordinates
15    pub detected_urls: Vec<url_detection::DetectedUrl>, // URLs detected in visible terminal area
16    pub hovered_url: Option<String>, // URL currently under mouse cursor
17
18    // Divider drag state
19    pub dragging_divider: Option<usize>, // Index of divider being dragged
20    pub divider_hover: bool,             // Whether hovering over a divider
21    pub hovered_divider_index: Option<usize>, // Index of the hovered divider
22}
23
24impl Default for MouseState {
25    fn default() -> Self {
26        Self::new()
27    }
28}
29
30impl MouseState {
31    pub fn new() -> Self {
32        Self {
33            selection: None,
34            is_selecting: false,
35            position: (0.0, 0.0),
36            button_pressed: false,
37            last_click_time: None,
38            click_count: 0,
39            click_position: None,
40            detected_urls: Vec::new(),
41            hovered_url: None,
42            dragging_divider: None,
43            divider_hover: false,
44            hovered_divider_index: None,
45        }
46    }
47}