Refine device info layout and add collapsible map legend (#164)

This commit is contained in:
just_stuff_tm
2026-02-12 15:46:28 -05:00
committed by GitHub
parent c52b19b09f
commit fac062a100
2 changed files with 190 additions and 93 deletions
+49 -6
View File
@@ -51,6 +51,7 @@ class _MapScreenState extends State<MapScreen> {
bool _isSelectingPoi = false; bool _isSelectingPoi = false;
bool _hasInitializedMap = false; bool _hasInitializedMap = false;
bool _removedMarkersLoaded = false; bool _removedMarkersLoaded = false;
bool _legendExpanded = false;
@override @override
void initState() { void initState() {
@@ -503,11 +504,23 @@ class _MapScreenState extends State<MapScreen> {
top: 16, top: 16,
right: 16, right: 16,
child: Card( child: Card(
child: Padding(
padding: const EdgeInsets.all(12.0),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [
InkWell(
borderRadius: BorderRadius.circular(12),
onTap: () {
setState(() {
_legendExpanded = !_legendExpanded;
});
},
child: Padding(
padding: const EdgeInsets.fromLTRB(12, 10, 12, 10),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
context.l10n.map_nodesCount(nodeCount), context.l10n.map_nodesCount(nodeCount),
@@ -519,11 +532,30 @@ class _MapScreenState extends State<MapScreen> {
Text( Text(
context.l10n.map_pinsCount(markerCount), context.l10n.map_pinsCount(markerCount),
style: const TextStyle( style: const TextStyle(
fontWeight: FontWeight.bold, fontWeight: FontWeight.w600,
fontSize: 12, fontSize: 12,
), ),
), ),
const SizedBox(height: 8), ],
),
const SizedBox(width: 8),
AnimatedRotation(
turns: _legendExpanded ? 0.5 : 0,
duration: const Duration(milliseconds: 200),
child: const Icon(Icons.expand_more, size: 20),
),
],
),
),
),
AnimatedCrossFade(
firstChild: const SizedBox.shrink(),
secondChild: Padding(
padding: const EdgeInsets.fromLTRB(12, 0, 12, 12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(height: 6),
_buildLegendItem( _buildLegendItem(
Icons.person, Icons.person,
context.l10n.map_chat, context.l10n.map_chat,
@@ -544,7 +576,11 @@ class _MapScreenState extends State<MapScreen> {
context.l10n.map_sensor, context.l10n.map_sensor,
Colors.orange, Colors.orange,
), ),
_buildLegendItem(Icons.flag, context.l10n.map_pinDm, Colors.blue), _buildLegendItem(
Icons.flag,
context.l10n.map_pinDm,
Colors.blue,
),
_buildLegendItem( _buildLegendItem(
Icons.flag, Icons.flag,
context.l10n.map_pinPrivate, context.l10n.map_pinPrivate,
@@ -558,6 +594,13 @@ class _MapScreenState extends State<MapScreen> {
], ],
), ),
), ),
crossFadeState: _legendExpanded
? CrossFadeState.showSecond
: CrossFadeState.showFirst,
duration: const Duration(milliseconds: 200),
),
],
),
), ),
); );
} }
+69 -15
View File
@@ -21,6 +21,7 @@ class SettingsScreen extends StatefulWidget {
class _SettingsScreenState extends State<SettingsScreen> { class _SettingsScreenState extends State<SettingsScreen> {
bool _showBatteryVoltage = false; bool _showBatteryVoltage = false;
bool _deviceInfoExpanded = false;
String _appVersion = ''; String _appVersion = '';
@override @override
@@ -74,18 +75,52 @@ class _SettingsScreenState extends State<SettingsScreen> {
MeshCoreConnector connector, MeshCoreConnector connector,
) { ) {
final l10n = context.l10n; final l10n = context.l10n;
return Card( return Card(
child: Padding(
padding: const EdgeInsets.all(16),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( InkWell(
borderRadius: BorderRadius.circular(12),
onTap: () {
setState(() {
_deviceInfoExpanded = !_deviceInfoExpanded;
});
},
child: Padding(
padding: const EdgeInsets.fromLTRB(16, 16, 16, 16),
child: Row(
children: [
Expanded(
child: Text(
l10n.settings_deviceInfo, l10n.settings_deviceInfo,
style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), style: const TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
),
AnimatedRotation(
turns: _deviceInfoExpanded ? 0.5 : 0,
duration: const Duration(milliseconds: 200),
child: const Icon(Icons.expand_more),
),
],
),
),
),
AnimatedCrossFade(
firstChild: const SizedBox.shrink(),
secondChild: Padding(
padding: const EdgeInsets.fromLTRB(16, 0, 16, 16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildInfoRow(
l10n.settings_infoName,
connector.deviceDisplayName,
), ),
const SizedBox(height: 16),
_buildInfoRow(l10n.settings_infoName, connector.deviceDisplayName),
_buildInfoRow(l10n.settings_infoId, connector.deviceIdLabel), _buildInfoRow(l10n.settings_infoId, connector.deviceIdLabel),
_buildInfoRow( _buildInfoRow(
l10n.settings_infoStatus, l10n.settings_infoStatus,
@@ -112,6 +147,13 @@ class _SettingsScreenState extends State<SettingsScreen> {
], ],
), ),
), ),
crossFadeState: _deviceInfoExpanded
? CrossFadeState.showSecond
: CrossFadeState.showFirst,
duration: const Duration(milliseconds: 200),
),
],
),
); );
} }
@@ -355,22 +397,33 @@ class _SettingsScreenState extends State<SettingsScreen> {
Color? valueColor, Color? valueColor,
VoidCallback? onTap, VoidCallback? onTap,
}) { }) {
final theme = Theme.of(context);
final row = Padding( final row = Padding(
padding: const EdgeInsets.symmetric(vertical: 4), padding: const EdgeInsets.symmetric(vertical: 10),
child: Row( child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Row( Row(
children: [ children: [
if (leading != null) ...[leading, const SizedBox(width: 8)], if (leading != null) ...[leading, const SizedBox(width: 8)],
Text(label, style: TextStyle(color: Colors.grey[600])), Expanded(
child: Text(
label,
style: theme.textTheme.bodySmall?.copyWith(
color: theme.colorScheme.onSurfaceVariant,
fontWeight: FontWeight.w500,
),
),
),
], ],
), ),
Flexible( const SizedBox(height: 4),
child: Text( Text(
value, value,
style: TextStyle(fontWeight: FontWeight.w500, color: valueColor), style: theme.textTheme.bodyLarge?.copyWith(
overflow: TextOverflow.ellipsis, color: valueColor,
fontWeight: FontWeight.w500,
), ),
), ),
], ],
@@ -379,11 +432,12 @@ class _SettingsScreenState extends State<SettingsScreen> {
if (onTap != null) { if (onTap != null) {
return InkWell( return InkWell(
borderRadius: BorderRadius.circular(6),
onTap: onTap, onTap: onTap,
borderRadius: BorderRadius.circular(4),
child: row, child: row,
); );
} }
return row; return row;
} }