remy_widgets/widgets/text_input/
input.rs

1use 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}