diff --git a/crates/workspace/src/pane.rs b/crates/workspace/src/pane.rs index 0a1cbdc1dac1d7dd034e2c442ab95a3540355354..be0e3f05fbefc80ebad7064b6ae8175415f93be7 100644 --- a/crates/workspace/src/pane.rs +++ b/crates/workspace/src/pane.rs @@ -1,6 +1,6 @@ use super::{ItemViewHandle, SplitDirection}; use crate::{ItemHandle, ItemView, Settings, WeakItemViewHandle, Workspace}; -use collections::HashMap; +use collections::{HashMap, VecDeque}; use gpui::{ action, elements::*, @@ -23,6 +23,8 @@ action!(CloseItem, usize); action!(GoBack); action!(GoForward); +const MAX_NAVIGATION_HISTORY_LEN: usize = 1024; + pub fn init(cx: &mut MutableAppContext) { cx.add_action(|pane: &mut Pane, action: &ActivateItem, cx| { pane.activate_item(action.0, cx); @@ -83,8 +85,8 @@ pub struct Navigation(RefCell); #[derive(Default)] struct NavigationHistory { mode: NavigationMode, - backward_stack: Vec, - forward_stack: Vec, + backward_stack: VecDeque, + forward_stack: VecDeque, paths_by_item: HashMap, } @@ -536,11 +538,11 @@ impl View for Pane { impl Navigation { pub fn pop_backward(&self) -> Option { - self.0.borrow_mut().backward_stack.pop() + self.0.borrow_mut().backward_stack.pop_back() } pub fn pop_forward(&self) -> Option { - self.0.borrow_mut().forward_stack.pop() + self.0.borrow_mut().forward_stack.pop_back() } fn pop(&self, mode: NavigationMode) -> Option { @@ -559,20 +561,29 @@ impl Navigation { let mut state = self.0.borrow_mut(); match state.mode { NavigationMode::Normal => { - state.backward_stack.push(NavigationEntry { + if state.backward_stack.len() >= MAX_NAVIGATION_HISTORY_LEN { + state.backward_stack.pop_front(); + } + state.backward_stack.push_back(NavigationEntry { item_view: Box::new(cx.weak_handle()), data: data.map(|data| Box::new(data) as Box), }); state.forward_stack.clear(); } NavigationMode::GoingBack => { - state.forward_stack.push(NavigationEntry { + if state.forward_stack.len() >= MAX_NAVIGATION_HISTORY_LEN { + state.forward_stack.pop_front(); + } + state.forward_stack.push_back(NavigationEntry { item_view: Box::new(cx.weak_handle()), data: data.map(|data| Box::new(data) as Box), }); } NavigationMode::GoingForward => { - state.backward_stack.push(NavigationEntry { + if state.backward_stack.len() >= MAX_NAVIGATION_HISTORY_LEN { + state.backward_stack.pop_front(); + } + state.backward_stack.push_back(NavigationEntry { item_view: Box::new(cx.weak_handle()), data: data.map(|data| Box::new(data) as Box), });