Unnamed repository; edit this file 'description' to name the repository.
WIP explore more commands on generic types
| -rw-r--r-- | helix-term/src/ui/picker.rs | 52 |
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 |