feat: redesign Pump page with Fluent card layout, bottom snackbar, and RPM chart

- Replace sub-nav + HiddenTabsTabControl with 3-column Fluent card layout:
  PumpCommandsCard (vertical ME/FBKW/PreIn sliders) + DfiCalibrationCard /
  PumpLiveDataCard (KPI tiles + RPM rolling chart + redesigned status bytes) /
  PumpIdentificationCard + DtcCard
- Add PumpTopStripView: pump selector, model badge, CAN + K-Line chips
- Move immobilizer unlock to MainWindow bottom snackbar (UnlockSnackbarView):
  auto-close on success after 3 s, persist on failure with manual Dismiss
- Redesign StatusDisplayView to 2×8 rounded 28px tiles with bit index + tooltip
- Add NullToVisibilityConverter; add SnackbarShell, PumpCard, and related styles
- Delete obsolete views: UnlockProgressDialog, UnlockPanelView,
  PumpIdentificationPanelView, PumpLiveDataView, DfiManageView,
  DtcListView, PumpControlView
- PumpPageViewModel: remove PumpSubPage enum, add RpmChart wired to Root.PumpRpm

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-20 14:03:47 +02:00
parent 197e9d1775
commit 70be693116
37 changed files with 1356 additions and 1317 deletions

View File

@@ -166,6 +166,31 @@
<sys:String x:Key="Pump.Rpm">RPM</sys:String>
<sys:String x:Key="Pump.TEin">T-ein</sys:String>
<sys:String x:Key="Pump.UnitRpm">1/min</sys:String>
<sys:String x:Key="Pump.UnitCelsius">°C</sys:String>
<sys:String x:Key="Pump.UnitUs">µs</sys:String>
<sys:String x:Key="Pump.Commands.Title">Pump Commands</sys:String>
<sys:String x:Key="Pump.Commands.Me">ME</sys:String>
<sys:String x:Key="Pump.Commands.Fbkw">FBKW</sys:String>
<sys:String x:Key="Pump.Commands.PreIn">Pre-inj</sys:String>
<sys:String x:Key="Pump.LiveData.Title">Live Data</sys:String>
<sys:String x:Key="Pump.LiveData.RPM">Pump RPM</sys:String>
<sys:String x:Key="Pump.LiveData.THyb">T-hyb</sys:String>
<sys:String x:Key="Pump.LiveData.TEin">T-ein</sys:String>
<sys:String x:Key="Pump.LiveData.Me">ME</sys:String>
<sys:String x:Key="Pump.LiveData.Fbkw">FBKW</sys:String>
<sys:String x:Key="Pump.LiveData.RpmChart">RPM trend</sys:String>
<sys:String x:Key="Pump.Status.Active">Active</sys:String>
<sys:String x:Key="Pump.Dfi.Title">Idling Calibration</sys:String>
<sys:String x:Key="Pump.Dfi.Version">Version</sys:String>
<sys:String x:Key="Pump.Dfi.Current">Current DFI</sys:String>
<sys:String x:Key="Pump.Dtcs.Title">Fault Codes</sys:String>
<sys:String x:Key="Pump.Identification.Title">Identification</sys:String>
<sys:String x:Key="Pump.TopStrip.Brand">Brand</sys:String>
<sys:String x:Key="Pump.TopStrip.NoPump">No pump selected</sys:String>
<sys:String x:Key="Pump.TopStrip.Can">CAN</sys:String>
<sys:String x:Key="Pump.TopStrip.KLine">K-Line</sys:String>
<sys:String x:Key="Pump.NoPumpBanner">No pump selected — select a pump to enable diagnostics.</sys:String>
<sys:String x:Key="Pump.FastUnlock">Fast unlock attempt...</sys:String>
<!-- ── Pump identification ──────────────────────────────────────────── -->
<sys:String x:Key="PumpId.Label">Pump:</sys:String>
@@ -323,6 +348,7 @@
<sys:String x:Key="Common.No">No</sys:String>
<sys:String x:Key="Common.Warning">WARNING</sys:String>
<sys:String x:Key="Common.Disabled">disabled</sys:String>
<sys:String x:Key="Common.Dismiss">Dismiss</sys:String>
<!-- ── Dialog: Report ───────────────────────────────────────────────── -->
<sys:String x:Key="Dialog.Report.Title">Generate Report</sys:String>