Text-Block: Bug-Fix + Vectorworks-Style + Edit-Selected

User-Probleme:
1. Floating Eto-Dialog erschien nicht nach GetPoint (Mac-Bug)
2. UI war zu klobig, sollte vectorworks-mässig kompakt sein, "+" als
   kleines Icon-Symbol
3. Selektierten Text aendern war nicht moeglich

Fix 1 — Bug: _floating_input geloescht, ersetzt durch
_prompt_for_text() das Rhino.UI.Dialogs.ShowEditBox benutzt. Nativer
cross-platform Dialog ohne Eto-Modal-Bug. Workflow:
  GetPoint → ShowEditBox → AddText. Funktioniert auf Mac.

Fix 2 — UI: Text-Block kompakt umgebaut.
  Reihe 1: [Font ▼] | [Size m]   (130 + 60 = 196px)
  Reihe 2: [B][I][+] segmented pill (gleiche Breite wie Reihe 1)
"+" ist jetzt kleines add-icon (size 13), kein "+ Text" Label mehr.

Fix 3 — Edit-Selection: neue Funktionen in text_create.py:
- _selected_text_objects(doc) → Liste der selektierten TextEntities
- read_selection_settings(doc) → Settings der ersten Selektion
- apply_settings_to_selection(doc, patch) → wendet font/size/bold/italic
  auf alle selektierten TextEntities an
oberleiste.SET_TEXT_SETTINGS handler appliziert die Aenderung jetzt
ZUSAETZLICH auf die Selection (wenn vorhanden) — UND speichert als
Default. State enthaelt textSelectionSettings, UI nutzt diese als
Anzeige-Werte wenn vorhanden (Werte spiegeln Selektion live).
Visual: Border-Color der Size/Segmented-Pill wird accent wenn Selection
aktiv ist (Hinweis dass Aenderungen auf Selektion wirken).

Sig-Update: textSelectionSettings + lastSetView in last_state_sig damit
State neu gepusht wird wenn sich Selection/View aendert.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-21 00:32:16 +02:00
parent 38314bcc6f
commit 6fce00343c
3 changed files with 164 additions and 117 deletions
+14 -3
View File
@@ -931,8 +931,12 @@ class OberleisteBridge(panel_base.BaseBridge):
elif t == "SET_TEXT_SETTINGS":
try:
import text_create
text_create.save_settings(
Rhino.RhinoDoc.ActiveDoc, p.get("settings") or {})
doc = Rhino.RhinoDoc.ActiveDoc
patch = p.get("settings") or {}
text_create.save_settings(doc, patch)
# Wenn TextEntities selektiert: gleiche Aenderung direkt
# auf die selektierten Texte applizieren.
text_create.apply_settings_to_selection(doc, patch)
except Exception as ex:
print("[OBERLEISTE] text settings:", ex)
self._send_state(force=True)
@@ -1183,15 +1187,19 @@ class OberleisteBridge(panel_base.BaseBridge):
except Exception:
info["massePresets"] = []
info["masseActiveId"] = None
# Text-Settings + verfuegbare Fonts (Fonts nur einmal initial)
# Text-Settings + verfuegbare Fonts (Fonts nur einmal initial).
# Wenn TextEntity selektiert ist, deren Settings ergaenzen damit
# die UI die Werte des selektierten Textes spiegelt.
try:
import text_create
info["textSettings"] = text_create.load_settings(doc)
info["textSelectionSettings"] = text_create.read_selection_settings(doc)
if not getattr(self, "_fonts_sent", False):
info["textFonts"] = text_create.available_fonts()
self._fonts_sent = True
except Exception:
info["textSettings"] = {}
info["textSelectionSettings"] = None
# Norden-Rotation fuer N/O/S/W-Buttons
try:
import kamera
@@ -1230,6 +1238,9 @@ class OberleisteBridge(panel_base.BaseBridge):
_names_tuple, _active_comb,
info.get("masseActiveId"),
tuple((p.get("id"), p.get("name")) for p in (info.get("massePresets") or [])),
# textSelectionSettings: dict → tuple fuer sig-Vergleich
tuple(sorted((info.get("textSelectionSettings") or {}).items())) if info.get("textSelectionSettings") else None,
info.get("lastSetView"),
prompt,
)
if not force and sig == self._last_state_sig: