Korrektur: Wand/Decke bleiben bei "Nach Bauteil" als Default, nur

Drawing2D wechselt auf "Nach Ebene"

Nutzer-Korrektur zum vorigen Commit: "eine Wand usw soll weiterhin
nach Bauteil haben und die weisser Grund und schwarzer Vordergrund
haben. Also nach Bauteil. 2D Elemente haben aber bei Attribute kein
nach Bauteil!!!" -- der vorige Commit hatte den Default global (auch
für Wand/Decke) auf "Nach Ebene" umgestellt, was die neutrale SIA-
Poché-Konvention (weisser Grund/schwarzer Vordergrund über die
Bauteil-Kette) durch die rohe Ebenenfarbe ersetzt hätte.

resolveForeground/resolveBackground/resolveHatchId/resolveStrokeWeight
(plan/generatePlan/shared.ts) sind zurückgesetzt auf ihr ursprüngliches
Verhalten: `source === "layer"` (fehlend/"object" ⇒ weiterhin Bauteil-
Kette, DEFAULT bei Wand/Decke). Der elementart-abhängige Default sitzt
jetzt an den AUFRUFERN statt im generischen Resolver:
  • Wand/Decke (selectionInfo.ts): rohes Source-Feld unverändert
    durchgereicht -- Default bleibt "Nach Bauteil".
  • Drawing2D (selectionInfo.ts drawingSelection): `d.foregroundSource
    ?? "layer"` usw. VOR dem Resolver -- Default wird dort explizit
    "Nach Ebene" (kein eigenes Bauteil, "Nach Bauteil" bietet das Panel
    für 2D-Elemente ohnehin nicht mehr an, s. vorletzter Commit).
  • AttributesPanel.tsx uiSourceOf() bekommt einen isDrawing-Parameter
    für denselben elementart-abhängigen Default in der Dropdown-
    Anzeige.

+Tests in shared.resolve.test.ts auf die jetzt korrekten Erwartungen
umgeschrieben (Default bleibt Bauteil, explizites "layer" liefert die
Kategorie, Drawing2D-Aufrufer-Mapping separat geprüft). tsc/vitest
934/934 grün.
This commit is contained in:
2026-08-22 01:05:20 +02:00
parent bfc064796f
commit 85be7173e1
5 changed files with 103 additions and 64 deletions
+25 -11
View File
@@ -50,11 +50,19 @@ import {
* selbst gespeichert). */
type UiSource = "layer" | "object" | "custom";
/** Leitet den UI-Quellen-Zustand ab: ein gesetzter Wert gewinnt immer („eigener
* Wert"), sonst das rohe Source-Feld (`undefined` ⇒ „Nach Ebene", Default —
* s. AttributeSource in model/types.ts). */
function uiSourceOf(hasValue: boolean, raw: AttributeSource | undefined): UiSource {
return hasValue ? "custom" : raw ?? "layer";
/**
* Leitet den UI-Quellen-Zustand ab: ein gesetzter Wert gewinnt immer („eigener
* Wert"), sonst das rohe Source-Feld — dessen DEFAULT unterscheidet sich nach
* Elementart (s. AttributeSource in model/types.ts): Wand/Decke „Nach Bauteil"
* (neutrale SIA-Poché), Drawing2D „Nach Ebene" (kein eigenes Bauteil, „Nach
* Bauteil" wird dort im Dropdown gar nicht erst angeboten).
*/
function uiSourceOf(
hasValue: boolean,
raw: AttributeSource | undefined,
isDrawing: boolean,
): UiSource {
return hasValue ? "custom" : raw ?? (isDrawing ? "layer" : "object");
}
export function AttributesPanel() {
@@ -191,15 +199,21 @@ export function AttributesPanel() {
</>
);
// Vordergrund/Hintergrund: „eigener Wert" ⇒ auf Quelle "object" (Nach
// Bauteil, Default) zurückfallen; „Nach Ebene"/„Nach Bauteil" schreiben die
// Quelle direkt (der Host löscht dabei den expliziten Wert).
const fgUi = uiSourceOf(sel.foreground !== undefined, sel.foregroundSource);
const bgUi = uiSourceOf(sel.background !== undefined, sel.backgroundSource);
const weightUi = uiSourceOf(sel.strokeWeightOverride !== undefined, sel.strokeWeightSource);
// Vordergrund/Hintergrund: „eigener Wert" ⇒ auf den elementart-abhängigen
// Default zurückfallen (Wand/Decke „Nach Bauteil", Drawing2D „Nach Ebene",
// s. uiSourceOf); „Nach Ebene"/„Nach Bauteil" schreiben die Quelle direkt
// (der Host löscht dabei den expliziten Wert).
const fgUi = uiSourceOf(sel.foreground !== undefined, sel.foregroundSource, isDrawing);
const bgUi = uiSourceOf(sel.background !== undefined, sel.backgroundSource, isDrawing);
const weightUi = uiSourceOf(
sel.strokeWeightOverride !== undefined,
sel.strokeWeightSource,
isDrawing,
);
const hatchUi = uiSourceOf(
sel.fillHatchId !== undefined && sel.fillHatchId !== null,
sel.hatchSource,
isDrawing,
);
// Wechsel auf „eigener Wert" per Dropdown (nicht durchs Editieren des Felds