rewrite selection system

This commit is contained in:
wass08
2026-01-21 08:00:31 +09:00
parent bc8293b120
commit a338bea4e7
11 changed files with 118 additions and 30 deletions
+44 -9
View File
@@ -1,25 +1,60 @@
"use client";
import { BuildingNode, LevelNode } from "@pascal-app/core";
import { BuildingNode, ItemNode, LevelNode, Zone } from "@pascal-app/core";
import { create } from "zustand";
type SelectionPath = {
buildingId: BuildingNode["id"] | null;
levelId: LevelNode["id"] | null;
zoneId: Zone["id"] | null;
selectedIds: ItemNode["id"][]; // For items/assets (multi-select)
};
type ViewerState = {
selection: SelectionPath;
levelMode: "stacked" | "exploded" | "solo" | "manual";
// Actions
setLevelMode: (mode: "stacked" | "exploded" | "solo" | "manual") => void;
currentBuildingId: BuildingNode["id"] | null;
setCurrentBuildingId: (id: BuildingNode["id"] | null) => void;
currentLevelId: LevelNode["id"] | null;
setCurrentLevelId: (id: LevelNode["id"] | null) => void;
// Smart selection update
setSelection: (updates: Partial<SelectionPath>) => void;
resetSelection: () => void;
};
const useViewer = create<ViewerState>()((set, get) => ({
selection: { buildingId: null, levelId: null, zoneId: null, selectedIds: [] },
levelMode: "stacked",
setLevelMode: (mode) => set({ levelMode: mode }),
currentLevelId: null,
setCurrentLevelId: (id) => set({ currentLevelId: id }),
currentBuildingId: null,
setCurrentBuildingId: (id) => set({ currentBuildingId: id }),
setSelection: (updates) =>
set((state) => {
const newSelection = { ...state.selection, ...updates };
// Hierarchy Guard: If we change a high-level parent, reset the children
if (updates.buildingId !== undefined) {
newSelection.levelId = null;
newSelection.zoneId = null;
newSelection.selectedIds = [];
} else if (updates.levelId !== undefined) {
newSelection.zoneId = null;
newSelection.selectedIds = [];
} else if (updates.zoneId !== undefined) {
newSelection.selectedIds = [];
}
return { selection: newSelection };
}),
resetSelection: () =>
set({
selection: {
buildingId: null,
levelId: null,
zoneId: null,
selectedIds: [],
},
}),
}));
export default useViewer;