Skip to content

Commit 6ed25ce

Browse files
committed
✨ support per-profile default keymaps
1 parent 14e048a commit 6ed25ce

3 files changed

Lines changed: 72 additions & 28 deletions

File tree

src/lib/configurator/remap/remap-menubar.svelte

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,13 @@ this program. If not, see <https://www.gnu.org/licenses/>.
1818
import LayerSelect from "$lib/components/layer-select.svelte"
1919
import { Button } from "$lib/components/ui/button"
2020
import { keyboardContext } from "$lib/keyboard"
21-
import { remapStateContext } from "../context.svelte"
21+
import { globalStateContext, remapStateContext } from "../context.svelte"
2222
import { keymapQueryContext } from "../queries/keymap-query.svelte"
2323
24+
const { profile } = $derived(globalStateContext.get())
2425
const remapState = remapStateContext.get()
2526
const { layer } = $derived(remapState)
26-
const { defaultKeymap } = keyboardContext.get().metadata
27+
const { defaultKeymaps } = keyboardContext.get().metadata
2728
2829
const keymapQuery = keymapQueryContext.get()
2930
</script>
@@ -33,7 +34,11 @@ this program. If not, see <https://www.gnu.org/licenses/>.
3334
<div class="flex items-center gap-2">
3435
<Button
3536
onclick={() =>
36-
keymapQuery.set({ layer, offset: 0, data: defaultKeymap[layer] })}
37+
keymapQuery.set({
38+
layer,
39+
offset: 0,
40+
data: defaultKeymaps[profile][layer],
41+
})}
3742
size="sm"
3843
variant="destructive"
3944
>

src/lib/keyboard/demo-keyboard.svelte.ts

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ import type {
4242
} from "."
4343
import { demoMetadata } from "./metadata"
4444

45-
const { adcResolution, numProfiles, numKeys, numAdvancedKeys, defaultKeymap } =
45+
const { adcResolution, numProfiles, numKeys, numAdvancedKeys, defaultKeymaps } =
4646
demoMetadata
4747

4848
type DemoKeyboardProfileState = {
@@ -54,19 +54,21 @@ type DemoKeyboardProfileState = {
5454
tickRate: number
5555
}
5656

57-
const defaultProfile: DemoKeyboardProfileState = {
58-
keymap: defaultKeymap,
59-
actuationMap: [...Array(numKeys)].fill(defaultActuation),
60-
advancedKeys: [...Array(numAdvancedKeys)].fill(defaultAdvancedKey),
61-
gamepadButtons: Array(numKeys).fill(HMK_GamepadButton.NONE),
62-
gamepadOptions: {
63-
analogCurve: analogCurvePresets[0].curve,
64-
keyboardEnabled: true,
65-
gamepadOverride: false,
66-
squareJoystick: false,
67-
snappyJoystick: true,
68-
},
69-
tickRate: DEFAULT_TICK_RATE,
57+
function defaultProfile(profile: number): DemoKeyboardProfileState {
58+
return {
59+
keymap: defaultKeymaps[profile],
60+
actuationMap: Array(numKeys).fill(defaultActuation),
61+
advancedKeys: Array(numAdvancedKeys).fill(defaultAdvancedKey),
62+
gamepadButtons: Array(numKeys).fill(HMK_GamepadButton.NONE),
63+
gamepadOptions: {
64+
analogCurve: analogCurvePresets[0].curve,
65+
keyboardEnabled: true,
66+
gamepadOverride: false,
67+
squareJoystick: false,
68+
snappyJoystick: true,
69+
},
70+
tickRate: DEFAULT_TICK_RATE,
71+
}
7072
}
7173

7274
type DemoKeyboardState = {
@@ -86,8 +88,8 @@ export class DemoKeyboard implements Keyboard {
8688
saveBottomOutThreshold: true,
8789
highPollingRateEnabled: true,
8890
},
89-
profiles: [...Array(numProfiles)].map(() =>
90-
structuredClone(defaultProfile),
91+
profiles: [...Array(numProfiles)].map((_, i) =>
92+
structuredClone(defaultProfile(i)),
9193
),
9294
}
9395

@@ -118,7 +120,7 @@ export class DemoKeyboard implements Keyboard {
118120
this.#state.options = data
119121
}
120122
async resetProfile({ profile }: ResetProfileParams) {
121-
this.#state.profiles[profile] = structuredClone(defaultProfile)
123+
this.#state.profiles[profile] = structuredClone(defaultProfile(profile))
122124
}
123125
async duplicateProfile({ profile, srcProfile }: DuplicateProfileParams) {
124126
this.#state.profiles[profile] = structuredClone(

src/lib/keyboard/metadata.ts

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -106,22 +106,59 @@ export const keyboardMetadataSchema = z
106106
numAdvancedKeys: z.int().min(1).max(HMK_MAX_NUM_ADVANCED_KEYS),
107107

108108
layout: keyboardLayoutSchema,
109-
defaultKeymap: z.array(z.array(keycodeSchema)),
109+
defaultKeymap: z.array(z.array(keycodeSchema)).optional(),
110+
defaultKeymaps: z.array(z.array(z.array(keycodeSchema))).optional(),
110111
})
111-
.superRefine((val, ctx) => {
112-
if (val.defaultKeymap.length !== val.numLayers) {
112+
.transform((val, ctx) => {
113+
const getDefaultKeymaps = () => {
114+
const defaultKeymaps = val.defaultKeymaps
115+
if (defaultKeymaps !== undefined) {
116+
return defaultKeymaps
117+
} else {
118+
const defaultKeymap = val.defaultKeymap
119+
return defaultKeymap === undefined
120+
? undefined
121+
: [...Array(val.numProfiles)].map(() =>
122+
defaultKeymap.map((layer) => [...layer]),
123+
)
124+
}
125+
}
126+
127+
const defaultKeymaps = getDefaultKeymaps()
128+
if (defaultKeymaps === undefined) {
129+
ctx.addIssue({
130+
code: "custom",
131+
message: "Expected either defaultKeymap or defaultKeymaps",
132+
})
133+
return z.NEVER
134+
}
135+
136+
if (defaultKeymaps.length !== val.numProfiles) {
137+
ctx.addIssue({
138+
code: "custom",
139+
message: `Expected defaultKeymaps to have ${val.numProfiles} profiles`,
140+
})
141+
}
142+
143+
if (defaultKeymaps.some((profile) => profile.length !== val.numLayers)) {
113144
ctx.addIssue({
114145
code: "custom",
115-
message: `Expected defaultKeymap to have ${val.numLayers} layers`,
146+
message: `Expected defaultKeymaps profiles to have ${val.numLayers} layers`,
116147
})
117148
}
118149

119-
if (val.defaultKeymap.some((layer) => layer.length !== val.numKeys)) {
150+
if (
151+
defaultKeymaps.some((profile) =>
152+
profile.some((layer) => layer.length !== val.numKeys),
153+
)
154+
) {
120155
ctx.addIssue({
121156
code: "custom",
122-
message: `Expected defaultKeymap layers to have ${val.numKeys} keys`,
157+
message: `Expected defaultKeymaps layers to have ${val.numKeys} keys`,
123158
})
124159
}
160+
161+
return { ...val, defaultKeymaps }
125162
})
126163

127164
export type KeyboardMetadata = z.infer<typeof keyboardMetadataSchema>
@@ -243,7 +280,7 @@ export const demoMetadata = keyboardMetadataSchema.parse({
243280
],
244281
],
245282
},
246-
defaultKeymap: [
283+
defaultKeymaps: [...Array(4)].map(() => [
247284
[
248285
"KC_ESC",
249286
"KC_1",
@@ -528,5 +565,5 @@ export const demoMetadata = keyboardMetadataSchema.parse({
528565
"_______",
529566
"_______",
530567
],
531-
],
568+
]),
532569
})

0 commit comments

Comments
 (0)