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}