0.7.0
Pre-releaseCANShift Studio 0.7.0 — burn UX, day/night legibility, and a tighter studio.
Highlights
Burn progress modal (Option C — part 1 of 2)
Clicking Burn now opens a full-window status modal that follows the device through the whole write cycle:
- Pushing config to device… — sending the JSON over USB
- Device writing & rebooting… — firmware acked, SD write + reboot in flight
- Done — your config is live — auto-connect re-established the link
A 20-second safety timeout returns the modal to idle if the device never comes back, so it can never get stuck. The companion firmware-side LCD overlay ships in the next firmware release; until then you'll see the studio modal alone.
Day / night text legibility
Day mode renders dashboards on a light grey background. Until now, widget value labels read cfg.style.textColor.rgb directly — usually white — making them invisible on the day backdrop. The fix lives in firmware (ThemeManager::getEffectiveTextColor()) with the studio preview mirrored 1:1:
- Day mode → black text on grey
- Night mode → white text on black
- Top bar untouched in both modes
Bespoke per-widget text colours (cyan COOLANT, orange OIL, red GEAR) intentionally collapse to the mode's text colour for legibility — the trade-off was explicitly accepted in #171.
⚠️ The full benefit lands once you flash the matching firmware build (also v0.7.0 in this release). Without it, the studio preview stays accurate but the device keeps the old white-on-grey behaviour.
Import / Export dashboard JSON
Two new entries under the File menu, distinct from Open / Save:
- Import Dashboard… — load a foreign JSON without binding it as the working file. Studio runs the schema migration, validates, and refuses on errors. The editor opens with a dirty flag so a later Save prompts for a fresh location.
- Export Dashboard… — write a snapshot of the current config to a chosen path without changing the working file path or the recent-files list.
Use this for backups and sharing where you don't want the regular Open/Save flow to retarget your active file.
Status feedback improvements
- USB connection — the colored dot in the TopBar is now a proper USB icon that turns green when connected, orange while burning, red on error, gray when disconnected, with a soft drop-shadow glow on the active states.
- Device config load — connecting to a device with no SD config, an invalid config, or a parse error no longer fails silently. A success log shows up when the load worked, an info log when the device just had nothing to send, and a red banner with full validator details when the on-device config is broken.
Internals
- First main-process test infrastructure under
canshift-studio/main/. Locks the USB disconnect bookkeeping introduced in v0.6.1 (intentional vs. involuntary close) so the contract can't silently regress. - Layout collision coverage taken from 90 % to 100 %. Push-left / push-up directions and cascade termination are now pinned.
- Schema-aware JSON import path (Import Dashboard…) reuses the same migration the Open path runs.
Migrations
Schema is unchanged from 0.6.1 — still 1.10.0. No migration runs on existing dashboards.
Verification on real hardware
When testing the burn flow end-to-end:
- Install this studio build, connect a CANShift device.
- Trigger Burn — the new modal should walk through Pushing → Rebooting → Done.
- Once the firmware-side overlay ships in the next firmware release, you'll also see a "Saving config…" overlay on the LCD itself.
If the modal hangs at "Device writing & rebooting…" longer than 20 s, it'll auto-clear and the console panel + error bar will show why.
Full PR list since 0.6.1
- #178 —
feat(studio): import/export dashboard JSON outside the device flow - #181 —
test(studio): regression coverage for USB disconnect bookkeeping - #182 —
test(studio): cover layout collision push-left/up + cascade termination - #183 —
feat(studio): USB icon reflects connection state in TopBar - #184 —
feat(studio): surface device config load failures in the UI - #185 —
feat(firmware): widget text color follows active mode (black/day, white/night) - #186 —
feat(studio): burn progress modal — pushing/rebooting/done phases (v0.7.0)