Zeichenwerkzeug-Zustand aus App.tsx in useDrawingToolState() extrahiert

Bündelt aktives Werkzeug, Wandtyp/Linienstil, Snap-Einstellungen,
Werkzeug-Zustand-Ref, Draft-Vorschau, aktive Transformation
(Bewegen/Spiegeln/Drehen) und die Kopienanzahl für Array/Distribute
(Teil der laufenden App.tsx-Verkleinerung).
This commit is contained in:
2026-07-22 00:35:12 +02:00
parent e41821c97a
commit b3e6aaaec1
2 changed files with 96 additions and 36 deletions
+22 -36
View File
@@ -139,11 +139,9 @@ import {
transformPreview, transformPreview,
} from "./tools/transform"; } from "./tools/transform";
import type { CopyMode, TransformOp, TransformSelection } from "./tools/transform"; import type { CopyMode, TransformOp, TransformSelection } from "./tools/transform";
import { DEFAULT_SNAP } from "./tools/types";
import type { import type {
MeasurementReadout, MeasurementReadout,
SnapResult, SnapResult,
SnapSettings,
ToolContext, ToolContext,
ToolDraft, ToolDraft,
ToolHandlers, ToolHandlers,
@@ -159,6 +157,7 @@ import { InlineEditor } from "./views/InlineEditor";
import { Content } from "./views/viewportContent"; import { Content } from "./views/viewportContent";
import { useDialogState } from "./state/useDialogState"; import { useDialogState } from "./state/useDialogState";
import { useTopBarState } from "./state/useTopBarState"; import { useTopBarState } from "./state/useTopBarState";
import { useDrawingToolState } from "./state/useDrawingToolState";
import { useThemeModeState } from "./theme/useThemeMode"; import { useThemeModeState } from "./theme/useThemeMode";
import { CommandLine } from "./ui/CommandLine"; import { CommandLine } from "./ui/CommandLine";
import type { CommandLineHandle, CommandLineField, CommandLineOption } from "./ui/CommandLine"; import type { CommandLineHandle, CommandLineField, CommandLineOption } from "./ui/CommandLine";
@@ -433,40 +432,27 @@ export default function App() {
// Aktives Werkzeug, Werkzeug-Parameter (Wandtyp/Kategorie/Linienstil), Snap- // Aktives Werkzeug, Werkzeug-Parameter (Wandtyp/Kategorie/Linienstil), Snap-
// Einstellungen sowie der laufende Werkzeug-Zustand (Ref, kein Re-Render je // Einstellungen sowie der laufende Werkzeug-Zustand (Ref, kein Re-Render je
// Mausbewegung) und die Live-Vorschau (Draft → Overlay in PlanView). // Mausbewegung) und die Live-Vorschau (Draft → Overlay in PlanView).
const [activeTool, setActiveTool] = useState<ToolId>("select"); const {
const [activeWallTypeId, setActiveWallTypeId] = useState<string>( activeTool,
project.wallTypes[0].id, setActiveTool,
); activeWallTypeId,
const activeCategoryCode = useStore((s) => s.activeCategoryCode); setActiveWallTypeId,
const setActiveCategoryCode = useStore((s) => s.setActiveCategoryCode); activeCategoryCode,
const [activeLineStyleId] = useState<string>(project.lineStyles[0].id); setActiveCategoryCode,
const [snap, setSnap] = useState<SnapSettings>(DEFAULT_SNAP); activeLineStyleId,
const toolStateRef = useRef<ToolState>(getTool("select").init()); snap,
const [draft, setDraft] = useState<ToolDraft | null>(null); setSnap,
// Aktive Transformation (Bewegen/Spiegeln/Drehen) auf der Auswahl — Vectorworks- toolStateRef,
// Stil mit U/I/O/P-Modusleiste. null = keine Transformation läuft. draft,
const [activeTransform, setActiveTransform] = useState<{ setDraft,
op: TransformOp; activeTransform,
copyMode: CopyMode; setActiveTransform,
count: number; transformDragInfoRef,
points: Vec2[]; pendingCopyMode,
} | null>(null); setPendingCopyMode,
// Letzter gesnappter Cursor der laufenden Transformation — für das Live-Feld requestCopyCount,
// (Winkel/Distanz) der Befehlszeile (analog gripDragInfoRef beim Vertex-Drag). commitCopyCount,
const transformDragInfoRef = useRef<{ cursor: Vec2 } | null>(null); } = useDrawingToolState(project.wallTypes[0].id, project.lineStyles[0].id);
// Kopienanzahl für array/distribute wird über einen PromptDialog erfasst
// (window.prompt ist im Tauri-WKWebView deaktiviert) — `pendingCopyMode`
// hält den Modus, während der Dialog offen ist.
const [pendingCopyMode, setPendingCopyMode] = useState<"array" | "distribute" | null>(null);
const requestCopyCount = (mode: "array" | "distribute") => setPendingCopyMode(mode);
const commitCopyCount = (input: string) => {
const n = Math.round(Number(input));
if (Number.isFinite(n) && n >= 1 && pendingCopyMode) {
const mode = pendingCopyMode;
setActiveTransform((t) => (t ? { ...t, copyMode: mode, count: n } : t));
}
setPendingCopyMode(null);
};
// ── Auswahl (Store-Slice) ───────────────────────────────────────────────── // ── Auswahl (Store-Slice) ─────────────────────────────────────────────────
const selectedWallIds = useStore((s) => s.selectedWallIds); const selectedWallIds = useStore((s) => s.selectedWallIds);
+74
View File
@@ -0,0 +1,74 @@
// Bündelt den Zeichenwerkzeug-Zustand (transienter View-State; bleibt lokal):
// aktives Werkzeug, Werkzeug-Parameter (Wandtyp/Kategorie/Linienstil), Snap-
// Einstellungen sowie der laufende Werkzeug-Zustand (Ref, kein Re-Render je
// Mausbewegung), die Live-Vorschau (Draft → Overlay in PlanView) und die
// aktive Transformation (Bewegen/Spiegeln/Drehen) auf der Auswahl. Nur aus
// App() herausgezogen, um die Funktion zu entlasten — reine Zustands-
// Bündelung, keine Verhaltensänderung.
//
// Extrahiert aus App.tsx. Bezeichner englisch, Kommentare deutsch (CONVENTIONS.md).
import { useRef, useState } from "react";
import { useStore } from "./appStore";
import { getTool } from "../tools/tools";
import type { CopyMode, TransformOp } from "../tools/transform";
import { DEFAULT_SNAP } from "../tools/types";
import type { SnapSettings, ToolDraft, ToolId, ToolState } from "../tools/types";
import type { Vec2 } from "../model/types";
export function useDrawingToolState(initialWallTypeId: string, initialLineStyleId: string) {
const [activeTool, setActiveTool] = useState<ToolId>("select");
const [activeWallTypeId, setActiveWallTypeId] = useState<string>(initialWallTypeId);
const activeCategoryCode = useStore((s) => s.activeCategoryCode);
const setActiveCategoryCode = useStore((s) => s.setActiveCategoryCode);
const [activeLineStyleId] = useState<string>(initialLineStyleId);
const [snap, setSnap] = useState<SnapSettings>(DEFAULT_SNAP);
const toolStateRef = useRef<ToolState>(getTool("select").init());
const [draft, setDraft] = useState<ToolDraft | null>(null);
// Aktive Transformation (Bewegen/Spiegeln/Drehen) auf der Auswahl — Vectorworks-
// Stil mit U/I/O/P-Modusleiste. null = keine Transformation läuft.
const [activeTransform, setActiveTransform] = useState<{
op: TransformOp;
copyMode: CopyMode;
count: number;
points: Vec2[];
} | null>(null);
// Letzter gesnappter Cursor der laufenden Transformation — für das Live-Feld
// (Winkel/Distanz) der Befehlszeile (analog gripDragInfoRef beim Vertex-Drag).
const transformDragInfoRef = useRef<{ cursor: Vec2 } | null>(null);
// Kopienanzahl für array/distribute wird über einen PromptDialog erfasst
// (window.prompt ist im Tauri-WKWebView deaktiviert) — `pendingCopyMode`
// hält den Modus, während der Dialog offen ist.
const [pendingCopyMode, setPendingCopyMode] = useState<"array" | "distribute" | null>(null);
const requestCopyCount = (mode: "array" | "distribute") => setPendingCopyMode(mode);
const commitCopyCount = (input: string) => {
const n = Math.round(Number(input));
if (Number.isFinite(n) && n >= 1 && pendingCopyMode) {
const mode = pendingCopyMode;
setActiveTransform((t) => (t ? { ...t, copyMode: mode, count: n } : t));
}
setPendingCopyMode(null);
};
return {
activeTool,
setActiveTool,
activeWallTypeId,
setActiveWallTypeId,
activeCategoryCode,
setActiveCategoryCode,
activeLineStyleId,
snap,
setSnap,
toolStateRef,
draft,
setDraft,
activeTransform,
setActiveTransform,
transformDragInfoRef,
pendingCopyMode,
setPendingCopyMode,
requestCopyCount,
commitCopyCount,
};
}