1use bitflags::bitflags;
4use crossbeam_channel::{Receiver, Sender};
5use tuikit::key::Key;
6
7pub type EventReceiver = Receiver<(Key, Event)>;
8pub type EventSender = Sender<(Key, Event)>;
9
10#[derive(Debug, Clone, Hash, PartialEq, Eq)]
11pub enum Event {
12 EvInputKey(Key),
13 EvInputInvalid,
14 EvHeartBeat,
15
16 EvActAbort,
18 EvActAccept(Option<String>),
19 EvActAddChar(char),
20 EvActAppendAndSelect,
21 EvActBackwardChar,
22 EvActBackwardDeleteChar,
23 EvActBackwardKillWord,
24 EvActBackwardWord,
25 EvActBeginningOfLine,
26 EvActCancel,
27 EvActClearScreen,
28 EvActDeleteChar,
29 EvActDeleteCharEOF,
30 EvActDeselectAll,
31 EvActDown(i32),
32 EvActEndOfLine,
33 EvActExecute(String),
34 EvActExecuteSilent(String),
35 EvActForwardChar,
36 EvActForwardWord,
37 EvActIfQueryEmpty(String),
38 EvActIfQueryNotEmpty(String),
39 EvActIfNonMatched(String),
40 EvActIgnore,
41 EvActKillLine,
42 EvActKillWord,
43 EvActNextHistory,
44 EvActHalfPageDown(i32),
45 EvActHalfPageUp(i32),
46 EvActPageDown(i32),
47 EvActPageUp(i32),
48 EvActPreviewUp(i32),
49 EvActPreviewDown(i32),
50 EvActPreviewLeft(i32),
51 EvActPreviewRight(i32),
52 EvActPreviewPageUp(i32),
53 EvActPreviewPageDown(i32),
54 EvActPreviousHistory,
55 EvActRedraw,
56 EvActRefreshCmd,
57 EvActRefreshPreview,
58 EvActRotateMode,
59 EvActScrollLeft(i32),
60 EvActScrollRight(i32),
61 EvActSelectAll,
62 EvActSelectRow(usize),
63 EvActToggle,
64 EvActToggleAll,
65 EvActToggleIn,
66 EvActToggleInteractive,
67 EvActToggleOut,
68 EvActTogglePreview,
69 EvActTogglePreviewWrap,
70 EvActToggleSort,
71 EvActUnixLineDiscard,
72 EvActUnixWordRubout,
73 EvActUp(i32),
74 EvActYank,
75
76 #[doc(hidden)]
77 __Nonexhaustive,
78}
79
80bitflags! {
81 pub struct UpdateScreen: u8 {
83 const REDRAW = 0b0000_0000;
84 const DONT_REDRAW = 0b0000_0010;
85 }
86}
87
88pub trait EventHandler {
89 fn handle(&mut self, event: &Event) -> UpdateScreen;
91}
92
93#[rustfmt::skip]
94pub fn parse_event(action: &str, arg: Option<String>) -> Option<Event> {
95 match action {
96 "abort" => Some(Event::EvActAbort),
97 "accept" => Some(Event::EvActAccept(arg)),
98 "append-and-select" => Some(Event::EvActAppendAndSelect),
99 "backward-char" => Some(Event::EvActBackwardChar),
100 "backward-delete-char" => Some(Event::EvActBackwardDeleteChar),
101 "backward-kill-word" => Some(Event::EvActBackwardKillWord),
102 "backward-word" => Some(Event::EvActBackwardWord),
103 "beginning-of-line" => Some(Event::EvActBeginningOfLine),
104 "cancel" => Some(Event::EvActCancel),
105 "clear-screen" => Some(Event::EvActClearScreen),
106 "delete-char" => Some(Event::EvActDeleteChar),
107 "delete-charEOF" => Some(Event::EvActDeleteCharEOF),
108 "deselect-all" => Some(Event::EvActDeselectAll),
109 "down" => Some(Event::EvActDown(arg.and_then(|s|s.parse().ok()).unwrap_or(1))),
110 "end-of-line" => Some(Event::EvActEndOfLine),
111 "execute" => Some(Event::EvActExecute(arg.expect("execute event should have argument"))),
112 "execute-silent" => Some(Event::EvActExecuteSilent(arg.expect("execute-silent event should have argument"))),
113 "forward-char" => Some(Event::EvActForwardChar),
114 "forward-word" => Some(Event::EvActForwardWord),
115 "if-non-matched" => Some(Event::EvActIfNonMatched(arg.expect("no arg specified for event if-non-matched"))),
116 "if-query-empty" => Some(Event::EvActIfQueryEmpty(arg.expect("no arg specified for event if-query-empty"))),
117 "if-query-not-empty" => Some(Event::EvActIfQueryNotEmpty(arg.expect("no arg specified for event if-query-not-empty"))),
118 "ignore" => Some(Event::EvActIgnore),
119 "kill-line" => Some(Event::EvActKillLine),
120 "kill-word" => Some(Event::EvActKillWord),
121 "next-history" => Some(Event::EvActNextHistory),
122 "half-page-down" => Some(Event::EvActHalfPageDown(arg.and_then(|s|s.parse().ok()).unwrap_or(1))),
123 "half-page-up" => Some(Event::EvActHalfPageUp(arg.and_then(|s|s.parse().ok()).unwrap_or(1))),
124 "page-down" => Some(Event::EvActPageDown(arg.and_then(|s|s.parse().ok()).unwrap_or(1))),
125 "page-up" => Some(Event::EvActPageUp(arg.and_then(|s|s.parse().ok()).unwrap_or(1))),
126 "preview-up" => Some(Event::EvActPreviewUp(arg.and_then(|s|s.parse().ok()).unwrap_or(1))),
127 "preview-down" => Some(Event::EvActPreviewDown(arg.and_then(|s|s.parse().ok()).unwrap_or(1))),
128 "preview-left" => Some(Event::EvActPreviewLeft(arg.and_then(|s|s.parse().ok()).unwrap_or(1))),
129 "preview-right" => Some(Event::EvActPreviewRight(arg.and_then(|s|s.parse().ok()).unwrap_or(1))),
130 "preview-page-up" => Some(Event::EvActPreviewPageUp(arg.and_then(|s|s.parse().ok()).unwrap_or(1))),
131 "preview-page-down" => Some(Event::EvActPreviewPageDown(arg.and_then(|s|s.parse().ok()).unwrap_or(1))),
132 "previous-history" => Some(Event::EvActPreviousHistory),
133 "refresh-cmd" => Some(Event::EvActRefreshCmd),
134 "refresh-preview" => Some(Event::EvActRefreshPreview),
135 "scroll-left" => Some(Event::EvActScrollLeft(arg.and_then(|s|s.parse().ok()).unwrap_or(1))),
136 "scroll-right" => Some(Event::EvActScrollRight(arg.and_then(|s|s.parse().ok()).unwrap_or(1))),
137 "select-all" => Some(Event::EvActSelectAll),
138 "toggle" => Some(Event::EvActToggle),
139 "toggle-all" => Some(Event::EvActToggleAll),
140 "toggle-in" => Some(Event::EvActToggleIn),
141 "toggle-interactive" => Some(Event::EvActToggleInteractive),
142 "toggle-out" => Some(Event::EvActToggleOut),
143 "toggle-preview" => Some(Event::EvActTogglePreview),
144 "toggle-preview-wrap" => Some(Event::EvActTogglePreviewWrap),
145 "toggle-sort" => Some(Event::EvActToggleSort),
146 "unix-line-discard" => Some(Event::EvActUnixLineDiscard),
147 "unix-word-rubout" => Some(Event::EvActUnixWordRubout),
148 "up" => Some(Event::EvActUp(arg.and_then(|s|s.parse().ok()).unwrap_or(1))),
149 "yank" => Some(Event::EvActYank),
150 _ => None
151 }
152}