ratatui_toolkit/widgets/code_diff/widget/methods/
handle_mouse.rs

1//! Method to handle mouse events for sidebar resize.
2
3use crossterm::event::{MouseButton, MouseEvent, MouseEventKind};
4use ratatui::layout::Rect;
5
6use crate::widgets::code_diff::code_diff::CodeDiff;
7
8impl CodeDiff {
9    /// Handles mouse events for sidebar resizing.
10    ///
11    /// Supports mouse drag to resize the sidebar divider using ResizableSplit's
12    /// built-in drag handling.
13    ///
14    /// # Arguments
15    ///
16    /// * `event` - The mouse event to handle
17    /// * `area` - The area the widget is rendered in
18    ///
19    /// # Returns
20    ///
21    /// `true` if the event was handled (consumed), `false` otherwise
22    ///
23    /// # Example
24    ///
25    /// ```rust,no_run
26    /// use crossterm::event::{Event, MouseEvent};
27    /// use ratatui::layout::Rect;
28    /// use ratatui_toolkit::code_diff::{CodeDiff, DiffConfig};
29    ///
30    /// let mut diff = CodeDiff::new()
31    ///     .with_config(DiffConfig::new().sidebar_enabled(true));
32    ///
33    /// // In your event loop:
34    /// // if let Event::Mouse(mouse) = event {
35    /// //     let area = Rect::new(0, 0, 100, 50);
36    /// //     if diff.handle_mouse(mouse, area) {
37    /// //         // Mouse event was handled
38    /// //     }
39    /// // }
40    /// ```
41    pub fn handle_mouse(&mut self, event: MouseEvent, area: Rect) -> bool {
42        // Only handle mouse events when sidebar is visible
43        if !self.show_sidebar || !self.config.sidebar_enabled {
44            return false;
45        }
46
47        // Update divider position for mouse detection
48        self.sidebar_split.update_divider_position(area);
49
50        match event.kind {
51            MouseEventKind::Down(MouseButton::Left) => {
52                if self
53                    .sidebar_split
54                    .is_on_divider(event.column, event.row, area)
55                {
56                    self.sidebar_split.start_drag();
57                    return true;
58                }
59            }
60            MouseEventKind::Drag(MouseButton::Left) => {
61                if self.sidebar_split.is_dragging {
62                    self.sidebar_split
63                        .update_from_mouse(event.column, event.row, area);
64                    return true;
65                }
66            }
67            MouseEventKind::Up(MouseButton::Left) => {
68                if self.sidebar_split.is_dragging {
69                    self.sidebar_split.stop_drag();
70                    return true;
71                }
72            }
73            MouseEventKind::Moved => {
74                self.sidebar_split.is_hovering =
75                    self.sidebar_split
76                        .is_on_divider(event.column, event.row, area);
77            }
78            _ => {}
79        }
80        false
81    }
82}