Get actions + focus working on picker, now that it's a view

Co-authored-by: Marshall <marshall@zed.dev>
This commit is contained in:
Max Brunsfeld
2023-11-07 13:48:32 -08:00
co-authored by Marshall
parent 36d9633f6f
commit ea603401e2
3 changed files with 18 additions and 14 deletions
+1 -1
View File
@@ -9186,7 +9186,7 @@ impl Editor {
// supports
// }
fn focus(&self, cx: &mut WindowContext) {
pub fn focus(&self, cx: &mut WindowContext) {
cx.focus(&self.focus_handle)
}
}
+11 -4
View File
@@ -1,7 +1,8 @@
use editor::Editor;
use gpui::{
div, uniform_list, Component, Div, ParentElement, Render, StatelessInteractive, Styled,
UniformListScrollHandle, View, ViewContext, VisualContext,
div, uniform_list, Component, Div, FocusEnabled, ParentElement, Render, StatefulInteractivity,
StatelessInteractive, Styled, UniformListScrollHandle, View, ViewContext, VisualContext,
WindowContext,
};
use std::cmp;
@@ -41,6 +42,10 @@ impl<D: PickerDelegate> Picker<D> {
}
}
pub fn focus(&self, cx: &mut WindowContext) {
self.editor.update(cx, |editor, cx| editor.focus(cx));
}
fn select_next(&mut self, _: &menu::SelectNext, cx: &mut ViewContext<Self>) {
let count = self.delegate.match_count();
if count > 0 {
@@ -91,12 +96,14 @@ impl<D: PickerDelegate> Picker<D> {
}
impl<D: PickerDelegate> Render for Picker<D> {
type Element = Div<Self>;
type Element = Div<Self, StatefulInteractivity<Self>, FocusEnabled<Self>>;
fn render(&mut self, _cx: &mut ViewContext<Self>) -> Self::Element {
div()
.size_full()
.context("picker")
.id("picker-container")
.focusable()
.size_full()
.on_action(Self::select_next)
.on_action(Self::select_prev)
.on_action(Self::select_first)
+6 -9
View File
@@ -1,13 +1,12 @@
use gpui::{
div, Component, Div, FocusHandle, KeyBinding, ParentElement, Render, SharedString,
StatelessInteractive, Styled, View, VisualContext, WindowContext,
div, Component, Div, KeyBinding, ParentElement, Render, SharedString, StatelessInteractive,
Styled, View, VisualContext, WindowContext,
};
use picker::{Picker, PickerDelegate};
use theme2::ActiveTheme;
pub struct PickerStory {
picker: View<Picker<Delegate>>,
focus_handle: FocusHandle,
}
struct Delegate {
@@ -86,13 +85,9 @@ impl PickerStory {
KeyBinding::new("ctrl-c", menu::Cancel, Some("picker")),
]);
let focus_handle = cx.focus_handle();
cx.focus(&focus_handle);
PickerStory {
focus_handle,
picker: cx.build_view(|cx| {
Picker::new(
let picker = Picker::new(
Delegate {
candidates: vec![
"Baguette (France)".into(),
@@ -148,7 +143,9 @@ impl PickerStory {
selected_ix: 0,
},
cx,
)
);
picker.focus(cx);
picker
}),
}
})