Sort the buffer picker by most recent access (#2980)

This commit is contained in:
Evgeniy Tatarkin 2023-04-28 19:05:14 +03:00 committed by GitHub
parent 9c6c63a2be
commit 6a1bb81f10
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 30 additions and 5 deletions

View File

@ -2473,6 +2473,7 @@ fn buffer_picker(cx: &mut Context) {
path: Option<PathBuf>, path: Option<PathBuf>,
is_modified: bool, is_modified: bool,
is_current: bool, is_current: bool,
focused_at: std::time::Instant,
} }
impl ui::menu::Item for BufferMeta { impl ui::menu::Item for BufferMeta {
@ -2505,14 +2506,21 @@ fn buffer_picker(cx: &mut Context) {
path: doc.path().cloned(), path: doc.path().cloned(),
is_modified: doc.is_modified(), is_modified: doc.is_modified(),
is_current: doc.id() == current, is_current: doc.id() == current,
focused_at: doc.focused_at,
}; };
let mut items = cx
.editor
.documents
.values()
.map(|doc| new_meta(doc))
.collect::<Vec<BufferMeta>>();
// mru
items.sort_unstable_by_key(|item| std::cmp::Reverse(item.focused_at));
let picker = FilePicker::new( let picker = FilePicker::new(
cx.editor items,
.documents
.values()
.map(|doc| new_meta(doc))
.collect(),
(), (),
|cx, meta, action| { |cx, meta, action| {
cx.editor.switch(meta.id, action); cx.editor.switch(meta.id, action);

View File

@ -169,6 +169,9 @@ pub struct Document {
diff_handle: Option<DiffHandle>, diff_handle: Option<DiffHandle>,
version_control_head: Option<Arc<ArcSwap<Box<str>>>>, version_control_head: Option<Arc<ArcSwap<Box<str>>>>,
// when document was used for most-recent-used buffer picker
pub focused_at: std::time::Instant,
} }
/// Inlay hints for a single `(Document, View)` combo. /// Inlay hints for a single `(Document, View)` combo.
@ -496,6 +499,7 @@ impl Document {
diff_handle: None, diff_handle: None,
config, config,
version_control_head: None, version_control_head: None,
focused_at: std::time::Instant::now(),
} }
} }
pub fn default(config: Arc<dyn DynAccess<Config>>) -> Self { pub fn default(config: Arc<dyn DynAccess<Config>>) -> Self {
@ -908,6 +912,11 @@ impl Document {
} }
} }
/// Mark document as recent used for MRU sorting
pub fn mark_as_focused(&mut self) {
self.focused_at = std::time::Instant::now();
}
/// Remove a view's selection and inlay hints from this document. /// Remove a view's selection and inlay hints from this document.
pub fn remove_view(&mut self, view_id: ViewId) { pub fn remove_view(&mut self, view_id: ViewId) {
self.selections.remove(&view_id); self.selections.remove(&view_id);

View File

@ -1176,6 +1176,7 @@ impl Editor {
let doc = doc_mut!(self, &doc_id); let doc = doc_mut!(self, &doc_id);
doc.ensure_view_init(view.id); doc.ensure_view_init(view.id);
view.sync_changes(doc); view.sync_changes(doc);
doc.mark_as_focused();
align_view(doc, view, Align::Center); align_view(doc, view, Align::Center);
} }
@ -1246,6 +1247,7 @@ impl Editor {
let view_id = view!(self).id; let view_id = view!(self).id;
let doc = doc_mut!(self, &id); let doc = doc_mut!(self, &id);
doc.ensure_view_init(view_id); doc.ensure_view_init(view_id);
doc.mark_as_focused();
return; return;
} }
Action::HorizontalSplit | Action::VerticalSplit => { Action::HorizontalSplit | Action::VerticalSplit => {
@ -1267,6 +1269,7 @@ impl Editor {
// initialize selection for view // initialize selection for view
let doc = doc_mut!(self, &id); let doc = doc_mut!(self, &id);
doc.ensure_view_init(view_id); doc.ensure_view_init(view_id);
doc.mark_as_focused();
} }
} }
@ -1417,6 +1420,7 @@ impl Editor {
let view_id = self.tree.insert(view); let view_id = self.tree.insert(view);
let doc = doc_mut!(self, &doc_id); let doc = doc_mut!(self, &doc_id);
doc.ensure_view_init(view_id); doc.ensure_view_init(view_id);
doc.mark_as_focused();
} }
self._refresh(); self._refresh();
@ -1471,6 +1475,10 @@ impl Editor {
view.sync_changes(doc); view.sync_changes(doc);
} }
} }
let view = view!(self, view_id);
let doc = doc_mut!(self, &view.doc);
doc.mark_as_focused();
} }
pub fn focus_next(&mut self) { pub fn focus_next(&mut self) {