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:
+22
-36
@@ -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);
|
||||||
|
|||||||
@@ -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,
|
||||||
|
};
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user