@@ -4,6 +4,9 @@ import { ElementPin } from './pin';
44
55const SPACE_KEY = 32 ;
66
7+ const rowPositions = [ 10.7 , 25 , 39.3 , 53.6 ] ;
8+ const columnPositions = [ 7 , 22 , 37 , 52 ] ;
9+
710function isNumeric ( text : string ) {
811 return ! isNaN ( parseFloat ( text ) ) ;
912}
@@ -20,6 +23,17 @@ export class MembraneKeypadElement extends LitElement {
2023 */
2124 @property ( ) connector = false ;
2225
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+
2337 get pinInfo ( ) : ElementPin [ ] {
2438 switch ( this . columns ) {
2539 case '3' :
@@ -49,12 +63,13 @@ export class MembraneKeypadElement extends LitElement {
4963
5064 private pressedKeys = new Set < string > ( ) ;
5165
52- renderKey ( text : string , x : number , y : number ) {
66+ renderKey ( row : number , column : number ) {
67+ const text = this . keys [ row * 4 + column ] ?? '' ;
5368 const keyClass = isNumeric ( text ) ? 'blue-key' : 'red-key' ;
5469 const keyName = text . toUpperCase ( ) ;
5570
5671 return svg `< g
57- transform ="translate(${ x } ${ y } ) "
72+ transform ="translate(${ columnPositions [ column ] } ${ rowPositions [ row ] } ) "
5873 tabindex ="0 "
5974 class =${ keyClass }
6075 data-key-name =${ keyName }
@@ -193,34 +208,39 @@ export class MembraneKeypadElement extends LitElement {
193208
194209 <!-- Blue keys -->
195210 < 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 >
206221 </ g >
207222
208223 <!-- Red keys -->
209224 < 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 >
212227 ${ fourColumns &&
213228 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 >
218233 ` }
219234 </ g >
220235 </ svg >
221236 ` ;
222237 }
223238
239+ private keyIndex ( key : string ) {
240+ const index = this . keys . indexOf ( key ) ;
241+ return { row : Math . floor ( index / 4 ) , column : index % 4 } ;
242+ }
243+
224244 private down ( key : string , element ?: Element ) {
225245 if ( ! this . pressedKeys . has ( key ) ) {
226246 if ( element ) {
@@ -229,7 +249,7 @@ export class MembraneKeypadElement extends LitElement {
229249 this . pressedKeys . add ( key ) ;
230250 this . dispatchEvent (
231251 new CustomEvent ( 'button-press' , {
232- detail : { key } ,
252+ detail : { key, ... this . keyIndex ( key ) } ,
233253 } )
234254 ) ;
235255 }
@@ -243,7 +263,7 @@ export class MembraneKeypadElement extends LitElement {
243263 this . pressedKeys . delete ( key ) ;
244264 this . dispatchEvent (
245265 new CustomEvent ( 'button-release' , {
246- detail : { key } ,
266+ detail : { key, ... this . keyIndex ( key ) } ,
247267 } )
248268 ) ;
249269 }
0 commit comments