Raumstempel-Panel: Hoehe + Ausrichtung weg, kommt aus Oberleiste

UX-Konsolidierung: Texthoehe und Ausrichtung wurden bisher doppelt
gesetzt (Panel + Oberleiste-Text-Block). Jetzt nur noch via Oberleiste
wenn der Stempel selektiert ist — Panel zeigt nur noch den Skala-Modus
(fix/masstab) als kompakten Dropdown.

Backend: _sync_raum_stamps_to_source spiegelt jetzt auch
TextHorizontalAlignment vom Stempel zur Source (Left/Center/Right →
links/mid/rechts). Damit kommt die User-Wahl aus der Oberleiste sauber
in die UserStrings — und wird beim naechsten Regen + bei Stil-Speichern
korrekt uebernommen.

Frontend RaumProperties:
- Ausrichtung-Zeile (3 BarToggles) raus
- Hoehe-Zeile reduziert auf Skala-Modus-Dropdown:
  "fix · Hoehe = Oberleiste-Wert (m)" | "masstab · skaliert mit Plan-Massstab"
- Local-State txtH + setTxtH entfernt (unused)
- Stempel-Stil-Speichern liest weiter raum.txtH + raum.align (kommen
  jetzt vom Sync) → captured korrekt
This commit is contained in:
2026-05-26 23:33:38 +02:00
parent 662ce87e98
commit f208e7fc00
2 changed files with 35 additions and 51 deletions
+17 -50
View File
@@ -920,20 +920,14 @@ function RaumProperties({ raum, geschosse, onUpdate, onDelete, hatchPatterns, fo
const [name, setName] = useState(raum.name || 'Raum')
const [nummer, setNummer] = useState(raum.nummer || '')
const [funktion, setFunktion] = useState(raum.funktion || '')
// Texthoehe lokal puffern — Modus bestimmt Einheit (m bei fix, mm bei masstab)
// Texthoehe (raum.txtH) + Ausrichtung (raum.align) werden via Oberleiste
// gesetzt — kein Local-State noetig, Stil-Speichern liest direkt aus raum.
const txtModus = raum.txtModus || 'fix'
const txtHDisplay = (() => {
const v = parseFloat(raum.txtH)
if (Number.isNaN(v)) return ''
return String(v)
})()
const [txtH, setTxtH] = useState(txtHDisplay)
useEffect(() => {
setName(raum.name || 'Raum')
setNummer(raum.nummer || '')
setFunktion(raum.funktion || '')
setTxtH(txtHDisplay)
}, [raum.id, raum.name, raum.nummer, raum.funktion, raum.txtH, raum.txtModus])
}, [raum.id, raum.name, raum.nummer, raum.funktion])
// Aktueller Wert von raum_fuellung: "" | "Solid" | "Hatch1" | … | "ByLayer"
const fuell = raum.fuellung || ''
@@ -1075,48 +1069,21 @@ function RaumProperties({ raum, geschosse, onUpdate, onDelete, hatchPatterns, fo
</select>
</div>
{/* Skala-Modus: fix = Modellhoehe in m (Oberleiste setzt direkt);
masstab = Paper-mm @ Plan-Massstab (Oberleiste-Hoehe wird zur
Render-Zeit berechnet, nicht gespiegelt). Hoehe + Ausrichtung
werden via Oberleiste-Text-Block gesetzt wenn der Stempel
selektiert ist — _sync_raum_stamps_to_source spiegelt die
Werte automatisch auf die Source-UserStrings. */}
<div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
<span style={{ fontSize: 10, color: 'var(--text-secondary)', width: 60 }}>Ausrichtung</span>
<div style={{ flex: 1, display: 'flex', gap: 3 }}>
{RAUM_ALIGN.map(a => (
<BarToggle key={a.code}
icon={a.icon}
active={(raum.align || 'mid') === a.code}
onClick={() => onUpdate({ align: a.code })}
title={a.label} />
))}
</div>
</div>
{/* Texthoehe + Modus: fix = m, masstab = mm-auf-Papier (skaliert mit
aktivem Plan-Massstab). Bei masstab wirkt jede Massstabs-
Aenderung der Oberleiste auch auf den Stempel. */}
<div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
<span style={{ fontSize: 10, color: 'var(--text-secondary)', width: 60 }}>Höhe</span>
<div style={{ flex: 1, display: 'flex', gap: 4, alignItems: 'center' }}>
<select value={txtModus}
onChange={(e) => onUpdate({ txtModus: e.target.value })}
title="Modus: fix = Modellhoehe in Meter; masstab = Paper-mm, skaliert mit aktivem Plan-Massstab"
style={{ flex: 1, fontSize: 11 }}>
<option value="fix">fix (m)</option>
<option value="masstab">masstab (mm)</option>
</select>
<input type="text" value={txtH}
onChange={(e) => setTxtH(e.target.value)}
onBlur={() => {
const v = parseFloat(txtH)
if (v > 0 && v !== raum.txtH) onUpdate({ txtH: v })
else setTxtH(txtHDisplay)
}}
onKeyDown={(e) => { if (e.key === 'Enter') e.target.blur() }}
title={txtModus === 'masstab' ? 'Texthoehe in Paper-mm' : 'Texthoehe in m'}
style={{ width: 56, fontSize: 11, textAlign: 'right',
fontFamily: 'DM Mono, monospace' }} />
<span style={{ fontSize: 9, color: 'var(--text-muted)',
minWidth: 14 }}>
{txtModus === 'masstab' ? 'mm' : 'm'}
</span>
</div>
<span style={{ fontSize: 10, color: 'var(--text-secondary)', width: 60 }}>Skala</span>
<select value={txtModus}
onChange={(e) => onUpdate({ txtModus: e.target.value })}
title="fix: Hoehe in m via Oberleiste · masstab: Paper-mm via Massstab"
style={{ flex: 1, fontSize: 11 }}>
<option value="fix">fix · Hoehe = Oberleiste-Wert (m)</option>
<option value="masstab">masstab · skaliert mit Plan-Massstab</option>
</select>
</div>
<div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>