Add SNRIndicator to AppBar and refactor BatteryIndicator layout

This commit is contained in:
Winston Lowe
2026-02-15 11:45:48 -08:00
parent fa5a0932ee
commit 5751cddaa1
4 changed files with 159 additions and 73 deletions
-64
View File
@@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:meshcore_open/widgets/snr_indicator.dart';
import '../connector/meshcore_connector.dart';
@@ -43,7 +42,6 @@ class _BatteryIndicatorState extends State<BatteryIndicator> {
Widget build(BuildContext context) {
final percent = widget.connector.batteryPercent;
final millivolts = widget.connector.batteryMillivolts;
final directRepeaters = widget.connector.directRepeaters;
if (millivolts == null) {
return const SizedBox.shrink();
@@ -57,20 +55,6 @@ class _BatteryIndicatorState extends State<BatteryIndicator> {
}
final batteryUi = batteryUiForPercent(percent);
final directBestRepeaters = List.of(directRepeaters)
..sort((a, b) {
final dateCompare = b.lastUpdated.compareTo(a.lastUpdated);
if (dateCompare != 0) return dateCompare;
return (b.snr).compareTo(a.snr);
});
final directRepeater = directBestRepeaters.isEmpty
? null
: directBestRepeaters.first;
final snrUi = snrUiFromSNR(
directBestRepeaters.isNotEmpty ? directRepeater!.snr : null,
widget.connector.currentSf,
);
return InkWell(
onTap: () {
@@ -103,57 +87,9 @@ class _BatteryIndicatorState extends State<BatteryIndicator> {
),
],
),
const SizedBox(width: 8),
Padding(
padding: const EdgeInsets.only(top: 2),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Column(
mainAxisSize: MainAxisSize.min,
children: [
Icon(snrUi.icon, size: 18, color: snrUi.color),
Text(
snrUi.text,
style: TextStyle(fontSize: 12, color: snrUi.color),
),
],
),
if (directRepeater != null)
Text(
'${directRepeaters.length}: ${directRepeater.pubkeyFirstByte.toRadixString(16).padLeft(2, '0')}: ${_formatLastUpdated(directRepeater.lastUpdated)}',
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w500,
color: Colors.grey,
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
],
),
),
],
),
),
);
}
String _formatLastUpdated(DateTime lastSeen) {
final now = DateTime.now();
final diff = now.difference(lastSeen);
if (diff.isNegative || diff.inMinutes < 1) {
return "${diff.inSeconds}s";
}
if (diff.inMinutes < 60) {
return "${diff.inMinutes}m";
}
if (diff.inHours < 24) {
final hours = diff.inHours;
return hours == 1 ? "1h" : "${hours}hs";
}
final days = diff.inDays;
return days == 1 ? "1d" : "${days}ds";
}
}