Settings-Dialoge in echten Rhino-Fenstern (Eto.Form + WebView)

Statt Overlay-im-Panel oeffnet sich der Settings-Dialog jetzt als
echtes Rhino-Fenster (verschiebbar, resizable, mehrere parallel).

Infrastruktur in panel_base.py:
- load_inline akzeptiert jetzt `params` (dict) und injiziert sie
  als window.PANEL_PARAMS — Satelliten-Apps lesen ihren initialen
  State daraus.
- Neue Funktion open_satellite_window(mode, params, title, size,
  on_save, on_cancel): erstellt Eto.Forms.Form mit eingebetteter
  WebView, eigenem Inline-Bridge fuer SAVE/CANCEL-Messages, ruft
  Callbacks auf und schliesst das Fenster.

Backend rhinopanel.py:
- Neue Message-Handler OPEN_GESCHOSS_SETTINGS und OPEN_EBENEN_SETTINGS.
- _open_geschoss_settings: oeffnet das Satelliten-Fenster mit dem
  Geschoss als Payload. on_save: replace im doc.Strings z-Liste +
  _apply(save_z=True).
- _open_ebenen_settings: gleich, aber fuer Ebene + hatchPatterns.

Neue React-Entries:
- GeschossSettingsApp.jsx: wrappt GeschossSettingsDialog, liest
  window.PANEL_PARAMS, schickt SAVE/CANCEL direkt via document.title-
  Bridge.
- EbenenSettingsApp.jsx: gleich fuer EbenenSettingsDialog.

main.jsx-Switch erweitert um 'geschoss_settings' und 'ebenen_settings'.

GeschossManager und EbenenManager:
- Inline-Dialog-State und -Rendering entfernt.
- onSettings ruft jetzt openGeschossSettings(z) / openEbenenSettings(e)
  in der Bridge auf → Backend oeffnet das Satelliten-Fenster.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-19 01:15:12 +02:00
parent e6a39531f4
commit 1ba0bda429
8 changed files with 297 additions and 46 deletions
+9
View File
@@ -277,6 +277,15 @@ export function saveCombinationPreset(name, layers) { send('SAVE_PRESET', { na
export function saveCurrentAsCombination(name) { send('SAVE_CURRENT_AS_PRESET', { name }) }
export function deleteCombinationPreset(name) { send('DELETE_PRESET', { name }) }
// Satelliten-Fenster oeffnen — Python oeffnet ein echtes Rhino-Fenster
// (Eto.Form mit eingebetteter WebView) mit dem Settings-Dialog.
export function openGeschossSettings(geschoss) {
send('OPEN_GESCHOSS_SETTINGS', { geschoss })
}
export function openEbenenSettings(ebene, hatchPatterns) {
send('OPEN_EBENEN_SETTINGS', { ebene, hatchPatterns })
}
export function applyVisibility(activeZ, zeichnungsebenen, activeCode, ebenen, zMode, eMode) {
// Split-Panels koennen mit null/[] fuer fremde Slice aufrufen — Backend
// fuellt aus doc.Strings. Hier robust gegen alles Falsy.