aboutsummaryrefslogtreecommitdiff
path: root/src/app/input/sidebar.rs
diff options
context:
space:
mode:
authorTurgay Bulut <turgay.bulut@ozu.edu.tr>2026-06-01 04:15:26 +0300
committerGitHub <noreply@github.com>2026-06-01 04:15:26 +0300
commit4db4ffad994bd614763641716013fa7ad41e1eb9 (patch)
tree58733f88ed8277c30c58428fc32a2b93ac52fc1e /src/app/input/sidebar.rs
parent09169d59c1b5b3ebb6e4b1a584d9dfbe1839147f (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.rs56
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;