mirror of
https://github.com/helix-editor/helix.git
synced 2024-12-18 22:11:55 +04:00
add DocumentFocusLost event
This commit is contained in:
parent
5537e68b5e
commit
609c29bf7e
@ -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>();
|
||||||
}
|
}
|
||||||
|
@ -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 doc = doc_mut!(self, &view.doc);
|
||||||
|
doc.mark_as_focused();
|
||||||
|
let focus_lost = self.tree.get(prev_id).doc;
|
||||||
|
dispatch(DocumentFocusLost {
|
||||||
|
editor: self,
|
||||||
|
doc: focus_lost,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
||||||
|
@ -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 }
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user