skim/
event.rs

1// All the events that will be used
2
3use 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    // user bind actions
17    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    /// `Effect` is the effect of a text
82    pub struct UpdateScreen: u8 {
83        const REDRAW = 0b0000_0000;
84        const DONT_REDRAW = 0b0000_0010;
85    }
86}
87
88pub trait EventHandler {
89    /// handle event, return whether
90    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}