Zeichnen: getippte Werte live im Cursor-HUD + direktes Zahlen-Tippen

VW-Verhalten vervollständigt: das Cursor-Kästchen spiegelt jetzt den Feld-
Status der Befehlszeile (Tab-Feld-Zyklus) — der getippte Wert erscheint
SOFORT im aktiven Feld oben am Cursor UND unten im Befehl; gelockte Werte
fett/dunkel, das aktive Tab-Ziel als blaue Pille mit weissem Text. Tab
wechselt Länge ↔ Winkel (global, auch ohne Fokus), und eine Ziffer (oder
. , -) beim Zeichnen startet die Werteingabe direkt (beginTyping fokussiert
die Befehlszeile mit dem ersten Zeichen — kein Klick nötig).

- PlanView: HudFieldsState + Segment-HUD (aktiv/gelockt/getippt je Feld)
- CommandLine: onTextChange (Live-Echo) + Handle beginTyping(seed)
- App: cmdTyped-State, hudFields an alle PlanView-Pfade, globaler
  Ziffern-Handler vor dem Tab-Zyklus
737/737 grün.
This commit is contained in:
2026-07-11 00:52:52 +02:00
parent 038054fee6
commit 8f85e135ee
4 changed files with 178 additions and 21 deletions
+22 -2
View File
@@ -48,6 +48,12 @@ export interface CommandLineProps {
onCycleField: () => void;
/** Esc: laufenden Befehl abbrechen. */
onCancel: () => void;
/**
* Live-Echo des Eingabetexts (bei jeder Änderung, inkl. Leeren nach Submit/
* Esc) — speist das Cursor-HUD, das den getippten Wert im aktiven Feld
* spiegelt (VW-Verhalten: tippen → Wert erscheint oben UND unten).
*/
onTextChange?: (text: string) => void;
/** Autocomplete-Kandidaten für ein Präfix (nur im Ruhezustand sinnvoll). */
suggest: (prefix: string) => string[];
}
@@ -55,18 +61,32 @@ export interface CommandLineProps {
export interface CommandLineHandle {
/** Fokussiert (und öffnet) das Eingabefeld — vom globalen Tab-Handler genutzt. */
focus: () => void;
/**
* Startet die Zahleneingabe mit einem ersten Zeichen (globales Tippen beim
* Zeichnen, ohne dass das Feld fokussiert war): fokussiert + setzt den Text.
*/
beginTyping: (seed: string) => void;
}
export const CommandLine = forwardRef<CommandLineHandle, CommandLineProps>(
function CommandLine(
{ active, promptKey, options, fields, onSubmit, onOption, onCycleField, onCancel, suggest },
{ active, promptKey, options, fields, onSubmit, onOption, onCycleField, onCancel, suggest, onTextChange },
ref,
) {
const [text, setText] = useState("");
const [text, setTextRaw] = useState("");
const inputRef = useRef<HTMLInputElement>(null);
// Jede Textänderung (auch programmatisch/Leeren) ans Live-Echo melden.
const setText = (v: string) => {
setTextRaw(v);
onTextChange?.(v);
};
useImperativeHandle(ref, () => ({
focus: () => inputRef.current?.focus(),
beginTyping: (seed: string) => {
setText(seed);
inputRef.current?.focus();
},
}));
// Autocomplete nur im Ruhezustand (Befehlsname tippen), nicht in einem Schritt.