@@ -4,6 +4,9 @@ import { ElementPin } from './pin';
4
4
5
5
const SPACE_KEY = 32 ;
6
6
7
+ const rowPositions = [ 10.7 , 25 , 39.3 , 53.6 ] ;
8
+ const columnPositions = [ 7 , 22 , 37 , 52 ] ;
9
+
7
10
function isNumeric ( text : string ) {
8
11
return ! isNaN ( parseFloat ( text ) ) ;
9
12
}
@@ -20,6 +23,17 @@ export class MembraneKeypadElement extends LitElement {
20
23
*/
21
24
@property ( ) connector = false ;
22
25
26
+ // prettier-ignore
27
+ /**
28
+ * Key labels
29
+ */
30
+ @property ( { type : Array } ) keys = [
31
+ '0' , '1' , '2' , 'A' ,
32
+ '4' , '5' , '6' , 'B' ,
33
+ '7' , '8' , '9' , 'C' ,
34
+ '*' , '0' , '#' , 'D' ,
35
+ ] ;
36
+
23
37
get pinInfo ( ) : ElementPin [ ] {
24
38
switch ( this . columns ) {
25
39
case '3' :
@@ -49,12 +63,13 @@ export class MembraneKeypadElement extends LitElement {
49
63
50
64
private pressedKeys = new Set < string > ( ) ;
51
65
52
- renderKey ( text : string , x : number , y : number ) {
66
+ renderKey ( row : number , column : number ) {
67
+ const text = this . keys [ row * 4 + column ] ?? '' ;
53
68
const keyClass = isNumeric ( text ) ? 'blue-key' : 'red-key' ;
54
69
const keyName = text . toUpperCase ( ) ;
55
70
56
71
return svg `< g
57
- transform ="translate(${ x } ${ y } ) "
72
+ transform ="translate(${ columnPositions [ column ] } ${ rowPositions [ row ] } ) "
58
73
tabindex ="0 "
59
74
class =${ keyClass }
60
75
data-key-name =${ keyName }
@@ -193,34 +208,39 @@ export class MembraneKeypadElement extends LitElement {
193
208
194
209
<!-- Blue keys -->
195
210
< g fill ="#4e90d7 ">
196
- < g > ${ this . renderKey ( '1' , 7 , 10.7 ) } </ g >
197
- < g > ${ this . renderKey ( '2' , 22 , 10.7 ) } </ g >
198
- < g > ${ this . renderKey ( '3' , 37 , 10.7 ) } </ g >
199
- < g > ${ this . renderKey ( '4' , 7 , 25 ) } </ g >
200
- < g > ${ this . renderKey ( '5' , 22 , 25 ) } </ g >
201
- < g > ${ this . renderKey ( '6' , 37 , 25 ) } </ g >
202
- < g > ${ this . renderKey ( '7' , 7 , 39.3 ) } </ g >
203
- < g > ${ this . renderKey ( '8' , 22 , 39.3 ) } </ g >
204
- < g > ${ this . renderKey ( '9' , 37 , 39.3 ) } </ g >
205
- < g > ${ this . renderKey ( '0' , 22 , 53.6 ) } </ g >
211
+ < g > ${ this . renderKey ( 0 , 0 ) } </ g >
212
+ < g > ${ this . renderKey ( 0 , 1 ) } </ g >
213
+ < g > ${ this . renderKey ( 0 , 2 ) } </ g >
214
+ < g > ${ this . renderKey ( 1 , 0 ) } </ g >
215
+ < g > ${ this . renderKey ( 1 , 1 ) } </ g >
216
+ < g > ${ this . renderKey ( 1 , 2 ) } </ g >
217
+ < g > ${ this . renderKey ( 2 , 0 ) } </ g >
218
+ < g > ${ this . renderKey ( 2 , 1 ) } </ g >
219
+ < g > ${ this . renderKey ( 2 , 2 ) } </ g >
220
+ < g > ${ this . renderKey ( 3 , 1 ) } </ g >
206
221
</ g >
207
222
208
223
<!-- Red keys -->
209
224
< g fill ="#e94541 ">
210
- < g > ${ this . renderKey ( '*' , 7 , 53.6 ) } </ g >
211
- < g > ${ this . renderKey ( '#' , 37 , 53.6 ) } </ g >
225
+ < g > ${ this . renderKey ( 3 , 0 ) } </ g >
226
+ < g > ${ this . renderKey ( 3 , 2 ) } </ g >
212
227
${ fourColumns &&
213
228
svg `
214
- < g > ${ this . renderKey ( 'A' , 52 , 10.7 ) } </ g >
215
- < g > ${ this . renderKey ( 'B' , 52 , 25 ) } </ g >
216
- < g > ${ this . renderKey ( 'C' , 52 , 39. 3) } </ g >
217
- < g > ${ this . renderKey ( 'D' , 52 , 53.6 ) } </ g >
229
+ < g > ${ this . renderKey ( 0 , 3 ) } </ g >
230
+ < g > ${ this . renderKey ( 1 , 3 ) } </ g >
231
+ < g > ${ this . renderKey ( 2 , 3 ) } </ g >
232
+ < g > ${ this . renderKey ( 3 , 3 ) } </ g >
218
233
` }
219
234
</ g >
220
235
</ svg >
221
236
` ;
222
237
}
223
238
239
+ private keyIndex ( key : string ) {
240
+ const index = this . keys . indexOf ( key ) ;
241
+ return { row : Math . floor ( index / 4 ) , column : index % 4 } ;
242
+ }
243
+
224
244
private down ( key : string , element ?: Element ) {
225
245
if ( ! this . pressedKeys . has ( key ) ) {
226
246
if ( element ) {
@@ -229,7 +249,7 @@ export class MembraneKeypadElement extends LitElement {
229
249
this . pressedKeys . add ( key ) ;
230
250
this . dispatchEvent (
231
251
new CustomEvent ( 'button-press' , {
232
- detail : { key } ,
252
+ detail : { key, ... this . keyIndex ( key ) } ,
233
253
} )
234
254
) ;
235
255
}
@@ -243,7 +263,7 @@ export class MembraneKeypadElement extends LitElement {
243
263
this . pressedKeys . delete ( key ) ;
244
264
this . dispatchEvent (
245
265
new CustomEvent ( 'button-release' , {
246
- detail : { key } ,
266
+ detail : { key, ... this . keyIndex ( key ) } ,
247
267
} )
248
268
) ;
249
269
}
0 commit comments