use crate::event::{KeyModifiers, UiEvent, UiEventKind, UiKey};
pub fn paste_text_event(mut event: UiEvent, text: impl Into<String>) -> UiEvent {
event.kind = UiEventKind::TextInput;
event.key_press = None;
event.text = Some(text.into());
event.modifiers = KeyModifiers::default();
event.click_count = 0;
event
}
pub fn delete_selection_event(mut event: UiEvent) -> UiEvent {
event.modifiers = KeyModifiers::default();
if let Some(key_press) = event.key_press.as_mut() {
key_press.key = UiKey::Delete;
key_press.modifiers = KeyModifiers::default();
key_press.repeat = false;
}
event
}
#[cfg(test)]
mod tests {
use super::*;
use crate::KeyPress;
fn key_event() -> UiEvent {
UiEvent {
key: Some("field".into()),
target: None,
pointer: None,
key_press: Some(KeyPress {
key: UiKey::Character("v".into()),
modifiers: KeyModifiers {
ctrl: true,
..Default::default()
},
repeat: true,
}),
text: None,
selection: None,
modifiers: KeyModifiers {
ctrl: true,
..Default::default()
},
click_count: 0,
path: None,
pointer_kind: None,
kind: UiEventKind::KeyDown,
}
}
#[test]
fn paste_text_event_rewrites_key_event_to_plain_text_input() {
let event = paste_text_event(key_event(), "hello");
assert_eq!(event.kind, UiEventKind::TextInput);
assert_eq!(event.text.as_deref(), Some("hello"));
assert!(event.key_press.is_none());
assert_eq!(event.modifiers, KeyModifiers::default());
assert_eq!(event.route(), Some("field"));
}
#[test]
fn delete_selection_event_rewrites_key_to_forward_delete() {
let event = delete_selection_event(key_event());
let key_press = event.key_press.expect("key press");
assert_eq!(key_press.key, UiKey::Delete);
assert_eq!(key_press.modifiers, KeyModifiers::default());
assert!(!key_press.repeat);
assert_eq!(event.modifiers, KeyModifiers::default());
}
}