Skip to main content

orbital_base_components/form/listbox/
utils.rs

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