Symbol-Picker als Satellite-Fenster (statt Modal im Elemente-Panel)

UX-Verbesserung: Modal-Overlay im engen Elemente-Panel war unpraktisch.
Symbol-Picker oeffnet sich jetzt als eigenstaendiges Eto.Form-Fenster
(wie Library/Project-Settings).

Frontend:
- SymbolPicker bekommt embedded-Prop (Satellite-Mount vs Modal-Overlay)
- Neuer SymbolPickerApp Satellite-Wrapper (PANEL_PARAMS lesen + Bridge)
- main.jsx: 'symbol_picker' Mode-Routing
- ElementeApp: Symbol-Button ruft nur noch listLibrary() — Backend
  oeffnet das Fenster

Backend:
- _cmd_list_library oeffnet jetzt das Satellite-Window mit eigener
  Bridge (PICK -> CREATE_SYMBOL, CANCEL -> Close)
- PICK schliesst Fenster + triggert interactive GetPoint im Viewport

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-25 03:39:03 +02:00
parent 8184f559fc
commit de57c320c2
5 changed files with 168 additions and 115 deletions
+39 -7
View File
@@ -8092,18 +8092,50 @@ class ElementeBridge(panel_base.BaseBridge):
# ------------------------------------------------------------------
def _cmd_list_library(self, p):
"""Liefert Library-Manifest ans Frontend (fuer den Symbol-Picker
im Elemente-Panel). Antwort: LIBRARY_LIST message."""
"""Oeffnet den Symbol-Picker als Satellite-Window. Lieferung der
Library-Items + Handling von PICK (User waehlt Item CREATE_SYMBOL
im aktiven Doc) und CANCEL (Fenster schliessen)."""
try:
import library
manifest = library.load_manifest()
self.send("LIBRARY_LIST", {
"items": manifest.get("items", []),
"name": manifest.get("name", "Dossier-Library"),
})
items = manifest.get("items", [])
except Exception as ex:
print("[ELEMENTE] list library:", ex)
self.send("LIBRARY_LIST", {"items": [], "name": ""})
items = []
outer_bridge = self
bridge_holder = {"form": None}
class _SymbolPickerBridge(panel_base.BaseBridge):
def __init__(self):
panel_base.BaseBridge.__init__(self, "symbol_picker")
def handle(self, data):
if not isinstance(data, dict): return
t = data.get("type", "")
pp = data.get("payload") or {}
if t == "READY": pass
elif t == "PICK":
lib_id = (pp.get("id") or "").strip()
if lib_id:
# Fenster zu, dann interactive Place
try:
f = bridge_holder.get("form")
if f is not None: f.Close()
except Exception: pass
try:
outer_bridge._cmd_create_symbol({"id": lib_id})
except Exception as ex:
print("[SYMBOL-PICKER] CREATE_SYMBOL:", ex)
elif t == "CANCEL":
try:
f = bridge_holder.get("form")
if f is not None: f.Close()
except Exception: pass
b = _SymbolPickerBridge()
bridge_holder["form"] = panel_base.open_satellite_window(
"symbol_picker",
params={"items": items},
title="Symbol einfuegen",
size=(640, 560),
bridge=b)
def _cmd_create_symbol(self, p):
"""Platziert ein Library-Item (symbol/object) im Doc. Interactive