Files
DOSSIER-STANDALONE/src/state/viewSlice.ts
T
karim b1e7fdf8fc Zeichnungsebenen merken sich eigenen 2D/3D-Zustand
Bisher war viewType (Grundriss/Perspektive) ein einziger globaler
Wert. Beim Tab-Wechsel blieb er unverändert stehen, was wirkte, als
würde die Ansicht "durchsickern". Jede Ebene merkt sich jetzt ihren
zuletzt gewählten Ansichtstyp und stellt ihn beim Zurückwechseln
wieder her.
2026-07-03 21:51:51 +02:00

110 lines
4.4 KiB
TypeScript

// View-Slice: alles, was die Darstellung steuert, ohne Modell zu sein —
// Ansichtstyp, Detailgrad, Render-Modus, Referenzlinien, aktive Zeichnungsebene,
// Massstab, Linien-Modus sowie der Darstellungsmodus je Panel. Reiner Umzug aus
// App.tsx. Bezeichner englisch, Kommentare deutsch (CONVENTIONS.md).
//
// Entscheidung `activeCategoryCode`: liegt hier (View), NICHT in selectionSlice.
// Es ist keine Element-Selektion, sondern die „aktive Ebene" (Arbeitsfokus für
// neue Zeichnungen / Status-Leiste) — view-seitiger Zustand wie activeLevelId.
import { sampleProject } from "../model/sampleProject";
import type { DetailLevel, RenderMode, View3d, ViewType } from "../ui/TopBar";
import type { DisplayMode } from "../panels/types";
import type { StoreApi } from "./store";
/** Standard-Darstellungsmodus je Panel (wie bisher: alles sichtbar normal). */
const DEFAULT_DISPLAY_MODE: DisplayMode = "all";
/** Felder, die diese Slice in den RootState beisteuert. */
export interface ViewSlice {
// Aktive Zeichnungsebene (Geschoss/Schnitt/Zeichnung).
activeLevelId: string;
// Ansichtstyp (Grundriss / Perspektive).
viewType: ViewType;
// Zuletzt gewählter Ansichtstyp je Zeichnungsebene — jeder Tab merkt sich
// seinen eigenen 2D/3D-Zustand statt eines rein globalen Umschalters.
viewTypeByLevel: Record<string, ViewType>;
// Detailgrad im Grundriss.
detail: DetailLevel;
// Render-Modus der 3D-Ansicht.
renderMode: RenderMode;
// Kanonischer Blickwinkel der 3D-Ansicht (Front/Top/Seite/Iso/freie Persp.).
view3d: View3d;
// Sichtwinkel (FOV) der 3D-Perspektivkamera in Grad.
fov: number;
// Farb-Modus des Grundrisses: "color" = Kategorie-/Element-Farben (heute),
// "mono" = reiner Schwarz-Weiss-Plan (Tinte, keine Farb-/Schraffurfarben).
planColorMode: "color" | "mono";
// Wand-Achslinien im Grundriss.
referenceLines: boolean;
// Linien-Darstellung: "display" = Haarlinie, "print" = echte mm-Stärken.
lineMode: "display" | "print";
// Gewählter (angewandter) Papier-Massstab „1:N".
scaleDenominator: number;
// Aktive Ebene (Kategorie-Code) — Ziel neuer Zeichnungen (Arbeitsfokus).
activeCategoryCode: string;
// Darstellungsmodus je Panel-ID (z. B. "drawing-levels", "layers").
displayModes: Record<string, DisplayMode>;
setActiveLevelId: (id: string) => void;
setViewType: (v: ViewType) => void;
setDetail: (d: DetailLevel) => void;
setRenderMode: (m: RenderMode) => void;
setView3d: (v: View3d) => void;
setFov: (n: number) => void;
setPlanColorMode: (m: "color" | "mono") => void;
setReferenceLines: (b: boolean) => void;
setLineMode: (m: "display" | "print") => void;
setScaleDenominator: (n: number) => void;
setActiveCategoryCode: (code: string) => void;
/** Darstellungsmodus eines Panels lesen (Default „all"). */
modeFor: (id: string | null) => DisplayMode;
/** Darstellungsmodus eines Panels setzen (No-op bei null id). */
setModeFor: (id: string | null, mode: DisplayMode) => void;
}
export function createViewSlice(api: StoreApi<ViewSlice>): ViewSlice {
const { set, get } = api;
return {
activeLevelId: sampleProject.drawingLevels[0].id,
viewType: "grundriss",
viewTypeByLevel: {},
detail: "mittel",
renderMode: "shaded",
view3d: "perspective",
fov: 50,
planColorMode: "color",
referenceLines: false,
lineMode: "display",
scaleDenominator: 100,
activeCategoryCode:
sampleProject.walls[0]?.categoryCode ?? sampleProject.layers[0].code,
displayModes: {},
setActiveLevelId: (id) =>
set((s) => ({
activeLevelId: id,
viewType: s.viewTypeByLevel[id] ?? "grundriss",
})),
setViewType: (v) =>
set((s) => ({
viewType: v,
viewTypeByLevel: { ...s.viewTypeByLevel, [s.activeLevelId]: v },
})),
setDetail: (d) => set({ detail: d }),
setRenderMode: (m) => set({ renderMode: m }),
setView3d: (v) => set({ view3d: v }),
setFov: (n) => set({ fov: n }),
setPlanColorMode: (m) => set({ planColorMode: m }),
setReferenceLines: (b) => set({ referenceLines: b }),
setLineMode: (m) => set({ lineMode: m }),
setScaleDenominator: (n) => set({ scaleDenominator: n }),
setActiveCategoryCode: (code) => set({ activeCategoryCode: code }),
modeFor: (id) => (id && get().displayModes[id]) || DEFAULT_DISPLAY_MODE,
setModeFor: (id, mode) => {
if (!id) return;
set((s) => ({ displayModes: { ...s.displayModes, [id]: mode } }));
},
};
}