View-Toggle: Active aus lastSetView + Stat-Box-Hoehe angeglichen
User-Feedback: 1. View-Bars sind hoeher als andere Elemente auf der Seite 2. Active-Highlight bleibt auf Top haengen — andere Views leuchten nicht 3. Glitch: Klick auf Top → Bar zeigt weiterhin Perspektive aktiv Fix 1 (Hoehe): Stat-Box Inhalts-Hoehe BAR_H*2+4 → BAR_H*2+6, der innere Trennstrich-Gap 4 → 6. Damit visual 50 → 52 = identisch mit den 2-row- Blocks (View, Preset, Massstab). Fix 2 + 3 (Active-Highlight): Backend trackt `self._last_set_view` ← gesetzt wenn handler in SET_VIEW erfolgreich war. Frontend matchView prueft zuerst `state.lastSetView === v` — kein Race-Condition zwischen ChangeProjection und Viewport-State-Lesen mehr. Fallback auf Viewport-State-Detection wenn lastSetView noch null (initial load). N/O/S/W kriegen jetzt auch Active-Highlight (vorher hartcoded false). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
+15
-18
@@ -772,6 +772,7 @@ class OberleisteBridge(panel_base.BaseBridge):
|
||||
self._last_state_sig = None # Fingerprint des letzten Push — dedupe
|
||||
self._cached_overrides = None # (enabled, count) — invalidiert bei Toggle/Update
|
||||
self._cached_combinations = None # (names, active) — invalidiert bei jeder Comb-Aenderung
|
||||
self._last_set_view = None # Letzte ueber Topbar gesetzte Ansicht (fuer Active-Highlight)
|
||||
# Command-Liste LAZY laden — die Enumeration durchlaeuft alle Plugins
|
||||
# und ist teuer (~hundert ms). Wird erst beim ersten _send_state, oder
|
||||
# explizit bei Command-Input-Fokus, gebaut.
|
||||
@@ -880,35 +881,29 @@ class OberleisteBridge(panel_base.BaseBridge):
|
||||
vp = kamera._active_viewport()
|
||||
except Exception:
|
||||
vp = None
|
||||
handled = False
|
||||
if v == "Top":
|
||||
# Plan rotiert mit Norden — Up-Vektor zeigt Norden
|
||||
try:
|
||||
import kamera
|
||||
kamera.set_top_view(vp)
|
||||
except Exception as ex:
|
||||
print("[OBERLEISTE] top:", ex)
|
||||
self._send_state(force=True)
|
||||
kamera.set_top_view(vp); handled = True
|
||||
except Exception as ex: print("[OBERLEISTE] top:", ex)
|
||||
elif v == "Perspective":
|
||||
_run("_-{} _Enter".format(v))
|
||||
self._send_state(force=True)
|
||||
_run("_-{} _Enter".format(v)); handled = True
|
||||
elif v == "Iso":
|
||||
try:
|
||||
import kamera
|
||||
kamera._set_iso(vp, "NE")
|
||||
except Exception as ex:
|
||||
print("[OBERLEISTE] iso:", ex)
|
||||
self._send_state(force=True)
|
||||
kamera._set_iso(vp, "NE"); handled = True
|
||||
except Exception as ex: print("[OBERLEISTE] iso:", ex)
|
||||
elif v in ("N", "O", "S", "W"):
|
||||
try:
|
||||
import kamera
|
||||
kamera.set_cardinal_view(vp, v)
|
||||
except Exception as ex:
|
||||
print("[OBERLEISTE] cardinal:", ex)
|
||||
self._send_state(force=True)
|
||||
kamera.set_cardinal_view(vp, v); handled = True
|
||||
except Exception as ex: print("[OBERLEISTE] cardinal:", ex)
|
||||
elif v in ("Front", "Right", "Left", "Back", "Bottom"):
|
||||
# Legacy direkte Rhino-Views (falls noch wo benutzt)
|
||||
_run("_-{} _Enter".format(v))
|
||||
self._send_state(force=True)
|
||||
_run("_-{} _Enter".format(v)); handled = True
|
||||
if handled:
|
||||
self._last_set_view = v
|
||||
self._send_state(force=True)
|
||||
|
||||
# --- Kamera-Panel oeffnen ---------------------------------------
|
||||
elif t == "OPEN_KAMERA_PANEL":
|
||||
@@ -1203,6 +1198,8 @@ class OberleisteBridge(panel_base.BaseBridge):
|
||||
info["northAngle"] = kamera.get_north_angle(doc)
|
||||
except Exception:
|
||||
info["northAngle"] = 0
|
||||
# Letzte ueber Topbar gesetzte Ansicht (fuer Active-Highlight)
|
||||
info["lastSetView"] = self._last_set_view
|
||||
# Command-Line State
|
||||
prompt = _get_command_prompt()
|
||||
info["cmdPrompt"] = prompt
|
||||
|
||||
Reference in New Issue
Block a user