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:
Michael Davis 2024-03-26 15:13:51 -04:00
parent 6492f17e7d
commit 6ccbfe9bdf
No known key found for this signature in database
4 changed files with 23 additions and 6 deletions

View File

@ -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;

View File

@ -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();
}
}

View File

@ -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,
}
}

View File

@ -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.
});
})
}