Files
Aislo/B05_Profile/logic/B05_Profile_ContourLock.ts
T

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;