diff --git a/docs/screenshots/signal-ui-consistency.png b/docs/screenshots/signal-ui-consistency.png new file mode 100644 index 0000000..2575945 Binary files /dev/null and b/docs/screenshots/signal-ui-consistency.png differ diff --git a/lib/widgets/device_tile.dart b/lib/widgets/device_tile.dart index 9dd6d5b..3f30b38 100644 --- a/lib/widgets/device_tile.dart +++ b/lib/widgets/device_tile.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import '../l10n/l10n.dart'; +import 'signal_ui.dart'; /// A reusable tile widget for displaying a MeshCore device in a list class DeviceTile extends StatelessWidget { @@ -33,28 +34,25 @@ class DeviceTile extends StatelessWidget { } Widget _buildSignalIcon(int rssi) { - IconData icon; - Color color; - - if (rssi >= -60) { - icon = Icons.signal_cellular_4_bar; - color = Colors.green; - } else if (rssi >= -70) { - icon = Icons.signal_cellular_alt; - color = Colors.lightGreen; - } else if (rssi >= -80) { - icon = Icons.signal_cellular_alt_2_bar; - color = Colors.orange; - } else { - icon = Icons.signal_cellular_alt_1_bar; - color = Colors.red; - } + final tier = rssi >= -60 + ? 0 + : rssi >= -70 + ? 1 + : rssi >= -80 + ? 2 + : rssi >= -90 + ? 3 + : 4; + final signalUi = signalUiForStrengthTier(tier); return Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Icon(icon, color: color), - Text('$rssi dBm', style: TextStyle(fontSize: 10, color: color)), + Icon(signalUi.icon, color: signalUi.color), + Text( + '$rssi dBm', + style: TextStyle(fontSize: 10, color: signalUi.color), + ), ], ); } diff --git a/lib/widgets/signal_ui.dart b/lib/widgets/signal_ui.dart new file mode 100644 index 0000000..e0e0511 --- /dev/null +++ b/lib/widgets/signal_ui.dart @@ -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, + ); + } +} diff --git a/lib/widgets/snr_indicator.dart b/lib/widgets/snr_indicator.dart index db4fb8e..f3becea 100644 --- a/lib/widgets/snr_indicator.dart +++ b/lib/widgets/snr_indicator.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import '../connector/meshcore_connector.dart'; import '../l10n/l10n.dart'; +import 'signal_ui.dart'; class SNRUi { final IconData icon; @@ -38,28 +39,19 @@ SNRUi snrUiFromSNR(double? snr, int? spreadingFactor) { final snrLevels = getSNRfromSF(spreadingFactor); - IconData icon; - Color color; 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]) { - 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); + return SNRUi(signalUi.icon, signalUi.color, text); } class SNRIndicator extends StatefulWidget {