Unnamed repository; edit this file 'description' to name the repository.
WIP explore more commands on generic types
Michael Davis 2023-06-26
parent 71b6cc4 · commit 136704b
-rw-r--r--helix-term/src/ui/picker.rs52
1 files changed, 51 insertions, 1 deletions
diff --git a/helix-term/src/ui/picker.rs b/helix-term/src/ui/picker.rs
index dea2e905..e1131164 100644
--- a/helix-term/src/ui/picker.rs
+++ b/helix-term/src/ui/picker.rs
@@ -1002,7 +1002,7 @@ impl<T: Item + Send + 'static> Component for DynamicPicker<T> {
pub fn close_buffer_in_buffer_picker(
component: &mut dyn Component,
- cx: &mut compositor::Context,
+ cx: &mut Context,
) -> EventResult {
let Some(picker) = component
.as_any_mut()
@@ -1029,6 +1029,56 @@ pub fn close_buffer_in_buffer_picker(
EventResult::Consumed(None)
}
+// Above command is cool because it's for one specific picker.
+
+// This is also cool because it doesn't even need to interact with
+// the picker, so we don't need concrete types:
+
+pub fn close_picker(_component: &mut dyn Component, _cx: &mut Context) -> EventResult {
+ close_fn()
+}
+
+// Now this is a problem. It compiles ok.
+// We can probably even specify it in the default keymap:
+//
+// MappableCommand::Component { name: "..", doc: "..", fun: crate::ui::picker::to_start<PathBuf> }
+//
+// But how do we represent this in keymap config? Do we do namespacing in the
+// command names and end up with tens of commands for scrolling each picker?
+//
+// MappableCommand::Component {
+// name: "file_picker::to_start",
+// doc: "..",
+// crate::ui::picker::to_start<PathBuf>,
+// },
+// MappableCommand::Component {
+// name: "buffer_picker::to_start",
+// doc: "..",
+// crate::ui::picker::to_start<BufferMeta>,
+// },
+//
+// Can we use a macro to close over the verbose parts of this?
+//
+// Can we do something clever with a hypothetical AnyPicker interface
+// similar to AnyComponent? Will we have to do that for every Component
+// that uses generics?
+
+pub fn to_start<T: ui::menu::Item + 'static>(
+ component: &mut dyn Component,
+ _cx: &mut Context,
+) -> EventResult {
+ let Some(picker) = component
+ .as_any_mut()
+ .downcast_mut::<Picker<T>>()
+ else {
+ return EventResult::Ignored(None);
+ };
+
+ picker.cursor = 0;
+
+ EventResult::Consumed(None)
+}
+
fn close_fn() -> EventResult {
EventResult::Consumed(Some(Box::new(|compositor: &mut Compositor, _ctx| {
// remove the layer