feat(print-modal): show each printer slot's colour in the filament mapping (issue #3159)

The Print / Schedule dialog's filament mapping is where the colour a slice
asked for is compared against the colour actually loaded, and only the
left-hand side of that comparison had a swatch. The slot, and every slot in
its dropdown, was text -- and the text cannot be trusted: a slot's colour name
is resolved from the Color Catalog or, failing that, from hue, so a
third-party beige is announced as "Orange". A "Color mismatch" warning then
gives no way to tell a real mismatch from two names for the same hex without
opening the printer card in another tab, which on a farm swapping twenty or
thirty non-Bambu colours between machines is a check made many times a day.

Each slot now carries its colour and its hex, and the slot whose colour is
exactly the one the slice asked for is ticked. This works for a slot bound to
an inventory spool and for one configured through Configure Slot or on the
printer itself: the second kind has no inventory row behind it, and the
printer's own tray colour is then what draws. A bound spool contributes what a
tray record cannot -- SlotSpoolIdentity gains extra_colors and effect_type, so
a two-tone or glittery spool draws as itself rather than as its base colour.

The same treatment goes to the filament-override picker used for model-based
assignment. It is the same choice on the other dispatch path, and leaving it
text-only would have made one decision read two ways.

Both controls stop being <select>s to do it, because an <option> renders text
and nothing else. SlotPicker keeps what the select gave for free -- arrow,
Home/End, Enter and Escape keys, listbox semantics, and the border colouring
that encodes match, same-type-different-colour and not-loaded -- and is
portaled with position:fixed so it is not clipped by the dialog's own scroll
container, flipping above the row when there is no room below.
This commit is contained in:
maziggy
2026-09-25 11:38:13 +02:00
parent 64817ecc18
commit 1a84dfea5b
33 changed files with 1110 additions and 249 deletions
+16
View File
@@ -85,6 +85,9 @@ export function buildLoadedFilaments(
trayInfoIdx: tray.tray_info_idx || '',
traySubBrands: tray.tray_sub_brands || '',
spoolName: spoolDisplayName(identity) ?? undefined,
extraColors: identity?.extra_colors ?? undefined,
effectType: identity?.effect_type ?? undefined,
spoolSubtype: identity?.subtype ?? undefined,
extruderId: amsExtruderMap?.[String(amsUnit.id)],
remain: tray.remain ?? -1,
});
@@ -114,6 +117,9 @@ export function buildLoadedFilaments(
trayInfoIdx: extTray.tray_info_idx || '',
traySubBrands: extTray.tray_sub_brands || '',
spoolName: spoolDisplayName(identity) ?? undefined,
extraColors: identity?.extra_colors ?? undefined,
effectType: identity?.effect_type ?? undefined,
spoolSubtype: identity?.subtype ?? undefined,
extruderId: hasDualNozzle ? (255 - trayId) : undefined,
remain: extTray.remain ?? -1,
});
@@ -184,6 +190,16 @@ export interface LoadedFilament {
extruderId?: number;
/** Remaining filament percentage (0-100), -1 = unknown */
remain: number;
/** The bound spool's remaining colour stops and effect overlay, when the
* slot has a binding (#3159). Display only, like `spoolName`: a tray record
* carries one hex, so without these a two-tone spool draws as its base
* colour. Absent for a slot configured on the printer -- the firmware has
* nothing to report, and a solid swatch is then the honest one. */
extraColors?: string;
effectType?: string;
/** The bound spool's subtype ("PLA Silk", "Multicolor"), which decides
* whether the swatch renders its stops as a conic sweep. */
spoolSubtype?: string;
}
/**