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:
+14
-3
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user