Skip to content

Commit e6e95b1

Browse files
committed
feat(membrane-keypad): allow customizing key labels
1 parent 823fb16 commit e6e95b1

File tree

2 files changed

+50
-20
lines changed

2 files changed

+50
-20
lines changed

src/membrane-keypad-element.stories.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,16 @@ storiesOf('Membrane Keypad', module)
2424
></wokwi-membrane-keypad>
2525
`
2626
)
27+
.add(
28+
'Custom keys',
29+
() => html`
30+
<wokwi-membrane-keypad
31+
@button-press=${logEvent}
32+
@button-release=${logEvent}
33+
.keys=${['1', '2', '3', '4', 'Q', 'W', 'E', 'R', 'A', 'S', 'D', 'F', '!', '@', '#', '$']}
34+
></wokwi-membrane-keypad>
35+
`
36+
)
2737
.add(
2838
'Three columns',
2939
() => html`

src/membrane-keypad-element.ts

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import { ElementPin } from './pin';
44

55
const SPACE_KEY = 32;
66

7+
const rowPositions = [10.7, 25, 39.3, 53.6];
8+
const columnPositions = [7, 22, 37, 52];
9+
710
function 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

Comments
 (0)