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
+7 -20
View File
@@ -2,8 +2,7 @@ import { useState, useRef, useMemo, useEffect } from 'react'
import Icon from './Icon'
import ConfirmDeleteEbene from './ConfirmDeleteEbene'
import ContextMenu from './ContextMenu'
import EbenenSettingsDialog from './EbenenSettingsDialog'
import { setLayerStyle, deleteEbene, moveSelectionToEbene } from '../lib/rhinoBridge'
import { setLayerStyle, deleteEbene, moveSelectionToEbene, openEbenenSettings } from '../lib/rhinoBridge'
const MODES = [
{ value: 'all', label: 'Alle anzeigen' },
@@ -266,7 +265,8 @@ export default function EbenenManager({
const [ctxMenu, setCtxMenu] = useState(null) // { x, y, code }
const [clipboard, setClipboard] = useState(null) // { color, lw }
const [autoEdit, setAutoEdit] = useState(null) // { code, field, token }
const [settingsCode, setSettingsCode] = useState(null) // code der Ebene deren Einstellungen offen sind
// Settings-Dialog laeuft jetzt in einem echten Rhino-Fenster (Satellite-
// Window via Eto.Form + WebView). State hier nicht mehr noetig.
// Bei Auto-Edit: in View scrollen
useEffect(() => {
@@ -409,7 +409,10 @@ export default function EbenenManager({
}
const ctxItems = (code) => [
{ label: 'Ebeneneinstellungen…', icon: 'settings', onClick: () => setSettingsCode(code) },
{ label: 'Ebeneneinstellungen…', icon: 'settings', onClick: () => {
const target = ebenen.find(e => e.code === code)
if (target) openEbenenSettings(target, hatchPatterns)
} },
{ divider: true },
{ label: 'Selektion hierher übertragen', icon: 'move_down', onClick: () => moveSelectionToEbene(code) },
{ divider: true },
@@ -583,22 +586,6 @@ export default function EbenenManager({
/>
)}
{settingsCode && (() => {
const target = ebenen.find(e => e.code === settingsCode)
if (!target) { setSettingsCode(null); return null }
return (
<EbenenSettingsDialog
ebene={target}
hatchPatterns={hatchPatterns}
onSave={(updated) => {
// Code-Wechsel handhaben (eindeutiger key)
onChange(ebenen.map(e => e.code === settingsCode ? updated : e))
setSettingsCode(null)
}}
onClose={() => setSettingsCode(null)}
/>
)
})()}
</>
)
}