on master help sign in
DynamicPicker: Use idle-timeout as debounce
a7daa02Michael Davis
helix-term/src/ui/picker.rs+5−2
@@ -763,6 +763,7 @@ pub type DynQueryCallback<T> =
763pub struct DynamicPicker<T: ui::menu::Item + Send> {
763pub struct DynamicPicker<T: ui::menu::Item + Send> {
764 file_picker: FilePicker<T>,
764 file_picker: FilePicker<T>,
765 query_callback: DynQueryCallback<T>,
765 query_callback: DynQueryCallback<T>,
766+ query: String,
766}
767}
767
768
768impl<T: ui::menu::Item + Send> DynamicPicker<T> {
769impl<T: ui::menu::Item + Send> DynamicPicker<T> {
@@ -772,6 +773,7 @@ impl<T: ui::menu::Item + Send> DynamicPicker<T> {
772 Self {
773 Self {
773 file_picker,
774 file_picker,
774 query_callback,
775 query_callback,
776+ query: String::new(),
775 }
777 }
776 }
778 }
777}
779}
@@ -782,14 +784,15 @@ impl<T: Item + Send + 'static> Component for DynamicPicker<T> {
782 }
784 }
783
785
784 fn handle_event(&mut self, event: &Event, cx: &mut Context) -> EventResult {
786 fn handle_event(&mut self, event: &Event, cx: &mut Context) -> EventResult {
785− let prev_query = self.file_picker.picker.prompt.line().to_owned();
786 let event_result = self.file_picker.handle_event(event, cx);
787 let event_result = self.file_picker.handle_event(event, cx);
787 let current_query = self.file_picker.picker.prompt.line();
788 let current_query = self.file_picker.picker.prompt.line();
788
789
789− if *current_query == prev_query || matches!(event_result, EventResult::Ignored(_)) {
790+ if !matches!(event, Event::IdleTimeout) || self.query == *current_query {
790 return event_result;
791 return event_result;
791 }
792 }
792
793
794+ self.query.clone_from(current_query);
795+
793 let new_options = (self.query_callback)(current_query.to_owned(), cx.editor);
796 let new_options = (self.query_callback)(current_query.to_owned(), cx.editor);
794
797
795 cx.jobs.callback(async move {
798 cx.jobs.callback(async move {