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:
@@ -0,0 +1,44 @@
|
||||
import { useState, useEffect } from 'react'
|
||||
import AusschnittLayerDialog from './components/AusschnittLayerDialog'
|
||||
import { onMessage, notifyReady } from './lib/rhinoBridge'
|
||||
|
||||
function send(type, payload) {
|
||||
if (!window.RHINO_MODE) { console.log('[LayerCombinations] →', type, payload); return }
|
||||
document.title = 'RHINOMSG::' + JSON.stringify({ type, payload: payload || {} })
|
||||
}
|
||||
|
||||
export default function LayerCombinationsApp() {
|
||||
const [layers, setLayers] = useState([])
|
||||
const [presets, setPresets] = useState([])
|
||||
|
||||
useEffect(() => {
|
||||
onMessage('LAYER_COMBINATIONS_STATE', ({ layers: ls, presets: ps }) => {
|
||||
if (Array.isArray(ls)) setLayers(ls)
|
||||
if (Array.isArray(ps)) setPresets(ps)
|
||||
})
|
||||
notifyReady()
|
||||
}, [])
|
||||
|
||||
return (
|
||||
<div style={{
|
||||
position: 'absolute', inset: 0,
|
||||
background: 'var(--bg-base)',
|
||||
display: 'flex',
|
||||
fontFamily: 'var(--font)',
|
||||
color: 'var(--text-primary)',
|
||||
}}>
|
||||
<AusschnittLayerDialog
|
||||
embedded
|
||||
snapName="Ebenenkombinationen"
|
||||
layers={layers}
|
||||
presets={presets}
|
||||
onClose={() => send('CANCEL')}
|
||||
onSave={(draft) => send('APPLY_COMBINATION', {
|
||||
layers: draft.map(l => ({ id: l.id, visible: l.visible, locked: l.locked })),
|
||||
})}
|
||||
onSavePreset={(name, layerStates) => send('SAVE_PRESET', { name, layers: layerStates })}
|
||||
onDeletePreset={(name) => send('DELETE_PRESET', { name })}
|
||||
/>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user