Skip to content

Commit 837e4a7

Browse files
committed
refactor: Pull keymap into its own component
1 parent 7ac1c24 commit 837e4a7

File tree

2 files changed

+69
-56
lines changed

2 files changed

+69
-56
lines changed

src/keyboard/Keyboard.tsx

Lines changed: 2 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,9 @@ import {
1616
} from "zmk-studio-ts-client/keymap";
1717
import type { GetBehaviorDetailsResponse } from "zmk-studio-ts-client/behaviors";
1818

19-
import {
20-
hid_usage_get_label,
21-
hid_usage_page_and_id_from_usage,
22-
} from "../hid-usages";
2319
import { LayerPicker } from "./LayerPicker";
24-
import { PhysicalLayout as PhysicalLayoutComp } from "./PhysicalLayout";
2520
import { PhysicalLayoutPicker } from "./PhysicalLayoutPicker";
21+
import { Keymap as KeymapComp } from "./Keymap";
2622
import { useConnectedDeviceData } from "../rpc/useConnectedDeviceData";
2723
import { ConnectionContext } from "../rpc/ConnectionContext";
2824
import { UndoRedoContext } from "../undoRedo";
@@ -31,49 +27,6 @@ import { produce } from "immer";
3127

3228
type BehaviorMap = Record<number, GetBehaviorDetailsResponse>;
3329

34-
function renderLayout(
35-
layout: PhysicalLayout,
36-
keymap: Keymap,
37-
behaviors: BehaviorMap,
38-
selectedLayoutIndex: number,
39-
selectedKeyPosition: number | undefined,
40-
setSelectedKeyPosition: React.Dispatch<SetStateAction<number | undefined>>,
41-
) {
42-
if (!keymap.layers[selectedLayoutIndex]) {
43-
return <></>;
44-
}
45-
46-
let positions = layout.keys.map((k, i) => {
47-
let [page, id] = hid_usage_page_and_id_from_usage(
48-
keymap.layers[selectedLayoutIndex].bindings[i].param1,
49-
);
50-
51-
// TODO: Do something with implicit mods!
52-
page &= 0xff;
53-
54-
let label = hid_usage_get_label(page, id)?.replace(/^Keyboard /, "");
55-
56-
return {
57-
header:
58-
behaviors[keymap.layers[selectedLayoutIndex].bindings[i].behaviorId]
59-
?.displayName || "Unknown",
60-
x: k.x / 100.0,
61-
y: k.y / 100.0,
62-
width: k.width / 100,
63-
height: k.height / 100.0,
64-
children: <span>{label}</span>,
65-
};
66-
});
67-
68-
return (
69-
<PhysicalLayoutComp
70-
positions={positions}
71-
selectedPosition={selectedKeyPosition}
72-
onPositionClicked={setSelectedKeyPosition}
73-
/>
74-
);
75-
}
76-
7730
function useBehaviors(): BehaviorMap {
7831
let connection = useContext(ConnectionContext);
7932

@@ -349,14 +302,7 @@ export default function Keyboard() {
349302
)}
350303
{layouts && keymap && behaviors && (
351304
<div className="col-start-2 row-start-1 grid items-center justify-center">
352-
{renderLayout(
353-
layouts[selectedPhysicalLayoutIndex],
354-
keymap,
355-
behaviors,
356-
selectedLayerIndex,
357-
selectedKeyPosition,
358-
setSelectedKeyPosition,
359-
)}
305+
<KeymapComp keymap={keymap} layout={layouts[selectedPhysicalLayoutIndex]} behaviors={behaviors} selectedLayerIndex={selectedLayerIndex} selectedKeyPosition={selectedKeyPosition} onKeyPositionClicked={setSelectedKeyPosition} />
360306
</div>
361307
)}
362308
{keymap && selectedBinding && (

src/keyboard/Keymap.tsx

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
2+
import {
3+
PhysicalLayout,
4+
Keymap as KeymapMsg,
5+
} from "zmk-studio-ts-client/keymap";
6+
import type { GetBehaviorDetailsResponse } from "zmk-studio-ts-client/behaviors";
7+
8+
import {
9+
hid_usage_get_label,
10+
hid_usage_page_and_id_from_usage,
11+
} from "../hid-usages";
12+
13+
import { PhysicalLayout as PhysicalLayoutComp } from "./PhysicalLayout";
14+
15+
type BehaviorMap = Record<number, GetBehaviorDetailsResponse>;
16+
17+
export interface KeymapProps {
18+
layout: PhysicalLayout,
19+
keymap: KeymapMsg,
20+
behaviors: BehaviorMap,
21+
selectedLayerIndex: number,
22+
selectedKeyPosition: number | undefined,
23+
onKeyPositionClicked: (keyPosition: number) => void,
24+
}
25+
26+
export const Keymap = ({
27+
layout,
28+
keymap,
29+
behaviors,
30+
selectedLayerIndex,
31+
selectedKeyPosition,
32+
onKeyPositionClicked,
33+
}: KeymapProps) => {
34+
if (!keymap.layers[selectedLayerIndex]) {
35+
return <></>;
36+
}
37+
38+
let positions = layout.keys.map((k, i) => {
39+
let [page, id] = hid_usage_page_and_id_from_usage(
40+
keymap.layers[selectedLayerIndex].bindings[i].param1,
41+
);
42+
43+
// TODO: Do something with implicit mods!
44+
page &= 0xff;
45+
46+
let label = hid_usage_get_label(page, id)?.replace(/^Keyboard /, "");
47+
48+
return {
49+
header:
50+
behaviors[keymap.layers[selectedLayerIndex].bindings[i].behaviorId]
51+
?.displayName || "Unknown",
52+
x: k.x / 100.0,
53+
y: k.y / 100.0,
54+
width: k.width / 100,
55+
height: k.height / 100.0,
56+
children: <span>{label}</span>,
57+
};
58+
});
59+
60+
return (
61+
<PhysicalLayoutComp
62+
positions={positions}
63+
selectedPosition={selectedKeyPosition}
64+
onPositionClicked={onKeyPositionClicked}
65+
/>
66+
);
67+
}

0 commit comments

Comments
 (0)