mock: PHY Editorで異形キーを描き・編集し・追加できるようにする(T-32)
- domain/keyShape.ts に、キーの矩形・外接矩形・和の外形の計算と、異形キーのプリセット表(今はISO Enterだけ)を置いた - キャンバスと選択枠は、2つ目の矩形を持つキーを和の外形のpathで描く。範囲選択と囲み矩形も両方の矩形で取る - プロパティ欄に「異形キー」のチェックと、2つ目の矩形の欄(X2・Y2・Width2・Height2)を置いた - ツールバーに「異形キーを足す」selectを置いた。1Uと同じ規則の位置に、外接矩形の左上を合わせて足す - 検証: vue-tsc 0件、Vitest 106件(うち新規5件)、Playwright PHY 31件(うち新規1件)、prettier --check Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Xmqw9x7EoryY6zf116i3yM
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
import { computed, ref } from "vue";
|
||||
import type { Node, Transform } from "../../domain/phy";
|
||||
import type { StabilizerCandidate } from "../../domain/stabilizers";
|
||||
import { hasSecondRect } from "../../domain/keyShape";
|
||||
const props = defineProps<{
|
||||
selectedCount: number;
|
||||
selectedId: string | null;
|
||||
@@ -26,6 +27,20 @@ function setSwitchOffset(axis: "x" | "y", value: number) {
|
||||
else n.switchOffset = offset;
|
||||
});
|
||||
}
|
||||
// 異形キーは2つ目の矩形(x2, y2, w2, h2)を持つ。オンにしたときはKLEの既定(0, 0, w, h)から始める。T-32。
|
||||
const irregular = computed(() => props.item?.type === "key" && hasSecondRect(props.item.size));
|
||||
function setIrregular(on: boolean) {
|
||||
emit("update", props.item!.id, (n) => {
|
||||
if (n.type !== "key") return;
|
||||
if (on) n.size = { ...n.size, x2: 0, y2: 0, w2: n.size.w, h2: n.size.h };
|
||||
else n.size = { w: n.size.w, h: n.size.h };
|
||||
});
|
||||
}
|
||||
function setSecondRect(field: "x2" | "y2" | "w2" | "h2", value: number) {
|
||||
emit("update", props.item!.id, (n) => {
|
||||
if (n.type === "key") n.size[field] = value;
|
||||
});
|
||||
}
|
||||
function toggleStabilizer(id: string, on: boolean) {
|
||||
const current = props.stabilizers?.selected ?? [];
|
||||
emit(
|
||||
@@ -113,6 +128,47 @@ const frameR = ref(0);
|
||||
})
|
||||
"
|
||||
/></label>
|
||||
<label class="check"
|
||||
><input
|
||||
type="checkbox"
|
||||
:checked="irregular"
|
||||
@change="setIrregular(($event.target as HTMLInputElement).checked)"
|
||||
/>異形キー</label
|
||||
>
|
||||
<template v-if="irregular && item.type === 'key'">
|
||||
<label
|
||||
>X2
|
||||
<input
|
||||
type="number"
|
||||
step="any"
|
||||
:value="item.size.x2 ?? 0"
|
||||
@change="setSecondRect('x2', Number(($event.target as HTMLInputElement).value))"
|
||||
/></label>
|
||||
<label
|
||||
>Y2
|
||||
<input
|
||||
type="number"
|
||||
step="any"
|
||||
:value="item.size.y2 ?? 0"
|
||||
@change="setSecondRect('y2', Number(($event.target as HTMLInputElement).value))"
|
||||
/></label>
|
||||
<label
|
||||
>Width2
|
||||
<input
|
||||
type="number"
|
||||
step="any"
|
||||
:value="item.size.w2 ?? item.size.w"
|
||||
@change="setSecondRect('w2', Number(($event.target as HTMLInputElement).value))"
|
||||
/></label>
|
||||
<label
|
||||
>Height2
|
||||
<input
|
||||
type="number"
|
||||
step="any"
|
||||
:value="item.size.h2 ?? item.size.h"
|
||||
@change="setSecondRect('h2', Number(($event.target as HTMLInputElement).value))"
|
||||
/></label>
|
||||
</template>
|
||||
<label
|
||||
>switchOffset X
|
||||
<input
|
||||
|
||||
Reference in New Issue
Block a user