Merge pull request #246 from Specter242/codex/signal-ui-consistency

Unify signal indicator UI across RSSI and SNR
This commit is contained in:
zjs81
2026-03-02 18:42:21 -07:00
committed by GitHub
4 changed files with 66 additions and 38 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

+16 -18
View File
@@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import '../l10n/l10n.dart'; import '../l10n/l10n.dart';
import 'signal_ui.dart';
/// A reusable tile widget for displaying a MeshCore device in a list /// A reusable tile widget for displaying a MeshCore device in a list
class DeviceTile extends StatelessWidget { class DeviceTile extends StatelessWidget {
@@ -33,28 +34,25 @@ class DeviceTile extends StatelessWidget {
} }
Widget _buildSignalIcon(int rssi) { Widget _buildSignalIcon(int rssi) {
IconData icon; final tier = rssi >= -60
Color color; ? 0
: rssi >= -70
if (rssi >= -60) { ? 1
icon = Icons.signal_cellular_4_bar; : rssi >= -80
color = Colors.green; ? 2
} else if (rssi >= -70) { : rssi >= -90
icon = Icons.signal_cellular_alt; ? 3
color = Colors.lightGreen; : 4;
} else if (rssi >= -80) { final signalUi = signalUiForStrengthTier(tier);
icon = Icons.signal_cellular_alt_2_bar;
color = Colors.orange;
} else {
icon = Icons.signal_cellular_alt_1_bar;
color = Colors.red;
}
return Column( return Column(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Icon(icon, color: color), Icon(signalUi.icon, color: signalUi.color),
Text('$rssi dBm', style: TextStyle(fontSize: 10, color: color)), Text(
'$rssi dBm',
style: TextStyle(fontSize: 10, color: signalUi.color),
),
], ],
); );
} }
+38
View File
@@ -0,0 +1,38 @@
import 'package:flutter/material.dart';
class SignalUi {
final IconData icon;
final Color color;
const SignalUi({required this.icon, required this.color});
}
SignalUi signalUiForStrengthTier(int tier) {
switch (tier) {
case 0:
return const SignalUi(
icon: Icons.signal_cellular_4_bar,
color: Colors.green,
);
case 1:
return const SignalUi(
icon: Icons.signal_cellular_alt,
color: Colors.lightGreen,
);
case 2:
return const SignalUi(
icon: Icons.signal_cellular_alt_2_bar,
color: Colors.amber,
);
case 3:
return const SignalUi(
icon: Icons.signal_cellular_alt_1_bar,
color: Colors.orange,
);
default:
return const SignalUi(
icon: Icons.signal_cellular_alt_1_bar,
color: Colors.red,
);
}
}
+12 -20
View File
@@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../connector/meshcore_connector.dart'; import '../connector/meshcore_connector.dart';
import '../l10n/l10n.dart'; import '../l10n/l10n.dart';
import 'signal_ui.dart';
class SNRUi { class SNRUi {
final IconData icon; final IconData icon;
@@ -38,28 +39,19 @@ SNRUi snrUiFromSNR(double? snr, int? spreadingFactor) {
final snrLevels = getSNRfromSF(spreadingFactor); final snrLevels = getSNRfromSF(spreadingFactor);
IconData icon;
Color color;
String text = '${snr.toStringAsFixed(1)} dB'; String text = '${snr.toStringAsFixed(1)} dB';
final tier = snr >= snrLevels[0]
? 0
: snr >= snrLevels[1]
? 1
: snr >= snrLevels[2]
? 2
: snr >= snrLevels[3]
? 3
: 4;
final signalUi = signalUiForStrengthTier(tier);
if (snr >= snrLevels[0]) { return SNRUi(signalUi.icon, signalUi.color, text);
icon = Icons.signal_cellular_alt;
color = Colors.green;
} else if (snr >= snrLevels[1]) {
icon = Icons.signal_cellular_alt;
color = Colors.lightGreen;
} else if (snr >= snrLevels[2]) {
icon = Icons.signal_cellular_alt;
color = Colors.yellow;
} else if (snr >= snrLevels[3]) {
icon = Icons.signal_cellular_alt_2_bar;
color = Colors.orange;
} else {
icon = Icons.signal_cellular_alt_1_bar;
color = Colors.red;
}
return SNRUi(icon, color, text);
} }
class SNRIndicator extends StatefulWidget { class SNRIndicator extends StatefulWidget {