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
commit 79b17b53a0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 66 additions and 38 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

View file

@ -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),
),
],
);
}

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,
);
}
}

View file

@ -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 {