Fix: Messwerte erscheinen im Objekt-Info (Live-Injektion statt eingefrorenem Memo)

Das Objekt-Info-Panel zeigte die Live-Messwerte nie an: `measurement` lag im
memoisierten `baseHost`, dessen Dep-Liste `draft` bewusst NICHT enthält (sonst
würde der ganze Host bei jeder Mausbewegung neu gebaut) → der Wert blieb auf
dem Anfangswert (null) eingefroren. Fix: `measurement` nicht mehr im Memo,
sondern in `hostWithMode` bei jedem Render frisch injiziert (draft?.measure).
tsc + vitest grün.
This commit is contained in:
2026-07-10 00:44:06 +02:00
parent a409e8e6b4
commit 9b6dd80d39
+12 -6
View File
@@ -133,6 +133,7 @@ import {
import type { CopyMode, TransformOp, TransformSelection } from "./tools/transform"; import type { CopyMode, TransformOp, TransformSelection } from "./tools/transform";
import { DEFAULT_SNAP } from "./tools/types"; import { DEFAULT_SNAP } from "./tools/types";
import type { import type {
MeasurementReadout,
SnapResult, SnapResult,
SnapSettings, SnapSettings,
ToolContext, ToolContext,
@@ -2866,9 +2867,9 @@ export default function App() {
onImportLineStyles: importLineStyles, onImportLineStyles: importLineStyles,
onImportHatches: importHatches, onImportHatches: importHatches,
selection, selection,
// Live-Messwerte des Mess-Werkzeugs (aus dem aktiven Draft) — das Objekt- // Platzhalter — der LIVE-Wert wird in `hostWithMode` je Render injiziert
// Info-Panel zeigt sie, solange gemessen wird. // (nicht hier, weil `draft` bewusst kein Dep dieses Memos ist, s. dort).
measurement: draft?.measure ?? null, measurement: null,
onSetSelectionColor: (color) => { onSetSelectionColor: (color) => {
if (!selection) return; if (!selection) return;
if (selection.kind === "wall" || selection.kind === "drawing2d") if (selection.kind === "wall" || selection.kind === "drawing2d")
@@ -4639,7 +4640,7 @@ export default function App() {
onResize={(size) => resizeDock("left", size)} onResize={(size) => resizeDock("left", size)}
onResizeGroups={(w) => resizeGroups("left", w)} onResizeGroups={(w) => resizeGroups("left", w)}
buildHost={(activeTab) => buildHost={(activeTab) =>
hostWithMode(baseHost, activeTab, modeFor, setModeFor) hostWithMode(baseHost, activeTab, modeFor, setModeFor, draft?.measure ?? null)
} }
displayModeFor={(activeTab) => modeFor(activeTab)} displayModeFor={(activeTab) => modeFor(activeTab)}
onDisplayModeChange={(activeTab, m) => setModeFor(activeTab, m)} onDisplayModeChange={(activeTab, m) => setModeFor(activeTab, m)}
@@ -4833,7 +4834,7 @@ export default function App() {
onResize={(size) => resizeDock("right", size)} onResize={(size) => resizeDock("right", size)}
onResizeGroups={(w) => resizeGroups("right", w)} onResizeGroups={(w) => resizeGroups("right", w)}
buildHost={(activeTab) => buildHost={(activeTab) =>
hostWithMode(baseHost, activeTab, modeFor, setModeFor) hostWithMode(baseHost, activeTab, modeFor, setModeFor, draft?.measure ?? null)
} }
displayModeFor={(activeTab) => modeFor(activeTab)} displayModeFor={(activeTab) => modeFor(activeTab)}
onDisplayModeChange={(activeTab, m) => setModeFor(activeTab, m)} onDisplayModeChange={(activeTab, m) => setModeFor(activeTab, m)}
@@ -4868,7 +4869,7 @@ export default function App() {
{layout.floating.map((fp) => ( {layout.floating.map((fp) => (
<PanelHostContext.Provider <PanelHostContext.Provider
key={fp.panelId} key={fp.panelId}
value={hostWithMode(baseHost, fp.panelId, modeFor, setModeFor)} value={hostWithMode(baseHost, fp.panelId, modeFor, setModeFor, draft?.measure ?? null)}
> >
<FloatingPanel <FloatingPanel
panel={fp} panel={fp}
@@ -5290,9 +5291,14 @@ function hostWithMode(
activeTab: string | null, activeTab: string | null,
modeFor: (id: string | null) => DisplayMode, modeFor: (id: string | null) => DisplayMode,
setModeFor: (id: string | null, mode: DisplayMode) => void, setModeFor: (id: string | null, mode: DisplayMode) => void,
measurement: MeasurementReadout | null = null,
): PanelHost { ): PanelHost {
const value: PanelHostValue = { const value: PanelHostValue = {
...base, ...base,
// Live-Messwerte NICHT aus dem memoisierten `base` (dort wären sie eingefroren,
// da `draft` bewusst kein Memo-Dep ist — sonst würde der ganze Host bei jeder
// Mausbewegung neu gebaut). Hier bei jedem Render frisch injiziert.
measurement,
displayMode: { displayMode: {
mode: modeFor(activeTab), mode: modeFor(activeTab),
setMode: (mode) => setModeFor(activeTab, mode), setMode: (mode) => setModeFor(activeTab, mode),