diff options
| author | Turgay Bulut <turgay.bulut@ozu.edu.tr> | 2026-06-01 04:15:26 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-06-01 04:15:26 +0300 |
| commit | 4db4ffad994bd614763641716013fa7ad41e1eb9 (patch) | |
| tree | 58733f88ed8277c30c58428fc32a2b93ac52fc1e /src/app/input/sidebar.rs | |
| parent | 09169d59c1b5b3ebb6e4b1a584d9dfbe1839147f (diff) | |
feat: add expanded sidebar collapse control (#291)
* feat: add expanded sidebar collapse control
refs #278
* fix: place sidebar collapse control inside content
refs #278
---------
Co-authored-by: Can Celik <ogulcancelik@gmail.com>
Diffstat (limited to 'src/app/input/sidebar.rs')
| -rw-r--r-- | src/app/input/sidebar.rs | 56 |
1 files changed, 51 insertions, 5 deletions
diff --git a/src/app/input/sidebar.rs b/src/app/input/sidebar.rs index 8ba12bc6..43093a82 100644 --- a/src/app/input/sidebar.rs +++ b/src/app/input/sidebar.rs @@ -238,17 +238,25 @@ impl AppState { return false; } let sidebar = self.view.sidebar_rect; + let toggle = crate::ui::expanded_sidebar_toggle_rect(sidebar); + let on_toggle = toggle.width > 0 + && col >= toggle.x + && col < toggle.x + toggle.width + && row >= toggle.y + && row < toggle.y + toggle.height; sidebar.width > 0 + && !on_toggle && col == sidebar.x + sidebar.width.saturating_sub(1) && row >= sidebar.y && row < sidebar.y + sidebar.height } - pub(super) fn on_collapsed_sidebar_toggle(&self, col: u16, row: u16) -> bool { - if !self.sidebar_collapsed { - return false; - } - let rect = crate::ui::collapsed_sidebar_toggle_rect(self.view.sidebar_rect); + pub(super) fn on_sidebar_toggle(&self, col: u16, row: u16) -> bool { + let rect = if self.sidebar_collapsed { + crate::ui::collapsed_sidebar_toggle_rect(self.view.sidebar_rect) + } else { + crate::ui::expanded_sidebar_toggle_rect(self.view.sidebar_rect) + }; rect.width > 0 && col >= rect.x && col < rect.x + rect.width @@ -970,6 +978,24 @@ mod tests { } #[test] + fn clicking_expanded_sidebar_toggle_collapses_sidebar() { + let mut app = app_for_mouse_test(); + app.state.sidebar_collapsed = false; + app.state.view.sidebar_rect = Rect::new(0, 0, 26, 20); + app.state.view.terminal_area = Rect::new(26, 0, 80, 20); + + let toggle = crate::ui::expanded_sidebar_toggle_rect(app.state.view.sidebar_rect); + app.handle_mouse(mouse( + MouseEventKind::Down(MouseButton::Left), + toggle.x, + toggle.y, + )); + + assert!(app.state.sidebar_collapsed); + assert!(app.state.drag.is_none()); + } + + #[test] fn clicking_workspace_switches_on_mouse_up() { let mut app = app_for_mouse_test(); app.state.workspaces = vec![Workspace::test_new("a"), Workspace::test_new("b")]; @@ -1455,6 +1481,26 @@ mod tests { } #[test] + fn dragging_sidebar_bottom_divider_still_sets_manual_width() { + let mut app = app_for_mouse_test(); + let divider_col = app.state.view.sidebar_rect.x + app.state.view.sidebar_rect.width - 1; + let bottom_row = app.state.view.sidebar_rect.y + app.state.view.sidebar_rect.height - 1; + + app.handle_mouse(mouse( + MouseEventKind::Down(MouseButton::Left), + divider_col, + bottom_row, + )); + app.handle_mouse(mouse( + MouseEventKind::Drag(MouseButton::Left), + divider_col + 5, + bottom_row, + )); + + assert_eq!(app.state.sidebar_width, 31); + } + + #[test] fn dragging_past_max_clamps_to_configured_max() { let mut app = app_for_mouse_test(); app.state.sidebar_max_width = 30; |
