Limit the storage used by the navigation history

This commit is contained in:
Max Brunsfeld 2022-01-18 16:31:48 -08:00
parent 926306582b
commit 2cae706033

View file

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