ime for text input
This commit is contained in:
parent
a2b086a779
commit
5f89601ef2
10 changed files with 784 additions and 48 deletions
|
|
@ -64,7 +64,6 @@ pub fn MouseArea() -> Element {
|
|||
});
|
||||
|
||||
let key_down_handler = use_callback(move |evt: Event<KeyboardData>| {
|
||||
tracing::info!("Keydown");
|
||||
spawn(async move {
|
||||
_ = socket
|
||||
.send(ClientEvent::KeyEvent {
|
||||
|
|
@ -75,12 +74,49 @@ pub fn MouseArea() -> Element {
|
|||
});
|
||||
});
|
||||
|
||||
let key_up_handler = use_callback(move |evt: Event<KeyboardData>| {
|
||||
// let key_up_handler = use_callback(move |evt: Event<KeyboardData>| {
|
||||
// spawn(async move {
|
||||
// _ = socket
|
||||
// .send(ClientEvent::KeyEvent {
|
||||
// key: evt.key().to_string(),
|
||||
// is_pressed: false,
|
||||
// })
|
||||
// .await;
|
||||
// });
|
||||
// });
|
||||
|
||||
let mut input_state = use_signal(String::new);
|
||||
let input_handler = use_callback(move |evt: Event<FormData>| {
|
||||
let v = evt.value();
|
||||
input_state.set(v.clone());
|
||||
|
||||
spawn(async move {
|
||||
_ = socket.send(ClientEvent::TextInputEvent { text: v }).await;
|
||||
});
|
||||
});
|
||||
let key_press_handler = use_callback(move |evt: Event<KeyboardData>| {
|
||||
if evt.key() == Key::Enter {
|
||||
spawn(async move {
|
||||
_ = socket
|
||||
.send(ClientEvent::TextInputDoneEvent {
|
||||
text: input_state.replace(String::new()),
|
||||
})
|
||||
.await;
|
||||
});
|
||||
}
|
||||
});
|
||||
let input_focus_handler = use_callback(move |evt: Event<FocusData>| {
|
||||
input_state.set(String::new());
|
||||
spawn(async move {
|
||||
_ = socket.send(ClientEvent::TextInputStartEvent).await;
|
||||
});
|
||||
});
|
||||
|
||||
let input_blur_handler = use_callback(move |evt: Event<FocusData>| {
|
||||
spawn(async move {
|
||||
_ = socket
|
||||
.send(ClientEvent::KeyEvent {
|
||||
key: evt.key().to_string(),
|
||||
is_pressed: false,
|
||||
.send(ClientEvent::TextInputDoneEvent {
|
||||
text: input_state.replace(String::new()),
|
||||
})
|
||||
.await;
|
||||
});
|
||||
|
|
@ -88,7 +124,12 @@ pub fn MouseArea() -> Element {
|
|||
|
||||
rsx! {
|
||||
div {
|
||||
input { onkeydown: key_down_handler, onkeyup: key_up_handler}
|
||||
input {
|
||||
oninput: input_handler,
|
||||
value: input_state,
|
||||
onkeypress: key_press_handler,
|
||||
onfocus: input_focus_handler,
|
||||
onblur: input_blur_handler }
|
||||
div {
|
||||
class: Styles::mouse_area,
|
||||
|
||||
|
|
@ -105,6 +146,9 @@ enum ClientEvent {
|
|||
MouseMove { dx: f64, dy: f64 },
|
||||
Click,
|
||||
KeyEvent { key: String, is_pressed: bool },
|
||||
TextInputStartEvent,
|
||||
TextInputEvent { text: String },
|
||||
TextInputDoneEvent { text: String },
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
|
|
@ -131,6 +175,15 @@ async fn mouse_move(
|
|||
ClientEvent::KeyEvent { key, is_pressed } => {
|
||||
mouse_service.key_event(key, is_pressed).await;
|
||||
},
|
||||
ClientEvent::TextInputEvent { text } => {
|
||||
mouse_service.text_input(text).await;
|
||||
},
|
||||
ClientEvent::TextInputStartEvent => {
|
||||
mouse_service.text_input_start().await;
|
||||
},
|
||||
ClientEvent::TextInputDoneEvent { text } => {
|
||||
mouse_service.text_input_end(text).await;
|
||||
},
|
||||
}
|
||||
}
|
||||
}))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue