@@ -14,20 +14,24 @@ export class MembraneKeypadElement extends LitElement {
14
14
15
15
renderKey ( text : string , x : number , y : number ) {
16
16
const keyClass = isNumeric ( text ) ? 'blue-key' : 'red-key' ;
17
+ const keyName = text . toUpperCase ( ) ;
17
18
18
19
return svg `< g
19
20
transform ="translate(${ x } ${ y } ) "
20
21
tabindex ="0 "
21
22
class =${ keyClass }
23
+ data-key-name =${ keyName }
22
24
@blur=${ ( e : FocusEvent ) => {
23
- this . up ( text , e ) ;
25
+ this . up ( text , e . currentTarget as SVGElement ) ;
24
26
} }
25
27
@mousedown=${ ( ) => this . down ( text ) }
26
28
@mouseup=${ ( ) => this . up ( text ) }
27
29
@touchstart=${ ( ) => this . down ( text ) }
28
30
@touchend=${ ( ) => this . up ( text ) }
29
- @keydown=${ ( e : KeyboardEvent ) => e . keyCode === SPACE_KEY && this . down ( text , e ) }
30
- @keyup=${ ( e : KeyboardEvent ) => e . keyCode === SPACE_KEY && this . up ( text , e ) }
31
+ @keydown=${ ( e : KeyboardEvent ) =>
32
+ e . keyCode === SPACE_KEY && this . down ( text , e . currentTarget as SVGElement ) }
33
+ @keyup=${ ( e : KeyboardEvent ) =>
34
+ e . keyCode === SPACE_KEY && this . up ( text , e . currentTarget as SVGElement ) }
31
35
>
32
36
< use xlink:href ="#key " />
33
37
< text x ="5.6 " y ="8.1 "> ${ text } </ text >
@@ -92,6 +96,8 @@ export class MembraneKeypadElement extends LitElement {
92
96
font-size ="8.2px "
93
97
text-anchor ="middle "
94
98
xmlns ="http://www.w3.org/2000/svg "
99
+ @keydown =${ ( e : KeyboardEvent ) => this . keyStrokeDown ( e . key ) }
100
+ @keyup =${ ( e : KeyboardEvent ) => this . keyStrokeUp ( e . key ) }
95
101
>
96
102
< defs >
97
103
< rect
@@ -153,11 +159,10 @@ export class MembraneKeypadElement extends LitElement {
153
159
` ;
154
160
}
155
161
156
- private down ( key : string , event ?: UIEvent ) {
162
+ private down ( key : string , element ?: Element ) {
157
163
if ( ! this . pressedKeys . has ( key ) ) {
158
- if ( event ) {
159
- const currTarget = event . currentTarget as SVGElement ;
160
- currTarget . classList . add ( 'pressed' ) ;
164
+ if ( element ) {
165
+ element . classList . add ( 'pressed' ) ;
161
166
}
162
167
this . pressedKeys . add ( key ) ;
163
168
this . dispatchEvent (
@@ -168,11 +173,10 @@ export class MembraneKeypadElement extends LitElement {
168
173
}
169
174
}
170
175
171
- private up ( key : string , event ?: UIEvent ) {
176
+ private up ( key : string , element ?: Element ) {
172
177
if ( this . pressedKeys . has ( key ) ) {
173
- if ( event ) {
174
- const currTarget = event . currentTarget as SVGElement ;
175
- currTarget . classList . remove ( 'pressed' ) ;
178
+ if ( element ) {
179
+ element . classList . remove ( 'pressed' ) ;
176
180
}
177
181
this . pressedKeys . delete ( key ) ;
178
182
this . dispatchEvent (
@@ -182,4 +186,31 @@ export class MembraneKeypadElement extends LitElement {
182
186
) ;
183
187
}
184
188
}
189
+
190
+ private keyStrokeDown ( key : string ) {
191
+ const text = key . toUpperCase ( ) ;
192
+ const selectedKey = this . shadowRoot ?. querySelector ( `[data-key-name="${ text } "]` ) ;
193
+ if ( selectedKey ) {
194
+ this . down ( text , selectedKey as SVGElement ) ;
195
+ }
196
+ }
197
+
198
+ private keyStrokeUp ( key : string ) {
199
+ const text = key . toUpperCase ( ) ;
200
+ const selectedKey = this . shadowRoot ?. querySelector ( `[data-key-name="${ text } "]` ) ;
201
+ const pressedKeys : NodeListOf < SVGElement > | undefined = this . shadowRoot ?. querySelectorAll (
202
+ '.pressed'
203
+ ) ;
204
+
205
+ if ( key === 'Shift' ) {
206
+ pressedKeys ?. forEach ( ( pressedKey ) => {
207
+ const pressedText = pressedKey . dataset . keyName ! ;
208
+ this . up ( pressedText , pressedKey ) ;
209
+ } ) ;
210
+ }
211
+
212
+ if ( selectedKey ) {
213
+ this . up ( text , selectedKey as SVGElement ) ;
214
+ }
215
+ }
185
216
}
0 commit comments