orbital_base_components/form/listbox/
utils.rs1use leptos::ev;
2
3pub fn get_dropdown_action_from_key(
4 e: &ev::KeyboardEvent,
5 open: bool,
6 multiselect: bool,
7) -> DropdownAction {
8 let key = e.key();
9 let code = e.code();
10 let alt_key = e.alt_key();
11 let ctrl_key = e.ctrl_key();
12 let meta_key = e.meta_key();
13
14 if key.len() == 1 && KeyboardKey::Space != code && !alt_key && !ctrl_key && !meta_key {
15 DropdownAction::Type
16 } else if !open {
17 if KeyboardKey::ArrowDown == code
18 || KeyboardKey::ArrowUp == code
19 || KeyboardKey::Enter == code
20 || KeyboardKey::Space == code
21 {
22 DropdownAction::Open
23 } else {
24 DropdownAction::None
25 }
26 } else if (KeyboardKey::ArrowUp == code && alt_key)
27 || KeyboardKey::Enter == code
28 || (!multiselect && KeyboardKey::Space == code)
29 {
30 DropdownAction::CloseSelect
31 } else if multiselect && KeyboardKey::Space == code {
32 DropdownAction::Select
33 } else if KeyboardKey::Escape == code {
34 DropdownAction::Close
35 } else if KeyboardKey::ArrowDown == code {
36 DropdownAction::Next
37 } else if KeyboardKey::ArrowUp == code {
38 DropdownAction::Previous
39 } else if KeyboardKey::Home == code {
40 DropdownAction::First
41 } else if KeyboardKey::End == code {
42 DropdownAction::Last
43 } else if KeyboardKey::PageUp == code {
44 DropdownAction::PageUp
45 } else if KeyboardKey::PageDown == code {
46 DropdownAction::PageDown
47 } else if KeyboardKey::Tab == code {
48 DropdownAction::Tab
49 } else {
50 DropdownAction::None
51 }
52}
53
54#[derive(PartialEq)]
55pub enum DropdownAction {
56 None,
57 Type,
58 Open,
59 CloseSelect,
60 Select,
61 Close,
62 Next,
63 Previous,
64 First,
65 Last,
66 PageUp,
67 PageDown,
68 Tab,
69}
70
71enum KeyboardKey {
72 ArrowDown,
73 ArrowUp,
74 Enter,
75 Space,
76 Escape,
77 Home,
78 End,
79 PageUp,
80 PageDown,
81 Tab,
82}
83
84impl PartialEq<String> for KeyboardKey {
85 fn eq(&self, other: &String) -> bool {
86 match self {
87 Self::ArrowDown => other == "ArrowDown",
88 Self::ArrowUp => other == "ArrowUp",
89 Self::Enter => other == "Enter",
90 Self::Space => other == "Space",
91 Self::Escape => other == "Escape",
92 Self::Home => other == "Home",
93 Self::End => other == "End",
94 Self::PageUp => other == "PageUp",
95 Self::PageDown => other == "PageDown",
96 Self::Tab => other == "Tab",
97 }
98 }
99}