fresh/view/popup/input/
base.rs1use crate::input::handler::{DeferredAction, InputContext, InputResult};
10use crate::view::popup::Popup;
11use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
12
13pub enum SharedHandleResult {
15 Handled(InputResult),
17 NotHandled,
19}
20
21pub fn try_handle_shared(
23 event: &KeyEvent,
24 popup: Option<&mut Popup>,
25 ctx: &mut InputContext,
26) -> SharedHandleResult {
27 match event.code {
28 KeyCode::Esc => {
30 ctx.defer(DeferredAction::ClosePopup);
31 SharedHandleResult::Handled(InputResult::Consumed)
32 }
33
34 KeyCode::PageUp => {
36 if let Some(p) = popup {
37 p.page_up();
38 }
39 SharedHandleResult::Handled(InputResult::Consumed)
40 }
41 KeyCode::PageDown => {
42 if let Some(p) = popup {
43 p.page_down();
44 }
45 SharedHandleResult::Handled(InputResult::Consumed)
46 }
47 KeyCode::Home => {
48 if let Some(p) = popup {
49 p.select_first();
50 }
51 SharedHandleResult::Handled(InputResult::Consumed)
52 }
53 KeyCode::End => {
54 if let Some(p) = popup {
55 p.select_last();
56 }
57 SharedHandleResult::Handled(InputResult::Consumed)
58 }
59
60 KeyCode::Char('c') if event.modifiers == KeyModifiers::CONTROL => {
62 if let Some(p) = popup {
63 if p.has_selection() {
64 if let Some(text) = p.get_selected_text() {
65 ctx.defer(DeferredAction::CopyToClipboard(text));
66 }
67 }
68 }
69 SharedHandleResult::Handled(InputResult::Consumed)
70 }
71
72 _ => SharedHandleResult::NotHandled,
73 }
74}
75
76pub fn handle_list_navigation(event: &KeyEvent, popup: Option<&mut Popup>) -> Option<InputResult> {
78 match event.code {
79 KeyCode::Up if event.modifiers.is_empty() => {
80 if let Some(p) = popup {
81 p.select_prev();
82 }
83 Some(InputResult::Consumed)
84 }
85 KeyCode::Down if event.modifiers.is_empty() => {
86 if let Some(p) = popup {
87 p.select_next();
88 }
89 Some(InputResult::Consumed)
90 }
91 _ => None,
92 }
93}