add DocumentFocusLost event

This commit is contained in:
Pascal Kuthe 2024-03-03 23:20:30 +01:00 committed by Michael Davis
parent 5537e68b5e
commit 609c29bf7e
No known key found for this signature in database
3 changed files with 30 additions and 7 deletions

View File

@ -1,6 +1,8 @@
use helix_event::{events, register_event}; use helix_event::{events, register_event};
use helix_view::document::Mode; use helix_view::document::Mode;
use helix_view::events::{DiagnosticsDidChange, DocumentDidChange, SelectionDidChange}; use helix_view::events::{
DiagnosticsDidChange, DocumentDidChange, DocumentFocusLost, SelectionDidChange,
};
use crate::commands; use crate::commands;
use crate::keymap::MappableCommand; use crate::keymap::MappableCommand;
@ -16,6 +18,7 @@ pub fn register() {
register_event::<PostInsertChar>(); register_event::<PostInsertChar>();
register_event::<PostCommand>(); register_event::<PostCommand>();
register_event::<DocumentDidChange>(); register_event::<DocumentDidChange>();
register_event::<DocumentFocusLost>();
register_event::<SelectionDidChange>(); register_event::<SelectionDidChange>();
register_event::<DiagnosticsDidChange>(); register_event::<DiagnosticsDidChange>();
} }

View File

@ -4,6 +4,7 @@
document::{ document::{
DocumentOpenError, DocumentSavedEventFuture, DocumentSavedEventResult, Mode, SavePoint, DocumentOpenError, DocumentSavedEventFuture, DocumentSavedEventResult, Mode, SavePoint,
}, },
events::DocumentFocusLost,
graphics::{CursorKind, Rect}, graphics::{CursorKind, Rect},
handlers::Handlers, handlers::Handlers,
info::Info, info::Info,
@ -14,6 +15,7 @@
Document, DocumentId, View, ViewId, Document, DocumentId, View, ViewId,
}; };
use dap::StackFrame; use dap::StackFrame;
use helix_event::dispatch;
use helix_vcs::DiffProviderRegistry; use helix_vcs::DiffProviderRegistry;
use futures_util::stream::select_all::SelectAll; use futures_util::stream::select_all::SelectAll;
@ -1590,7 +1592,7 @@ pub fn switch(&mut self, id: DocumentId, action: Action) {
self.enter_normal_mode(); self.enter_normal_mode();
} }
match action { let focust_lost = match action {
Action::Replace => { Action::Replace => {
let (view, doc) = current_ref!(self); let (view, doc) = current_ref!(self);
// If the current view is an empty scratch buffer and is not displayed in any other views, delete it. // If the current view is an empty scratch buffer and is not displayed in any other views, delete it.
@ -1640,6 +1642,10 @@ pub fn switch(&mut self, id: DocumentId, action: Action) {
self.replace_document_in_view(view_id, id); self.replace_document_in_view(view_id, id);
dispatch(DocumentFocusLost {
editor: self,
doc: id,
});
return; return;
} }
Action::Load => { Action::Load => {
@ -1650,6 +1656,7 @@ pub fn switch(&mut self, id: DocumentId, action: Action) {
return; return;
} }
Action::HorizontalSplit | Action::VerticalSplit => { Action::HorizontalSplit | Action::VerticalSplit => {
let focus_lost = self.tree.try_get(self.tree.focus).map(|view| view.doc);
// copy the current view, unless there is no view yet // copy the current view, unless there is no view yet
let view = self let view = self
.tree .tree
@ -1669,10 +1676,17 @@ pub fn switch(&mut self, id: DocumentId, action: Action) {
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(); doc.mark_as_focused();
focus_lost
} }
} };
self._refresh(); self._refresh();
if let Some(focus_lost) = focust_lost {
dispatch(DocumentFocusLost {
editor: self,
doc: focus_lost,
});
}
} }
/// Generate an id for a new document and register it. /// Generate an id for a new document and register it.
@ -1903,11 +1917,15 @@ pub fn focus(&mut self, view_id: ViewId) {
let doc = doc_mut!(self, &view.doc); let doc = doc_mut!(self, &view.doc);
view.sync_changes(doc); view.sync_changes(doc);
} }
}
let view = view!(self, view_id); let view = view!(self, view_id);
let doc = doc_mut!(self, &view.doc); let doc = doc_mut!(self, &view.doc);
doc.mark_as_focused(); doc.mark_as_focused();
let focus_lost = self.tree.get(prev_id).doc;
dispatch(DocumentFocusLost {
editor: self,
doc: focus_lost,
});
}
} }
pub fn focus_next(&mut self) { pub fn focus_next(&mut self) {

View File

@ -13,4 +13,6 @@
} }
SelectionDidChange<'a> { doc: &'a mut Document, view: ViewId } SelectionDidChange<'a> { doc: &'a mut Document, view: ViewId }
DiagnosticsDidChange<'a> { editor: &'a mut Editor, doc: DocumentId } DiagnosticsDidChange<'a> { editor: &'a mut Editor, doc: DocumentId }
// called **after** a document loses focus (but not when its closed)
DocumentFocusLost<'a> { editor: &'a mut Editor, doc: DocumentId }
} }