2D: Zifferntasten während Punkt-Griff-Bearbeitung nicht mehr als Werkzeug-Wechsel

Bug (Nutzer-Report direkt nach dem vorigen Commit): sobald man nach Tab
einen Länge-/Winkel-Wert eintippte, wechselte die App mitten in die
Griff-Bearbeitung ins Zeichenwerkzeug (z.B. "3" -> Kreis-Werkzeug).

Ursache: useToolNumberShortcuts (Vectorworks-Zifferntasten fürs
Werkzeug wählen) erlaubt Zifferntasten auch bei fokussiertem, leerem
Befehlsfeld, SOFERN die Zeichen-Engine gerade keinen Befehl mit
Feldern laufen hat (`!eng.hasFields() && !eng.acceptsFreeText()`).
Genau das trifft während der Griff-Bearbeitung IMMER zu, da dort gar
keine Engine-Befehl läuft, sondern der separate Feld-Controller aus
useGripEditing.ts -- der Wächter kannte diesen zweiten Fall nicht.

Fix: gripDragInfoRef (schon vorhanden, zeigt "ein Punkt-Griff ist
bewaffnet" an) wird von useGripEditing zurückgegeben und an
useToolNumberShortcuts durchgereicht; dessen Handler bricht jetzt ganz
vorne ab, wenn ein Griff bewaffnet ist -- unabhängig davon, ob/wo
gerade Fokus liegt. Der useToolNumberShortcuts-Aufruf in App.tsx
musste dafür hinter den useGripEditing()-Aufruf wandern (Reihenfolge
war vorher umgekehrt, gripDragInfoRef existierte an der alten Stelle
noch nicht).
This commit is contained in:
2026-08-21 23:13:02 +02:00
parent a6c984e517
commit f9b202ac25
3 changed files with 25 additions and 5 deletions
+8
View File
@@ -124,6 +124,7 @@ export function useToolNumberShortcuts(
onSelectTool: (id: ToolId) => void,
isFloor: boolean,
engineRef: RefObject<CommandEngine | null>,
gripDragInfoRef?: RefObject<{ index: number; raw: Vec2 } | null>,
): void {
const toolShortcutRef = useRef({ onSelectTool, floor: isFloor });
toolShortcutRef.current = { onSelectTool, floor: isFloor };
@@ -142,6 +143,13 @@ export function useToolNumberShortcuts(
};
const onKey = (e: KeyboardEvent) => {
if (e.ctrlKey || e.metaKey || e.altKey) return;
// Ein Punkt-Griff ist bewaffnet (s. useGripEditing.ts) — Zifferntasten
// gehören dann IMMER dessen Länge/Winkel-Feld, nie dem Werkzeug-Wechsel.
// Die `eng?.hasFields()`-Prüfung unten greift hier nicht, weil während
// der Griff-Bearbeitung gar kein Zeichenbefehl der Engine läuft (Bug:
// getippter Wert schaltete auf das per Ziffer gemappte Zeichenwerkzeug
// um, sobald das leere, fokussierte Befehlsfeld erkannt wurde).
if (gripDragInfoRef?.current) return;
const el = e.target as HTMLElement | null;
const isInput =
!!el && (el.tagName === "INPUT" || el.tagName === "TEXTAREA" || el.isContentEditable);