b1e7fdf8fc
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.
110 lines
4.4 KiB
TypeScript
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 } }));
|
|
},
|
|
};
|
|
}
|