Panels poliert: Ebenenkombi in Oberleiste, Satelliten-Dialoge, Caps weg, Perf
- Ebenenkombination raus aus Ebenen-Panel, in Oberleiste-Topbar + Editor-Satellite (AusschnittLayerDialog embedded). doc.Strings haelt active_comb_name, auto-clear bei manueller Eye/Lock-Aenderung. - EbenenSettingsDialog jetzt Satellite mit Ebene-Picker-Dropdown (auto-save on switch via SAVE_KEEP). - Per-Ausschnitt Einstellungen-Satellite (Massstab, Display, Overrides, Ebenenkombi). Alte 'Sichtbarkeit bearbeiten'-Option entfernt. - Layouts/Ausschnitte: Top-Header weg, Sticky-Footer mit Anzahl + Aktionen. LayoutDialog ist jetzt Satellite mit Format-Live-Preview. - Panel-Captions + Default-Ebenen-Namen auf Mixed-Case (Ausschnitte, Ebenen, Waende ...). Nur DOSSIER bleibt caps. - DimensionenApp: Card-Optik raus, REF-Wuerfel mit Kreisen statt Quadraten + Hover-Scale. - GeschossManager angeglichen an EbenenManager: Rechtsklick-Menue, Lock-Button, Delete-X, Duplizieren. layer_builder honoriert z.locked. - Active Sublayer folgt jetzt dem Geschoss-Wechsel (gleicher Code unter neuem Parent). Performance Geschoss-Wechsel: - elemente._send_state() ersetzt durch _notify_active_geschoss() (Partial-Push statt 200+ Elements re-enumerieren). - _apply_visibility dedupe via sticky last-applied-signature (STATE_SYNC-Echo loopt nicht mehr durch alle Layer). - _update_clipping nur wenn alt oder neu hasClipping=True. - Redundante doc.Views.Redraw() im CPlane-Pfad entfernt — die folgende apply_visibility-Roundtrip redrawt 30ms spaeter ohnehin. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
+65
-1
@@ -281,6 +281,7 @@ class LayoutsBridge(panel_base.BaseBridge):
|
||||
elif t == "ADD_FOLDER": self._add_folder(p.get("name"))
|
||||
elif t == "REMOVE_FOLDER": self._remove_folder(p.get("name"))
|
||||
elif t == "SET_FOLDER": self._set_folder(p.get("id"), p.get("folder") or "")
|
||||
elif t == "OPEN_LAYOUT_DIALOG": self._open_layout_dialog(p)
|
||||
|
||||
# --- State-Snapshot -----------------------------------------------------
|
||||
|
||||
@@ -737,6 +738,69 @@ class LayoutsBridge(panel_base.BaseBridge):
|
||||
print("[LAYOUTS] sync layout:", ex)
|
||||
self._send_state()
|
||||
|
||||
def _open_layout_dialog(self, p):
|
||||
"""Oeffnet ein Satelliten-Fenster mit dem Layout-Erstellen/Bearbeiten
|
||||
Dialog. mode = 'new' | 'edit'. Bei 'edit' wird `layout` (id, name,
|
||||
width, height) mitgeschickt."""
|
||||
outer = self
|
||||
mode = (p.get("mode") or "new")
|
||||
layout = p.get("layout") or None
|
||||
bridge_holder = {"form": None}
|
||||
|
||||
def _apply(payload):
|
||||
if mode == "new":
|
||||
outer._new_layout({
|
||||
"name": payload.get("name") or "",
|
||||
"format": payload.get("format") or "A3",
|
||||
"landscape": bool(payload.get("landscape", True)),
|
||||
"customWidth": payload.get("customWidth"),
|
||||
"customHeight": payload.get("customHeight"),
|
||||
})
|
||||
elif mode == "edit" and layout and layout.get("id"):
|
||||
outer._set_page_size({
|
||||
"id": layout.get("id"),
|
||||
"format": payload.get("format") or "A3",
|
||||
"landscape": bool(payload.get("landscape", True)),
|
||||
"customWidth": payload.get("customWidth"),
|
||||
"customHeight": payload.get("customHeight"),
|
||||
})
|
||||
|
||||
class _LayoutDialogBridge(panel_base.BaseBridge):
|
||||
def __init__(self):
|
||||
panel_base.BaseBridge.__init__(self, "layout_dialog")
|
||||
def _on_ready(self):
|
||||
self.send("LAYOUT_DIALOG_STATE", {
|
||||
"mode": mode,
|
||||
"layout": layout,
|
||||
})
|
||||
def handle(self, data):
|
||||
if not isinstance(data, dict): return
|
||||
t = data.get("type", "")
|
||||
pp = data.get("payload") or {}
|
||||
if t == "READY":
|
||||
self._on_ready()
|
||||
elif t == "SAVE":
|
||||
_apply(pp)
|
||||
try:
|
||||
f = bridge_holder.get("form")
|
||||
if f is not None: f.Close()
|
||||
except Exception: pass
|
||||
elif t == "CANCEL":
|
||||
try:
|
||||
f = bridge_holder.get("form")
|
||||
if f is not None: f.Close()
|
||||
except Exception: pass
|
||||
|
||||
b = _LayoutDialogBridge()
|
||||
title = "Neues Layout" if mode == "new" else "Papierformat: {}".format(
|
||||
(layout or {}).get("name", ""))
|
||||
bridge_holder["form"] = panel_base.open_satellite_window(
|
||||
"layout_dialog",
|
||||
params={"mode": mode, "layout": layout},
|
||||
title=title,
|
||||
size=(440, 380),
|
||||
bridge=b)
|
||||
|
||||
|
||||
def _bridge_factory():
|
||||
b = LayoutsBridge()
|
||||
@@ -744,6 +808,6 @@ def _bridge_factory():
|
||||
return b
|
||||
|
||||
|
||||
panel_base.register_and_open("layouts", "LAYOUTS", PANEL_GUID_STR,
|
||||
panel_base.register_and_open("layouts", "Layouts", PANEL_GUID_STR,
|
||||
_bridge_factory,
|
||||
icon_spec=("view_quilt", "#7a5fa8"))
|
||||
|
||||
Reference in New Issue
Block a user