gpui: Input example log keystrokes (#13963)

Release Notes:

- N/A
This commit is contained in:
Conrad Irwin 2024-07-09 08:33:29 -06:00 committed by GitHub
parent 23c84f8dc0
commit bc0359a474
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -451,6 +451,7 @@ impl Render for TextInput {
.flex()
.key_context("TextInput")
.track_focus(&self.focus_handle)
.cursor(CursorStyle::IBeam)
.on_action(cx.listener(Self::backspace))
.on_action(cx.listener(Self::delete))
.on_action(cx.listener(Self::left))
@ -482,6 +483,39 @@ impl Render for TextInput {
}
}
impl FocusableView for TextInput {
fn focus_handle(&self, _: &AppContext) -> FocusHandle {
self.focus_handle.clone()
}
}
struct InputExample {
text_input: View<TextInput>,
recent_keystrokes: Vec<Keystroke>,
}
impl Render for InputExample {
fn render(&mut self, _: &mut ViewContext<Self>) -> impl IntoElement {
div()
.bg(rgb(0xaaaaaa))
.flex()
.flex_col()
.size_full()
.child(self.text_input.clone())
.children(self.recent_keystrokes.iter().rev().map(|ks| {
format!(
"{:} {}",
ks,
if let Some(ime_key) = ks.ime_key.as_ref() {
format!("-> {}", ime_key)
} else {
"".to_owned()
}
)
}))
}
}
fn main() {
App::new().run(|cx: &mut AppContext| {
let bounds = Bounds::centered(None, size(px(300.0), px(300.0)), cx);
@ -504,7 +538,7 @@ fn main() {
..Default::default()
},
|cx| {
cx.new_view(|cx| TextInput {
let text_input = cx.new_view(|cx| TextInput {
focus_handle: cx.focus_handle(),
content: "".into(),
selected_range: 0..0,
@ -513,14 +547,27 @@ fn main() {
last_layout: None,
last_bounds: None,
is_selecting: false,
});
cx.new_view(|_| InputExample {
text_input,
recent_keystrokes: vec![],
})
},
)
.unwrap();
cx.observe_keystrokes(move |ev, cx| {
window
.update(cx, |view, cx| {
view.recent_keystrokes.push(ev.keystroke.clone());
cx.notify();
})
.unwrap();
})
.detach();
window
.update(cx, |view, cx| {
view.focus_handle.focus(cx);
cx.activate(true)
cx.focus_view(&view.text_input);
cx.activate(true);
})
.unwrap();
});