FB-02: hide the idle Speed panel until recording starts
Removes the idle GlassPanel/BigStat Speed-Status-Last ride block from
RecordScreen; the live map plus START control is now the entire idle
screen. HudEditOverlay is gated on !ui.isIdle. Migrates the five
affected widget tests to seed a recording trip and assert against the
HUD's own ValueKey(HudMetric.speed) widget instead of the old idle
Key('speed').
Also fixes a pre-existing gap this migration exposed: _HudMetricValue
had no mounted-mode awareness at all (no text scaling, and its
per-metric accent colours fall just under AA contrast against the
mounted theme's GlassPanel surface). Adds scale and mountedMode
params, reusing BigStat's own mechanisms (scale multiplier, explicit
onSurface ink) to fix both.
This commit is contained in:
@@ -173,7 +173,6 @@ class _RecordScreenState extends ConsumerState<RecordScreen> {
|
||||
final engine = ref.watch(recordingEngineProvider);
|
||||
final trip = ref.watch(activeTripProvider).valueOrNull;
|
||||
final units = ref.watch(unitSystemProvider);
|
||||
final (speedValue, speedUnit) = formatSpeedParts(_liveSpeed, unit: units);
|
||||
|
||||
final ui = RecordUiState(
|
||||
trip: trip,
|
||||
@@ -195,38 +194,17 @@ class _RecordScreenState extends ConsumerState<RecordScreen> {
|
||||
body: SafeArea(
|
||||
child: Stack(
|
||||
children: [
|
||||
if (ui.isIdle)
|
||||
Center(
|
||||
child: GlassPanel(
|
||||
padding: const EdgeInsets.all(24),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
// Current speed, not max: a max figure only moves when you beat
|
||||
// it, which reads as a frozen screen while riding steadily.
|
||||
// This is the 2.0.1 fix and it must not regress.
|
||||
BigStat(
|
||||
key: const Key('speed'),
|
||||
label: 'SPEED',
|
||||
value: speedValue,
|
||||
unit: speedUnit,
|
||||
scale: mountedMode ? mountedTextScale : 1.0,
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
// A resting state, not a zeroed ride -- otherwise the screen
|
||||
// looks like a recording that is going nowhere.
|
||||
const StatRow(label: 'Status', value: 'Ready'),
|
||||
const StatRow(label: 'Last ride', value: 'See Rides'),
|
||||
],
|
||||
),
|
||||
),
|
||||
)
|
||||
else
|
||||
if (!ui.isIdle)
|
||||
Positioned.fill(
|
||||
bottom: _controlBarHeight(mountedMode),
|
||||
child: HudEditOverlay(
|
||||
metricBuilder: (context, metric) =>
|
||||
_HudMetricValue(metric: metric, ui: ui, units: units),
|
||||
metricBuilder: (context, metric) => _HudMetricValue(
|
||||
metric: metric,
|
||||
ui: ui,
|
||||
units: units,
|
||||
scale: mountedMode ? mountedTextScale : 1.0,
|
||||
mountedMode: mountedMode,
|
||||
),
|
||||
),
|
||||
),
|
||||
if (ui.isPaused)
|
||||
@@ -288,21 +266,50 @@ class _RecordScreenState extends ConsumerState<RecordScreen> {
|
||||
/// same `RecordUiState`/units that powered the old fixed stats card. No new data
|
||||
/// plumbing, only new presentation, per the ticket's own Implementation section.
|
||||
class _HudMetricValue extends StatelessWidget {
|
||||
const _HudMetricValue({required this.metric, required this.ui, required this.units});
|
||||
const _HudMetricValue({
|
||||
required this.metric,
|
||||
required this.ui,
|
||||
required this.units,
|
||||
this.scale = 1.0,
|
||||
this.mountedMode = false,
|
||||
});
|
||||
|
||||
final HudMetric metric;
|
||||
final RecordUiState ui;
|
||||
final UnitSystem units;
|
||||
|
||||
/// V3-05: mounted mode reads bigger, at a glance, at speed. Same mechanism `BigStat`
|
||||
/// used for the old idle Speed panel -- fixed pixel sizes below (not the ambient text
|
||||
/// theme) are what a glove-and-visor readout actually is, so scaling has to happen
|
||||
/// here rather than through `Theme.of(context).textTheme`.
|
||||
final double scale;
|
||||
|
||||
/// FB-02: `_HudMetricValue` had no mounted-mode awareness at all before the idle
|
||||
/// `BigStat` (which did) was removed as the idle panel's speed readout -- this
|
||||
/// migration is what surfaced that gap. [scale] above covers the font-size half of
|
||||
/// it; this covers the other half `BigStat` also handled by naming its headline
|
||||
/// colour explicitly (`colors.onSurface`, never a metric accent) rather than trusting
|
||||
/// the ambient theme: in the mounted theme specifically, `_valueColor`'s per-metric
|
||||
/// accent colours (tuned for the dark theme's own contrast) fall a hair short of AA
|
||||
/// (4.43:1, not 4.5:1) against `GlassPanel`'s mounted-theme surface. Reusing
|
||||
/// `BigStat`'s own fallback -- plain, guaranteed-legible ink whenever mounted mode is
|
||||
/// on -- fixes it without touching the accent colours the dark-theme HUD mockup
|
||||
/// deliberately specifies.
|
||||
final bool mountedMode;
|
||||
|
||||
/// Matches the Map HUD mockup's own colour choices for its default four metrics
|
||||
/// exactly (Speed: primary, Avg Speed/Time: plain ink, Dist: secondary) rather than
|
||||
/// this app's usual reference-vs-live convention -- this HUD is a new visual context
|
||||
/// the mockup already specifies directly, colour by colour.
|
||||
Color _valueColor(ColorScheme colors) => switch (metric) {
|
||||
HudMetric.speed => colors.primary,
|
||||
HudMetric.distance => colors.secondary,
|
||||
_ => colors.onSurface,
|
||||
};
|
||||
/// the mockup already specifies directly, colour by colour. Mounted mode overrides
|
||||
/// this with plain ink -- see [mountedMode] doc above.
|
||||
Color _valueColor(ColorScheme colors) {
|
||||
if (mountedMode) return colors.onSurface;
|
||||
return switch (metric) {
|
||||
HudMetric.speed => colors.primary,
|
||||
HudMetric.distance => colors.secondary,
|
||||
_ => colors.onSurface,
|
||||
};
|
||||
}
|
||||
|
||||
String get _value {
|
||||
final trip = ui.trip;
|
||||
@@ -326,7 +333,11 @@ class _HudMetricValue extends StatelessWidget {
|
||||
children: [
|
||||
Text(
|
||||
metric.label.toUpperCase(),
|
||||
style: TextStyle(fontSize: 10, letterSpacing: 1, color: colors.onSurfaceVariant),
|
||||
style: TextStyle(
|
||||
fontSize: 10 * scale,
|
||||
letterSpacing: 1,
|
||||
color: colors.onSurfaceVariant,
|
||||
),
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
@@ -334,7 +345,7 @@ class _HudMetricValue extends StatelessWidget {
|
||||
Text(
|
||||
_value,
|
||||
style: monoDigits.copyWith(
|
||||
fontSize: 18,
|
||||
fontSize: 18 * scale,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: _valueColor(colors),
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user