emojis removed, updated headers, added spectate mode

This commit is contained in:
2025-12-20 10:17:23 +01:00
parent 5ae91d70e6
commit 3d033817a5
11 changed files with 1506 additions and 348 deletions
+109 -15
View File
@@ -748,11 +748,22 @@ List<double> _multiplyMatrices(List<double> a, List<double> b) {
child: ColorFiltered(
colorFilter: _buildColorFilter(),
child: Mjpeg(
key: ValueKey(_streamUrl),
stream: _streamUrl!,
isLive: true,
fit: BoxFit.contain,
error: (context, error, stackTrace) {
return _buildErrorContent();
// Mark as error so we can display error placeholder outside filters
WidgetsBinding.instance.addPostFrameCallback((_) {
if (mounted) {
setState(() {
_isError = true;
});
}
});
return SizedBox.expand(
child: Container(color: Colors.black),
);
},
),
),
@@ -845,21 +856,104 @@ List<double> _multiplyMatrices(List<double> a, List<double> b) {
}
Widget _buildErrorContent() {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Icon(Icons.error, color: Colors.red, size: 100),
const SizedBox(height: 20),
Text(
_t("Unable to load camera stream"),
style: const TextStyle(color: Colors.white, fontSize: 18, fontWeight: FontWeight.bold),
return Center(
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(24),
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 32),
decoration: BoxDecoration(
color: Colors.grey[900],
borderRadius: BorderRadius.circular(16),
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Icon(Icons.error, color: _bulletColor, size: 100),
const SizedBox(height: 24),
Text(
_t("Unable to load camera stream"),
style: const TextStyle(
color: Colors.white,
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 24),
Container(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16),
decoration: BoxDecoration(
color: Colors.grey[800],
borderRadius: BorderRadius.circular(8),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
_t("Please ensure:"),
style: const TextStyle(
color: Colors.white,
fontSize: 14,
fontWeight: FontWeight.w600,
),
),
const SizedBox(height: 12),
Row(
children: [
const Icon(Icons.wifi, color: Colors.white, size: 18),
const SizedBox(width: 12),
Expanded(
child: Text(
_t("WiFi is enabled"),
style: const TextStyle(
color: Colors.white70,
fontSize: 14,
),
),
),
],
),
const SizedBox(height: 12),
Row(
children: [
const Icon(Icons.signal_cellular_off, color: Colors.white, size: 18),
const SizedBox(width: 12),
Expanded(
child: Text(
_t("Mobile data is disabled"),
style: const TextStyle(
color: Colors.white70,
fontSize: 14,
),
),
),
],
),
],
),
),
const SizedBox(height: 24),
SizedBox(
width: double.infinity,
height: 48,
child: ElevatedButton.icon(
onPressed: _loadStreamUrl,
icon: const Icon(Icons.refresh, size: 20),
label: Text(_t("Reload")),
style: ElevatedButton.styleFrom(
backgroundColor: _bulletColor,
foregroundColor: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
),
),
),
],
),
),
),
const SizedBox(height: 10),
ElevatedButton(
onPressed: _loadStreamUrl,
child: Text(_t("Retry")),
),
],
),
);
}
}