diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-05 18:32:14 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-05 18:32:42 +0300 |
| commit | f7b0ee2f758440db3a3ff4cc727f879b420255d7 (patch) | |
| tree | 764149deada51f6196f3eecda46374ec45ff097a /src/app/actions.rs | |
| parent | 6885c8873971d79332376137a14572f8440ef42e (diff) | |
feat: add mobile terminal layout
Diffstat (limited to 'src/app/actions.rs')
| -rw-r--r-- | src/app/actions.rs | 36 |
1 files changed, 32 insertions, 4 deletions
diff --git a/src/app/actions.rs b/src/app/actions.rs index 0b187fed..3b904a89 100644 --- a/src/app/actions.rs +++ b/src/app/actions.rs @@ -8,7 +8,7 @@ use crate::events::AppEvent; use crate::layout::{find_in_direction, NavDirection, PaneId}; use crate::pane::EffectiveStateChange; -use super::state::{AppState, Mode, ToastKind, ToastNotification}; +use super::state::{AppState, Mode, ToastKind, ToastNotification, ViewLayout}; fn is_background_completion_transition(prev_state: AgentState, new_state: AgentState) -> bool { matches!(new_state, AgentState::Idle) @@ -135,7 +135,16 @@ impl AppState { } pub(crate) fn ensure_workspace_visible(&mut self, idx: usize) { - if self.sidebar_collapsed || idx >= self.workspaces.len() { + if idx >= self.workspaces.len() { + return; + } + + if self.view.layout == ViewLayout::Mobile && self.mode == Mode::Navigate { + self.ensure_mobile_workspace_visible(idx); + return; + } + + if self.sidebar_collapsed { return; } @@ -164,6 +173,25 @@ impl AppState { } } + fn ensure_mobile_workspace_visible(&mut self, idx: usize) { + let viewport = crate::ui::mobile_switcher_areas(self).viewport; + if viewport.height == 0 { + return; + } + + let row_range = crate::ui::mobile_switcher_workspace_doc_range(idx); + let visible_start = self.mobile_switcher_scroll; + let visible_end = visible_start.saturating_add(viewport.height as usize); + if row_range.start < visible_start { + self.mobile_switcher_scroll = row_range.start; + } else if row_range.end > visible_end { + self.mobile_switcher_scroll = row_range.end.saturating_sub(viewport.height as usize); + } + self.mobile_switcher_scroll = self + .mobile_switcher_scroll + .min(crate::ui::mobile_switcher_max_scroll(self)); + } + pub fn switch_tab(&mut self, idx: usize) { if let Some(ws_idx) = self.active { let Some(ws) = self.workspaces.get_mut(ws_idx) else { @@ -747,10 +775,10 @@ mod tests { #[test] fn switch_workspace_keeps_selected_visible_in_scrolled_sidebar() { let mut state = app_with_workspaces(&["a", "b", "c", "d", "e", "f", "g", "h"]); - crate::ui::compute_view(&mut state, ratatui::layout::Rect::new(0, 0, 26, 14)); + crate::ui::compute_view(&mut state, ratatui::layout::Rect::new(0, 0, 80, 14)); state.switch_workspace(7); - crate::ui::compute_view(&mut state, ratatui::layout::Rect::new(0, 0, 26, 14)); + crate::ui::compute_view(&mut state, ratatui::layout::Rect::new(0, 0, 80, 14)); assert!(state .view |
