Experiment with a more general way of pushing editor navigation entries

This commit is contained in:
Antonio Scandurra 2022-01-18 18:03:10 +01:00
parent 0cae3e0ac0
commit 16b82d59f1
4 changed files with 66 additions and 2 deletions

View file

@ -11,7 +11,13 @@ use gpui::{
};
use postage::watch;
use project::ProjectPath;
use std::{any::Any, cell::RefCell, cmp, mem, rc::Rc};
use std::{
any::Any,
cell::RefCell,
cmp, mem,
rc::Rc,
time::{Duration, Instant},
};
use util::ResultExt;
action!(Split, SplitDirection);
@ -104,6 +110,7 @@ impl Default for NavigationMode {
struct NavigationEntry {
item_view: Box<dyn WeakItemViewHandle>,
data: Option<Box<dyn Any>>,
insertion_time: Option<Instant>,
}
impl Pane {
@ -551,9 +558,20 @@ impl Navigation {
let mut state = self.0.borrow_mut();
match state.mode {
NavigationMode::Normal => {
let mut insertion_time = Instant::now();
if let Some(prev_insertion_time) =
state.backward_stack.last().and_then(|e| e.insertion_time)
{
if insertion_time.duration_since(prev_insertion_time) <= Duration::from_secs(2)
{
state.backward_stack.pop();
insertion_time = prev_insertion_time;
}
}
state.backward_stack.push(NavigationEntry {
item_view: Box::new(cx.weak_handle()),
data: data.map(|data| Box::new(data) as Box<dyn Any>),
insertion_time: Some(insertion_time),
});
state.forward_stack.clear();
}
@ -561,12 +579,14 @@ impl Navigation {
state.forward_stack.push(NavigationEntry {
item_view: Box::new(cx.weak_handle()),
data: data.map(|data| Box::new(data) as Box<dyn Any>),
insertion_time: None,
});
}
NavigationMode::GoingForward => {
state.backward_stack.push(NavigationEntry {
item_view: Box::new(cx.weak_handle()),
data: data.map(|data| Box::new(data) as Box<dyn Any>),
insertion_time: None,
});
}
}