Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ji4nuyLVHcxrXWHTdb5nRD
42 lines
2.0 KiB
TypeScript
42 lines
2.0 KiB
TypeScript
/* =============================================================================
|
|
* B05_Profile/logic/B05_Profile_ContourLock.ts
|
|
* 평면 등고선 고정(353-2) — 고른 높이 하나를 쥐고, 잠긴 동안 다른 지정을 막는 규칙.
|
|
*
|
|
* 높이값으로 쥔다(가닥 번호는 지형을 바꾸면 달라짐) · 페이지 동안만(저장 안 함).
|
|
* 순수 계산 — 화면 · three · fetch · sessionStorage 없음. 단추는 `B05_Profile_UI_RouteEdit_ContourLock`.
|
|
* ========================================================================== */
|
|
|
|
/** 가닥마다 높이(모르면 null). */
|
|
export type ContourLevels = ReadonlyArray<number | null>;
|
|
|
|
/** 자물쇠 단추 — 보일지 · 눌린 모양인지. */
|
|
export interface LockButtonState {
|
|
visible: boolean;
|
|
pressed: boolean;
|
|
}
|
|
|
|
/** 그 높이의 첫 가닥 번호 — 없으면 -1(지형을 바꾼 뒤 잠근 높이 다시 짚기). */
|
|
export function featureOfLevel(levels: ContourLevels, level: number | null): number {
|
|
if (level === null) return -1;
|
|
return levels.findIndex((value) => value === level);
|
|
}
|
|
|
|
/** 누른 가닥 높이 · 잠근 높이 · 고른 가닥인지 → 단추(366-1) — 안 잠김 = 높이 있는 고른 가닥을
|
|
* 누를 때만 · 잠김 = 잠근 높이의 아무 가닥을 누를 때(풀기). 지나가기만 하면 안 뜸. */
|
|
export function lockButtonState(
|
|
hitLevel: number | null,
|
|
lockedLevel: number | null,
|
|
selected: boolean,
|
|
): LockButtonState {
|
|
if (lockedLevel !== null) return { visible: hitLevel === lockedLevel, pressed: true };
|
|
return { visible: hitLevel !== null && selected, pressed: false };
|
|
}
|
|
|
|
/** 단추 누름 — 잠김이면 풂(null) · 아니면 그 가닥 높이로 잠금. */
|
|
export function toggleLock(lockedLevel: number | null, targetLevel: number | null): number | null {
|
|
return lockedLevel !== null ? null : targetLevel;
|
|
}
|
|
|
|
/** 잠긴 동안은 고른 가닥이 안 바뀜(다른 가닥 · 빈 곳 눌러도). */
|
|
export const canPickContour = (lockedLevel: number | null): boolean => lockedLevel === null;
|