Added Line Of Sight Feature for repeater placement, Added app wide Units Setting (#198)

* feat: add LOS workflow, global units, l10n cleanup, and mobile UI overflow fixes

Squashes prior PR commits into one changeset including: LOS map/service/tests, global metric/imperial unit system adoption, notification/BLE safety fixes, app-wide localization backfill/mojibake cleanup, and responsive UI title/overflow hardening.

* l10n: revert unrelated locale churn for LOS feature

* feat: keep LOS with app-wide unit settings

* fix: resolve post-merge app bar/import analyzer errors

* style: format screen files for CI
This commit is contained in:
just_stuff_tm
2026-02-21 01:08:23 -05:00
committed by GitHub
parent d2b693e5ce
commit f4b18d97a1
52 changed files with 6078 additions and 214 deletions
+115
View File
@@ -131,6 +131,7 @@
},
"settings_aboutLegalese": "2026 MeshCore Open Source Project",
"settings_aboutDescription": "An open-source Flutter client for MeshCore LoRa mesh networking devices.",
"settings_aboutOpenMeteoAttribution": "LOS elevation data: Open-Meteo (CC BY 4.0)",
"settings_infoName": "Name",
"settings_infoId": "ID",
"settings_infoStatus": "Status",
@@ -242,6 +243,9 @@
"appSettings_last24Hours": "Last 24 hours",
"appSettings_lastWeek": "Last week",
"appSettings_offlineMapCache": "Offline Map Cache",
"appSettings_unitsTitle": "Units",
"appSettings_unitsMetric": "Metric (m / km)",
"appSettings_unitsImperial": "Imperial (ft / mi)",
"appSettings_noAreaSelected": "No area selected",
"appSettings_areaSelectedZoom": "Area selected (zoom {minZoom}-{maxZoom})",
"@appSettings_areaSelectedZoom": {
@@ -639,6 +643,8 @@
},
"chat_invalidLink": "Invalid link format",
"map_title": "Node Map",
"map_lineOfSight": "Line of Sight",
"map_losScreenTitle": "Line of Sight",
"map_noNodesWithLocation": "No nodes with location data",
"map_nodesNeedGps": "Nodes need to share their GPS coordinates\nto appear on the map",
"map_nodesCount": "Nodes: {count}",
@@ -1548,6 +1554,115 @@
"pathTrace_refreshTooltip": "Refresh Path Trace.",
"pathTrace_someHopsNoLocation": "One or more of the hops is missing a location!",
"pathTrace_clearTooltip": "Clear path.",
"losSelectStartEnd": "Select start and end nodes for LOS.",
"losRunFailed": "Line-of-sight check failed: {error}",
"@losRunFailed": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"losClearAllPoints": "Clear all points",
"losRunToViewElevationProfile": "Run LOS to view elevation profile",
"losMenuTitle": "LOS Menu",
"losMenuSubtitle": "Tap nodes or long-press map for custom points",
"losShowDisplayNodes": "Show display nodes",
"losCustomPoints": "Custom points",
"losCustomPointLabel": "Custom {index}",
"@losCustomPointLabel": {
"placeholders": {
"index": {
"type": "int"
}
}
},
"losPointA": "Point A",
"losPointB": "Point B",
"losAntennaA": "Antenna A: {value} {unit}",
"@losAntennaA": {
"placeholders": {
"value": {
"type": "String"
},
"unit": {
"type": "String"
}
}
},
"losAntennaB": "Antenna B: {value} {unit}",
"@losAntennaB": {
"placeholders": {
"value": {
"type": "String"
},
"unit": {
"type": "String"
}
}
},
"losRun": "Run LOS",
"losNoElevationData": "No elevation data",
"losProfileClear": "{distance} {distanceUnit}, clear LOS, min clearance {clearance} {heightUnit}",
"@losProfileClear": {
"placeholders": {
"distance": {
"type": "String"
},
"distanceUnit": {
"type": "String"
},
"clearance": {
"type": "String"
},
"heightUnit": {
"type": "String"
}
}
},
"losProfileBlocked": "{distance} {distanceUnit}, blocked by {obstruction} {heightUnit}",
"@losProfileBlocked": {
"placeholders": {
"distance": {
"type": "String"
},
"distanceUnit": {
"type": "String"
},
"obstruction": {
"type": "String"
},
"heightUnit": {
"type": "String"
}
}
},
"losStatusChecking": "LOS: checking...",
"losStatusNoData": "LOS: no data",
"losStatusSummary": "LOS: {clear}/{total} clear, {blocked} blocked, {unknown} unknown",
"@losStatusSummary": {
"placeholders": {
"clear": {
"type": "int"
},
"total": {
"type": "int"
},
"blocked": {
"type": "int"
},
"unknown": {
"type": "int"
}
}
},
"losErrorElevationUnavailable": "Elevation data unavailable for one or more samples.",
"losErrorInvalidInput": "Invalid points/elevation data for LOS calculation.",
"losRenameCustomPoint": "Rename custom point",
"losPointName": "Point name",
"losShowPanelTooltip": "Show LOS panel",
"losHidePanelTooltip": "Hide LOS panel",
"losElevationAttribution": "Elevation data: Open-Meteo (CC BY 4.0)",
"contacts_pathTrace": "Path Trace",
"contacts_ping": "Ping",
"contacts_repeaterPathTrace": "Path trace to repeater",