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