smart_keymap/key/composite/
layered.rs1use core::fmt::Debug;
2
3#[cfg(feature = "std")]
4use serde::Deserialize;
5
6use crate::key;
7
8use super::BaseKey;
9use super::{Context, Event, KeyState, PendingKeyState, PressedKeyResult};
10use super::{TapHold, TapHoldKey, TapHoldNestable};
11
12pub trait LayeredNestable:
14 key::Key<
15 Context = Context,
16 Event = Event,
17 KeyState = KeyState,
18 PendingKeyState = PendingKeyState,
19 > + Copy
20 + PartialEq
21{
22}
23
24impl<K: TapHoldNestable> LayeredNestable for TapHold<K> {}
25impl<K: TapHoldNestable> LayeredNestable for TapHoldKey<K> {}
26
27#[derive(Debug, Clone, Copy, PartialEq)]
29#[cfg_attr(feature = "std", derive(Deserialize))]
30#[cfg_attr(feature = "std", serde(untagged))]
31pub enum LayeredKey<K: LayeredNestable> {
32 Layered(key::layered::LayeredKey<K>),
34 Pass(K),
36}
37
38#[derive(Debug, Clone, Copy, PartialEq)]
40pub struct Layered<K: LayeredNestable>(pub K);
41
42impl<K: LayeredNestable> key::Key for LayeredKey<K> {
43 type Context = Context;
44 type Event = Event;
45 type PendingKeyState = PendingKeyState;
46 type KeyState = KeyState;
47
48 fn new_pressed_key(
49 &self,
50 context: &Self::Context,
51 key_path: key::KeyPath,
52 ) -> (PressedKeyResult, key::KeyEvents<Self::Event>) {
53 match self {
54 LayeredKey::Layered(key) => key.new_pressed_key(context, key_path),
55 LayeredKey::Pass(key) => key.new_pressed_key(context, key_path),
56 }
57 }
58
59 fn handle_event(
60 &self,
61 pending_state: &mut Self::PendingKeyState,
62 context: &Self::Context,
63 key_path: key::KeyPath,
64 event: key::Event<Self::Event>,
65 ) -> (Option<key::NewPressedKey>, key::KeyEvents<Self::Event>) {
66 match self {
67 LayeredKey::Layered(key) => key.handle_event(pending_state, context, key_path, event),
68 LayeredKey::Pass(key) => key.handle_event(pending_state, context, key_path, event),
69 }
70 }
71
72 fn lookup(
73 &self,
74 path: &[u16],
75 ) -> &dyn key::Key<
76 Context = Self::Context,
77 Event = Self::Event,
78 PendingKeyState = Self::PendingKeyState,
79 KeyState = Self::KeyState,
80 > {
81 match self {
82 LayeredKey::Layered(key) => key.lookup(path),
83 LayeredKey::Pass(key) => key.lookup(path),
84 }
85 }
86}
87
88impl<K: LayeredNestable> key::Key for Layered<K> {
89 type Context = Context;
90 type Event = Event;
91 type PendingKeyState = PendingKeyState;
92 type KeyState = KeyState;
93
94 fn new_pressed_key(
95 &self,
96 context: &Self::Context,
97 key_path: key::KeyPath,
98 ) -> (PressedKeyResult, key::KeyEvents<Self::Event>) {
99 let Layered(key) = self;
100 key.new_pressed_key(context, key_path)
101 }
102
103 fn handle_event(
104 &self,
105 pending_state: &mut Self::PendingKeyState,
106 context: &Self::Context,
107 key_path: key::KeyPath,
108 event: key::Event<Self::Event>,
109 ) -> (Option<key::NewPressedKey>, key::KeyEvents<Self::Event>) {
110 let Layered(key) = self;
111 key.handle_event(pending_state, context, key_path, event)
112 }
113
114 fn lookup(
115 &self,
116 path: &[u16],
117 ) -> &dyn key::Key<
118 Context = Self::Context,
119 Event = Self::Event,
120 PendingKeyState = Self::PendingKeyState,
121 KeyState = Self::KeyState,
122 > {
123 let Layered(key) = self;
124 key.lookup(path)
125 }
126}
127
128impl LayeredKey<TapHoldKey<BaseKey>> {
129 pub const fn keyboard(key: key::keyboard::Key) -> Self {
131 Self::Pass(TapHoldKey::keyboard(key))
132 }
133
134 pub const fn tap_hold(key: key::tap_hold::Key<BaseKey>) -> Self {
136 Self::Pass(TapHoldKey::tap_hold(key))
137 }
138
139 pub const fn layer_modifier(key: key::layered::ModifierKey) -> Self {
141 Self::Pass(TapHoldKey::layer_modifier(key))
142 }
143}
144
145impl<K: LayeredNestable> LayeredKey<K> {
146 pub const fn layered(key: key::layered::LayeredKey<K>) -> Self {
148 Self::Layered(key)
149 }
150}
151
152impl Layered<TapHold<key::keyboard::Key>> {
153 pub const fn keyboard(key: key::keyboard::Key) -> Self {
155 Self(TapHold(key))
156 }
157}
158
159impl Layered<TapHoldKey<key::keyboard::Key>> {
160 pub const fn tap_hold(key: key::tap_hold::Key<key::keyboard::Key>) -> Self {
162 Self(TapHoldKey::TapHold(key))
163 }
164}