Skip to content

Commit b254dac

Browse files
committed
fix: Proper 2-param behavior editing.
* Fixes for validation of param1 for more complex 2-param behaviors. * Minor layout fixes.
1 parent ad48405 commit b254dac

File tree

4 files changed

+46
-36
lines changed

4 files changed

+46
-36
lines changed

src/behaviors/BehaviorBindingPicker.tsx

Lines changed: 6 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
import { BehaviorBinding } from "@zmkfirmware/zmk-studio-ts-client/keymap";
99
import { BehaviorParametersPicker } from "./BehaviorParametersPicker";
1010
import { hid_usage_page_and_id_from_usage } from "../hid-usages";
11+
import { validateValue } from "./parameters";
1112

1213
export interface BehaviorBindingPickerProps {
1314
binding: BehaviorBinding;
@@ -16,44 +17,17 @@ export interface BehaviorBindingPickerProps {
1617
onBindingChanged: (binding: BehaviorBinding) => void;
1718
}
1819

19-
function validateValue(
20-
layerIds: number[],
21-
value?: number,
22-
values?: BehaviorParameterValueDescription[]
23-
): boolean {
24-
if (value === undefined) {
25-
return values === undefined || values?.length === 0 || !!values[0].nil;
26-
}
27-
28-
const matchingValue = values?.find((v) => {
29-
if (v.constant !== undefined) {
30-
return v.constant == value;
31-
} else if (v.range) {
32-
return value >= v.range.min && value <= v.range.max;
33-
} else if (v.hidUsage) {
34-
const [page, id] = hid_usage_page_and_id_from_usage(value);
35-
return page !== 0 && id !== 0;
36-
} else if (v.layerId) {
37-
return layerIds.includes(value);
38-
} else if (v.nil) {
39-
return value === 0;
40-
} else {
41-
console.error("Unknown check type!");
42-
return false;
43-
}
44-
});
45-
46-
return !!matchingValue || (value === 0 && (!values || values.length === 0));
47-
}
48-
4920
function validateBinding(
5021
metadata: BehaviorBindingParametersSet[],
5122
layerIds: number[],
5223
param1?: number,
5324
param2?: number
5425
): boolean {
55-
if (param1 === undefined || param1 === 0) {
56-
return metadata.every((s) => !s.param1);
26+
if (
27+
(param1 === undefined || param1 === 0) &&
28+
metadata.every((s) => !s.param1 || s.param1.length === 0)
29+
) {
30+
return true;
5731
}
5832

5933
let matchingSet = metadata.find((s) =>
@@ -116,7 +90,6 @@ export const BehaviorBindingPicker = ({
11690
}, [behaviorId, param1, param2]);
11791

11892
useEffect(() => {
119-
console.log("Loading from a changed binding", binding);
12093
setBehaviorId(binding.behaviorId);
12194
setParam1(binding.param1);
12295
setParam2(binding.param2);

src/behaviors/BehaviorParametersPicker.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { BehaviorBindingParametersSet } from "@zmkfirmware/zmk-studio-ts-client/behaviors";
22
import { ParameterValuePicker } from "./ParameterValuePicker";
3+
import { validateValue } from "./parameters";
34

45
export interface BehaviorParametersPickerProps {
56
param1?: number;
@@ -30,7 +31,11 @@ export const BehaviorParametersPicker = ({
3031
);
3132
} else {
3233
const set = metadata.find((s) =>
33-
s.param1.find((v) => v.constant == param1)
34+
validateValue(
35+
layers.map((l) => l.id),
36+
param1,
37+
s.param1
38+
)
3439
);
3540
return (
3641
<div>
@@ -40,7 +45,7 @@ export const BehaviorParametersPicker = ({
4045
layers={layers}
4146
onValueChanged={onParam1Changed}
4247
/>
43-
{set?.param2 && set.param2.length > 0 && (
48+
{(set?.param2?.length || 0) > 0 && (
4449
<ParameterValuePicker
4550
values={set.param2}
4651
value={param2}

src/behaviors/parameters.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { BehaviorParameterValueDescription } from "@zmkfirmware/zmk-studio-ts-client/behaviors";
2+
import { hid_usage_page_and_id_from_usage } from "../hid-usages";
3+
4+
export function validateValue(
5+
layerIds: number[],
6+
value?: number,
7+
values?: BehaviorParameterValueDescription[]
8+
): boolean {
9+
if (value === undefined) {
10+
return values === undefined || values?.length === 0 || !!values[0].nil;
11+
}
12+
13+
const matchingValue = values?.find((v) => {
14+
if (v.constant !== undefined) {
15+
return v.constant == value;
16+
} else if (v.range) {
17+
return value >= v.range.min && value <= v.range.max;
18+
} else if (v.hidUsage) {
19+
const [page, id] = hid_usage_page_and_id_from_usage(value);
20+
return page !== 0 && id !== 0;
21+
} else if (v.layerId) {
22+
return layerIds.includes(value);
23+
} else if (v.nil) {
24+
return value === 0;
25+
} else {
26+
console.error("Unknown check type!");
27+
return false;
28+
}
29+
});
30+
31+
return !!matchingValue || (value === 0 && (!values || values.length === 0));
32+
}

src/keyboard/Keyboard.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,7 @@ export default function Keyboard() {
472472
);
473473

474474
return (
475-
<div className="p-2 h-full w-full grid grid-cols-[auto_1fr] grid-rows-[4fr_1fr]">
475+
<div className="p-2 grid grid-cols-[auto_1fr] grid-rows-[1fr_minmax(10em,auto)]">
476476
<div className="flex flex-col gap-2">
477477
{layouts && (
478478
<div className="col-start-3 row-start-1 row-end-2">

0 commit comments

Comments
 (0)