remy_widgets/widgets/text_input/
input.rs1use crate::events::{Event, Key};
2use crate::widgets::core::RemyWidgetCommandConverter;
3use crate::widgets::text_field::{DefaultTextFieldInputConverter, TextFieldState};
4use crate::widgets::util::cursor::{TypingBehaviour, UserAction};
5use super::state::TextInputState;
6
7
8#[derive(Clone, Copy, Debug, PartialEq, Eq)]
9pub enum TextInputAction {
10 Esc,
11 Enter,
12 Other(UserAction),
13 Null
14}
15
16impl From<TextInputAction> for UserAction {
17 fn from(value: TextInputAction) -> Self {
18 match value {
19 TextInputAction::Esc => UserAction::Null,
20 TextInputAction::Enter => UserAction::Null,
21 TextInputAction::Other(inner) => inner,
22 TextInputAction::Null => UserAction::Null
23 }
24 }
25}
26
27
28pub struct DefaultTextInputInputConverter;
29
30
31impl<T> RemyWidgetCommandConverter<TextInputState<T>> for DefaultTextInputInputConverter
32where
33 T: TypingBehaviour,
34{
35 type Event = TextInputAction;
36
37 fn convert(event: Event, state: &TextInputState<T>) -> Option<Self::Event> {
38 match event {
39 Event::KeyPress { key, .. } => {
40 match key {
41 Key::Esc => Some(TextInputAction::Esc),
42 Key::Enter => Some(TextInputAction::Enter),
43 _ => match <DefaultTextFieldInputConverter as RemyWidgetCommandConverter<TextFieldState<T>>>::convert(event, &state.0) {
44 None => None,
45 Some(a) => Some(TextInputAction::Other(a))
46 }
47 }
48 }
49 Event::Null => None
50 }
51 }
52}