Overrides als Satelliten-Fenster vom Oberleiste-Gear öffnen

OVERRIDES war als gedocktes Panel zu schmal. Jetzt: kein Panel mehr,
sondern ein echtes Rhino-Fenster (Eto.Form + WebView, frei verschieb-
und resizable), das vom Oberleiste-Gear-Button geoeffnet wird.

panel_base.open_satellite_window:
- Akzeptiert jetzt optional einen `bridge`-Parameter. Wenn gegeben,
  wird die Custom-Bridge (z.B. OverridesBridge) statt der einfachen
  inline SAVE/CANCEL-Bridge benutzt. So koennen vollwertige Panels
  (mit bidirektionalem Mess-Verkehr) als Satellite-Fenster laufen.

overrides_panel.py:
- register_and_open entfaellt — Overrides wird nicht mehr als Panel
  registriert.
- Neue Funktion open_as_window(): erstellt OverridesBridge, registriert
  sie in sticky["overrides_bridge"] und oeffnet als Satellite-Window.
  Listener werden lazy beim ersten Aufruf installiert
  (_ensure_listeners_once).

oberleiste.py:
- OPEN_OVERRIDES_PANEL ruft jetzt overrides_panel.open_as_window()
  statt RhinoUI.Panels.OpenPanel().

OberleisteApp.jsx:
- Settings-Gear (ToolButton mit icon="settings") nach dem Preset-
  Dropdown im Overrides-Bereich. Click ruft openOverridesPanel() →
  oeffnet das Satelliten-Fenster.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-19 01:39:07 +02:00
parent b1b2090b3e
commit 42d9c1e27b
4 changed files with 72 additions and 45 deletions
+30 -9
View File
@@ -211,16 +211,37 @@ class OverridesBridge(panel_base.BaseBridge):
self._send_state()
def _bridge_factory():
def _ensure_listeners_once():
"""Overrides-Listener nur EINMAL global installieren (statt bei jedem
open_as_window)."""
if sc.sticky.get("overrides_listeners_installed"):
return
try:
overrides.install_listeners()
sc.sticky["overrides_listeners_installed"] = True
except Exception as ex:
print("[OVERRIDES] install_listeners:", ex)
def open_as_window():
"""Oeffnet OVERRIDES als echtes Rhino-Fenster (Eto.Form + WebView).
Wird vom Oberleiste-Bridge bei OPEN_OVERRIDES_PANEL gerufen.
Pro Fenster eine eigene OverridesBridge-Instanz. Die letzte Instanz
landet in sticky["overrides_bridge"] — andere Panels (Oberleiste) die
Cross-Updates an Overrides senden, treffen das aktive Fenster."""
_ensure_listeners_once()
b = OverridesBridge()
try: overrides.install_listeners()
except Exception as ex: print("[OVERRIDES] install_listeners:", ex)
# Bridge im sticky ablegen, damit andere Panels (z.B. Oberleiste) sie
# bei Cross-Panel-Updates erreichen koennen.
sc.sticky["overrides_bridge"] = b
return b
panel_base.open_satellite_window(
"overrides",
title="OVERRIDES",
size=(760, 580),
bridge=b)
panel_base.register_and_open("overrides", "OVERRIDES", PANEL_GUID_STR, _bridge_factory,
icon_spec=("tune", "#b5621e"),
min_size=(720, 560))
# OVERRIDES laeuft jetzt als Satelliten-Fenster (geoeffnet vom Oberleiste-
# Gear-Button), nicht mehr als gedocktes Panel. Listener werden lazy beim
# ersten open_as_window installiert. Falls jemand das alte Panel via
# Workspace-Layout noch geoeffnet hat, wird es nicht mehr registriert →
# Rhino zeigt es leer / nicht mehr an.