Ebenen-Manager: Eye-Logik analog Geschosse + 'Alle anzeigen'-Mode
Eye-Knopf bleibt jetzt auch in „Nur aktive"-Mode sichtbar (dimmend, statt
zu verschwinden). Klick auf Eye in „Nur aktive" oder „Alle anzeigen"
wechselt automatisch zu „Ausgewählte" damit die Aktion wirkt.
Backend (layer_builder.apply_visibility): neuer e_mode 'all_force'
ueberschreibt das Eye-Flag (zeigt alle Ebenen). 'all' respektiert weiter
das Flag (= „Ausgewählte" im UI).
Frontend (EbenenManager):
- MODES: 'all_force'=„Alle anzeigen" hinzu, 'all' umbenannt zu „Ausgewählte"
- EbeneRow: eyeIcon/eyeOpacity/eyeTitle nach Mode, analog GeschossManager
- handleToggleVisible + Master-Eye: bei active/all_force → onModeChange('all')
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -767,10 +767,15 @@ def apply_visibility(doc, zeichnungsebenen, ebenen, active_z_id, active_code, z_
|
|||||||
is_active_e = (code == active_code)
|
is_active_e = (code == active_code)
|
||||||
eye_v = e_eye_vis.get(code, True)
|
eye_v = e_eye_vis.get(code, True)
|
||||||
eye_l = e_eye_locked.get(code, False)
|
eye_l = e_eye_locked.get(code, False)
|
||||||
|
# 'all_force' ueberschreibt das Eye-Flag (zeigt jede Ebene auch
|
||||||
|
# wenn die User-Sichtbarkeit aus war). 'all' respektiert das
|
||||||
|
# Flag (= "Ausgewählte" im UI).
|
||||||
if is_active_e:
|
if is_active_e:
|
||||||
e_vis, e_grey, e_lock = True, False, False
|
e_vis, e_grey, e_lock = True, False, False
|
||||||
elif e_mode == "active":
|
elif e_mode == "active":
|
||||||
e_vis, e_grey, e_lock = False, False, False
|
e_vis, e_grey, e_lock = False, False, False
|
||||||
|
elif e_mode == "all_force":
|
||||||
|
e_vis, e_grey, e_lock = True, False, False
|
||||||
elif not eye_v:
|
elif not eye_v:
|
||||||
e_vis, e_grey, e_lock = False, False, False
|
e_vis, e_grey, e_lock = False, False, False
|
||||||
elif e_mode == "all":
|
elif e_mode == "all":
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ import ContextMenu from './ContextMenu'
|
|||||||
import { setLayerStyle, deleteEbene, moveSelectionToEbene, openEbenenSettings } from '../lib/rhinoBridge'
|
import { setLayerStyle, deleteEbene, moveSelectionToEbene, openEbenenSettings } from '../lib/rhinoBridge'
|
||||||
|
|
||||||
const MODES = [
|
const MODES = [
|
||||||
{ value: 'all', label: 'Alle anzeigen' },
|
{ value: 'all_force', label: 'Alle anzeigen' },
|
||||||
|
{ value: 'all', label: 'Ausgewählte' },
|
||||||
{ value: 'active', label: 'Nur aktive' },
|
{ value: 'active', label: 'Nur aktive' },
|
||||||
{ value: 'grey', label: 'Andere grau' },
|
{ value: 'grey', label: 'Andere grau' },
|
||||||
{ value: 'grey_locked', label: 'Andere grau & gesperrt' },
|
{ value: 'grey_locked', label: 'Andere grau & gesperrt' },
|
||||||
@@ -208,11 +209,33 @@ function _allCodes(ebenen) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function EbeneRow({ e, depth, hasChildren, expanded, onToggleExpand, active, mode, onClick, onContextMenu, onToggleVisible, onToggleLock, onColorChange, onLwChange, onNameChange, onCodeChange, onDelete, autoEditCode, autoEditName, rowRef }) {
|
function EbeneRow({ e, depth, hasChildren, expanded, onToggleExpand, active, mode, onClick, onContextMenu, onToggleVisible, onToggleLock, onColorChange, onLwChange, onNameChange, onCodeChange, onDelete, autoEditCode, autoEditName, rowRef }) {
|
||||||
// Auge zeigt den Eye-State (User-Intention) — auch fuer die aktive Ebene.
|
// Auge-Logik analog GeschossManager: immer rendern, nur dimmen wenn Mode
|
||||||
// So sieht man auf einen Blick ob sie "normalerweise" sichtbar waere.
|
// das Eye-Flag ueberschreibt (active / all_force). Klick auf Auge in
|
||||||
// Aktive Ebene rendert Rhino zwar immer sichtbar, das visible-Flag bleibt
|
// diesen Modi wechselt zu "Ausgewählte" damit die Aktion wirkt.
|
||||||
// aber die gespeicherte Intention bis sie wieder de-aktiviert wird.
|
let eyeIcon, eyeOn, eyeOpacity, eyeTitle
|
||||||
const eyeShown = mode !== 'active'
|
if (active) {
|
||||||
|
eyeIcon = e.visible !== false ? 'visibility' : 'visibility_off'
|
||||||
|
eyeOn = true
|
||||||
|
eyeOpacity = 1
|
||||||
|
eyeTitle = e.visible !== false
|
||||||
|
? 'Normalerweise sichtbar (aktive Ebene wird trotzdem gezeigt)'
|
||||||
|
: 'Normalerweise ausgeblendet — wird nur sichtbar weil aktiv'
|
||||||
|
} else if (mode === 'all_force') {
|
||||||
|
eyeIcon = 'visibility'
|
||||||
|
eyeOn = true
|
||||||
|
eyeOpacity = 0.35
|
||||||
|
eyeTitle = 'Im „Alle anzeigen"-Mode immer sichtbar — Klick wechselt in „Ausgewählte"'
|
||||||
|
} else if (mode === 'active') {
|
||||||
|
eyeIcon = e.visible !== false ? 'visibility' : 'visibility_off'
|
||||||
|
eyeOn = false
|
||||||
|
eyeOpacity = 0.35
|
||||||
|
eyeTitle = 'Im „Nur aktive"-Mode ausgeblendet — Klick wechselt in „Ausgewählte"'
|
||||||
|
} else {
|
||||||
|
eyeIcon = e.visible !== false ? 'visibility' : 'visibility_off'
|
||||||
|
eyeOn = e.visible !== false
|
||||||
|
eyeOpacity = 1
|
||||||
|
eyeTitle = e.visible !== false ? 'Ausblenden' : 'Einblenden'
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
ref={rowRef}
|
ref={rowRef}
|
||||||
@@ -247,21 +270,12 @@ function EbeneRow({ e, depth, hasChildren, expanded, onToggleExpand, active, mod
|
|||||||
) : (
|
) : (
|
||||||
<span style={{ width: 14, flexShrink: 0 }} />
|
<span style={{ width: 14, flexShrink: 0 }} />
|
||||||
)}
|
)}
|
||||||
{eyeShown ? (
|
<button
|
||||||
<button
|
className={`btn-icon-sm ${eyeOn ? 'is-on' : ''}`}
|
||||||
className={`btn-icon-sm ${e.visible !== false ? 'is-on' : ''}`}
|
onClick={(ev) => { ev.stopPropagation(); onToggleVisible() }}
|
||||||
onClick={(ev) => { ev.stopPropagation(); onToggleVisible() }}
|
title={eyeTitle}
|
||||||
title={
|
style={{ opacity: eyeOpacity }}
|
||||||
active
|
><Icon name={eyeIcon} size={14} /></button>
|
||||||
? (e.visible !== false
|
|
||||||
? 'Normalerweise sichtbar (aktive Ebene wird trotzdem gezeigt)'
|
|
||||||
: 'Normalerweise ausgeblendet — wird nur sichtbar weil aktiv')
|
|
||||||
: (e.visible !== false ? 'Ausblenden' : 'Einblenden')
|
|
||||||
}
|
|
||||||
><Icon name={e.visible !== false ? 'visibility' : 'visibility_off'} size={14} /></button>
|
|
||||||
) : (
|
|
||||||
<span style={{ width: 18, flexShrink: 0 }} />
|
|
||||||
)}
|
|
||||||
|
|
||||||
<EditableText
|
<EditableText
|
||||||
value={e.code}
|
value={e.code}
|
||||||
@@ -382,6 +396,10 @@ export default function EbenenManager({
|
|||||||
const handleToggleVisible = (code) => {
|
const handleToggleVisible = (code) => {
|
||||||
const cur = _findInTree(ebenen, code)
|
const cur = _findInTree(ebenen, code)
|
||||||
if (cur) updateByCode(code, { visible: !(cur.visible !== false) })
|
if (cur) updateByCode(code, { visible: !(cur.visible !== false) })
|
||||||
|
// In "active" / "all_force" greift visible-Flag nicht — wer aufs Auge
|
||||||
|
// klickt will offensichtlich Sichtbarkeit kontrollieren, also direkt
|
||||||
|
// in den "Ausgewählte"-Mode wechseln damit die Aktion wirkt.
|
||||||
|
if (mode === 'active' || mode === 'all_force') onModeChange('all')
|
||||||
}
|
}
|
||||||
const handleToggleLock = (code) => {
|
const handleToggleLock = (code) => {
|
||||||
const cur = _findInTree(ebenen, code)
|
const cur = _findInTree(ebenen, code)
|
||||||
@@ -555,11 +573,13 @@ export default function EbenenManager({
|
|||||||
const anyVisible = ebenen.some(e => e.visible !== false)
|
const anyVisible = ebenen.some(e => e.visible !== false)
|
||||||
// Wenn irgendeine sichtbar -> alle aus. Wenn keine sichtbar -> alle an.
|
// Wenn irgendeine sichtbar -> alle aus. Wenn keine sichtbar -> alle an.
|
||||||
onChange(ebenen.map(e => ({ ...e, visible: !anyVisible })))
|
onChange(ebenen.map(e => ({ ...e, visible: !anyVisible })))
|
||||||
|
if (mode === 'active' || mode === 'all_force') onModeChange('all')
|
||||||
}}
|
}}
|
||||||
title={ebenen.every(e => e.visible !== false)
|
title={ebenen.every(e => e.visible !== false)
|
||||||
? 'Alle Ebenen ausblenden'
|
? 'Alle Ebenen ausblenden'
|
||||||
: 'Alle Ebenen einblenden'}
|
: 'Alle Ebenen einblenden'}
|
||||||
style={{ width: 18, height: 18 }}
|
style={{ width: 18, height: 18,
|
||||||
|
opacity: (mode === 'active' || mode === 'all_force') ? 0.5 : 1 }}
|
||||||
>
|
>
|
||||||
<Icon
|
<Icon
|
||||||
name={ebenen.every(e => e.visible !== false) ? 'visibility' : 'visibility_off'}
|
name={ebenen.every(e => e.visible !== false) ? 'visibility' : 'visibility_off'}
|
||||||
|
|||||||
Reference in New Issue
Block a user