Status bar: the Orin at a glance over every view, like a phone's
/ crosscheck (push) Successful in 1s
CI / Analyze & Test (push) Successful in 20s
CI / Debug APK (push) Successful in 39s

Link on the left (with the menu on the Dash), then hot temperature, CAN, OBD while
connected, GNSS fix and satellites, LTE, WiFi, UPS, and the dark/bright button. The
Dash's own top line is gone into it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-15 22:17:38 +09:00
parent 78a6564f0a
commit dcafc04cbc
5 changed files with 269 additions and 55 deletions
+23 -6
View File
@@ -20,6 +20,7 @@ import 'shell_scope.dart';
import 'theme/palette.dart';
import 'widgets/link_status.dart';
import 'widgets/mock_banner.dart';
import 'widgets/status_bar.dart';
class AppShell extends StatefulWidget {
const AppShell({
@@ -53,7 +54,7 @@ class _AppShellState extends State<AppShell> {
Widget _page(ShellView v) {
final b = widget.boundary;
return switch (v) {
ShellView.dash => DashPage(boundary: b, themes: widget.themes),
ShellView.dash => DashPage(boundary: b),
ShellView.signals => SignalsPage(boundary: b, usb: widget.usb),
ShellView.captures => Navigator(
key: _captures,
@@ -113,14 +114,30 @@ class _AppShellState extends State<AppShell> {
},
),
body: ListenableBuilder(
listenable: widget.boundary,
listenable: Listenable.merge([widget.boundary, widget.themes]),
builder: (context, child) => Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
if (widget.boundary.mock)
const SafeArea(bottom: false, child: MockBanner()),
// Pages draw their own top (app bars); keep every bottom clear of the system bar.
Expanded(child: SafeArea(top: false, child: child!)),
// The Orin's status over every view; the Dash, with no app bar, gets the menu in it.
SafeArea(
bottom: false,
child: StatusBar(
boundary: widget.boundary,
themes: widget.themes,
leading: current == ShellView.dash
? MenuButton(color: AppTheme.of(context).subdued)
: null,
),
),
if (widget.boundary.mock) const MockBanner(),
// The status bar took the top inset; keep every bottom clear of the system bar.
Expanded(
child: MediaQuery.removePadding(
context: context,
removeTop: true,
child: SafeArea(top: false, child: child!),
),
),
],
),
child: IndexedStack(