mirror of
https://github.com/helix-editor/helix.git
synced 2024-11-22 01:16:18 +04:00
Request a UI redraw on Drop of an Injector
This fixes the changed files picker when used against a clean worktree for example. Without it the running indicator does not disappear. It also simplifies the dynamic query handler's implementation so that it doesn't need to request a redraw explicitly. Co-authored-by: Pascal Kuthe <pascalkuthe@pm.me>
This commit is contained in:
parent
6492f17e7d
commit
6ccbfe9bdf
@ -34,7 +34,9 @@
|
||||
use anyhow::Result;
|
||||
pub use cancel::{cancelable_future, cancelation, CancelRx, CancelTx};
|
||||
pub use debounce::{send_blocking, AsyncHook};
|
||||
pub use redraw::{lock_frame, redraw_requested, request_redraw, start_frame, RenderLockGuard};
|
||||
pub use redraw::{
|
||||
lock_frame, redraw_requested, request_redraw, start_frame, RenderLockGuard, RequestRedrawOnDrop,
|
||||
};
|
||||
pub use registry::Event;
|
||||
|
||||
mod cancel;
|
||||
|
@ -51,3 +51,12 @@ pub fn start_frame() {
|
||||
pub fn lock_frame() -> RenderLockGuard {
|
||||
RENDER_LOCK.read()
|
||||
}
|
||||
|
||||
/// A zero sized type that requests a redraw via [request_redraw] when the type [Drop]s.
|
||||
pub struct RequestRedrawOnDrop;
|
||||
|
||||
impl Drop for RequestRedrawOnDrop {
|
||||
fn drop(&mut self) {
|
||||
request_redraw();
|
||||
}
|
||||
}
|
||||
|
@ -153,6 +153,12 @@ pub struct Injector<T, D> {
|
||||
editor_data: Arc<D>,
|
||||
version: usize,
|
||||
picker_version: Arc<AtomicUsize>,
|
||||
/// A marker that requests a redraw when the injector drops.
|
||||
/// This marker causes the "running" indicator to disappear when a background job
|
||||
/// providing items is finished and drops. This could be wrapped in an [Arc] to ensure
|
||||
/// that the redraw is only requested when all Injectors drop for a Picker (which removes
|
||||
/// the "running" indicator) but the redraw handle is debounced so this is unnecessary.
|
||||
_redraw: helix_event::RequestRedrawOnDrop,
|
||||
}
|
||||
|
||||
impl<I, D> Clone for Injector<I, D> {
|
||||
@ -163,6 +169,7 @@ fn clone(&self) -> Self {
|
||||
editor_data: self.editor_data.clone(),
|
||||
version: self.version,
|
||||
picker_version: self.picker_version.clone(),
|
||||
_redraw: helix_event::RequestRedrawOnDrop,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -284,6 +291,7 @@ pub fn stream(columns: Vec<Column<T, D>>, editor_data: D) -> (Nucleo<T>, Injecto
|
||||
editor_data: Arc::new(editor_data),
|
||||
version: 0,
|
||||
picker_version: Arc::new(AtomicUsize::new(0)),
|
||||
_redraw: helix_event::RequestRedrawOnDrop,
|
||||
};
|
||||
(matcher, streamer)
|
||||
}
|
||||
@ -386,6 +394,7 @@ pub fn injector(&self) -> Injector<T, D> {
|
||||
editor_data: self.editor_data.clone(),
|
||||
version: self.version.load(atomic::Ordering::Relaxed),
|
||||
picker_version: self.version.clone(),
|
||||
_redraw: helix_event::RequestRedrawOnDrop,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -174,11 +174,8 @@ fn finish_debounce(&mut self) {
|
||||
if let Err(err) = get_options.await {
|
||||
log::info!("Dynamic request failed: {err}");
|
||||
}
|
||||
// The picker's shows its running indicator when there are any active
|
||||
// injectors. When we're done injecting new options, drop the injector
|
||||
// and request a redraw to remove the running indicator.
|
||||
drop(injector);
|
||||
helix_event::request_redraw();
|
||||
// NOTE: the Drop implementation of Injector will request a redraw when the
|
||||
// injector falls out of scope here, clearing the "running" indicator.
|
||||
});
|
||||
})
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user