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
+208
View File
@@ -700,6 +700,12 @@ abstract class AppLocalizations {
/// **'An open-source Flutter client for MeshCore LoRa mesh networking devices.'**
String get settings_aboutDescription;
/// No description provided for @settings_aboutOpenMeteoAttribution.
///
/// In en, this message translates to:
/// **'LOS elevation data: Open-Meteo (CC BY 4.0)'**
String get settings_aboutOpenMeteoAttribution;
/// No description provided for @settings_infoName.
///
/// In en, this message translates to:
@@ -1240,6 +1246,24 @@ abstract class AppLocalizations {
/// **'Offline Map Cache'**
String get appSettings_offlineMapCache;
/// No description provided for @appSettings_unitsTitle.
///
/// In en, this message translates to:
/// **'Units'**
String get appSettings_unitsTitle;
/// No description provided for @appSettings_unitsMetric.
///
/// In en, this message translates to:
/// **'Metric (m / km)'**
String get appSettings_unitsMetric;
/// No description provided for @appSettings_unitsImperial.
///
/// In en, this message translates to:
/// **'Imperial (ft / mi)'**
String get appSettings_unitsImperial;
/// No description provided for @appSettings_noAreaSelected.
///
/// In en, this message translates to:
@@ -2290,6 +2314,18 @@ abstract class AppLocalizations {
/// **'Node Map'**
String get map_title;
/// No description provided for @map_lineOfSight.
///
/// In en, this message translates to:
/// **'Line of Sight'**
String get map_lineOfSight;
/// No description provided for @map_losScreenTitle.
///
/// In en, this message translates to:
/// **'Line of Sight'**
String get map_losScreenTitle;
/// No description provided for @map_noNodesWithLocation.
///
/// In en, this message translates to:
@@ -4772,6 +4808,178 @@ abstract class AppLocalizations {
/// **'Clear path.'**
String get pathTrace_clearTooltip;
/// No description provided for @losSelectStartEnd.
///
/// In en, this message translates to:
/// **'Select start and end nodes for LOS.'**
String get losSelectStartEnd;
/// No description provided for @losRunFailed.
///
/// In en, this message translates to:
/// **'Line-of-sight check failed: {error}'**
String losRunFailed(String error);
/// No description provided for @losClearAllPoints.
///
/// In en, this message translates to:
/// **'Clear all points'**
String get losClearAllPoints;
/// No description provided for @losRunToViewElevationProfile.
///
/// In en, this message translates to:
/// **'Run LOS to view elevation profile'**
String get losRunToViewElevationProfile;
/// No description provided for @losMenuTitle.
///
/// In en, this message translates to:
/// **'LOS Menu'**
String get losMenuTitle;
/// No description provided for @losMenuSubtitle.
///
/// In en, this message translates to:
/// **'Tap nodes or long-press map for custom points'**
String get losMenuSubtitle;
/// No description provided for @losShowDisplayNodes.
///
/// In en, this message translates to:
/// **'Show display nodes'**
String get losShowDisplayNodes;
/// No description provided for @losCustomPoints.
///
/// In en, this message translates to:
/// **'Custom points'**
String get losCustomPoints;
/// No description provided for @losCustomPointLabel.
///
/// In en, this message translates to:
/// **'Custom {index}'**
String losCustomPointLabel(int index);
/// No description provided for @losPointA.
///
/// In en, this message translates to:
/// **'Point A'**
String get losPointA;
/// No description provided for @losPointB.
///
/// In en, this message translates to:
/// **'Point B'**
String get losPointB;
/// No description provided for @losAntennaA.
///
/// In en, this message translates to:
/// **'Antenna A: {value} {unit}'**
String losAntennaA(String value, String unit);
/// No description provided for @losAntennaB.
///
/// In en, this message translates to:
/// **'Antenna B: {value} {unit}'**
String losAntennaB(String value, String unit);
/// No description provided for @losRun.
///
/// In en, this message translates to:
/// **'Run LOS'**
String get losRun;
/// No description provided for @losNoElevationData.
///
/// In en, this message translates to:
/// **'No elevation data'**
String get losNoElevationData;
/// No description provided for @losProfileClear.
///
/// In en, this message translates to:
/// **'{distance} {distanceUnit}, clear LOS, min clearance {clearance} {heightUnit}'**
String losProfileClear(
String distance,
String distanceUnit,
String clearance,
String heightUnit,
);
/// No description provided for @losProfileBlocked.
///
/// In en, this message translates to:
/// **'{distance} {distanceUnit}, blocked by {obstruction} {heightUnit}'**
String losProfileBlocked(
String distance,
String distanceUnit,
String obstruction,
String heightUnit,
);
/// No description provided for @losStatusChecking.
///
/// In en, this message translates to:
/// **'LOS: checking...'**
String get losStatusChecking;
/// No description provided for @losStatusNoData.
///
/// In en, this message translates to:
/// **'LOS: no data'**
String get losStatusNoData;
/// No description provided for @losStatusSummary.
///
/// In en, this message translates to:
/// **'LOS: {clear}/{total} clear, {blocked} blocked, {unknown} unknown'**
String losStatusSummary(int clear, int total, int blocked, int unknown);
/// No description provided for @losErrorElevationUnavailable.
///
/// In en, this message translates to:
/// **'Elevation data unavailable for one or more samples.'**
String get losErrorElevationUnavailable;
/// No description provided for @losErrorInvalidInput.
///
/// In en, this message translates to:
/// **'Invalid points/elevation data for LOS calculation.'**
String get losErrorInvalidInput;
/// No description provided for @losRenameCustomPoint.
///
/// In en, this message translates to:
/// **'Rename custom point'**
String get losRenameCustomPoint;
/// No description provided for @losPointName.
///
/// In en, this message translates to:
/// **'Point name'**
String get losPointName;
/// No description provided for @losShowPanelTooltip.
///
/// In en, this message translates to:
/// **'Show LOS panel'**
String get losShowPanelTooltip;
/// No description provided for @losHidePanelTooltip.
///
/// In en, this message translates to:
/// **'Hide LOS panel'**
String get losHidePanelTooltip;
/// No description provided for @losElevationAttribution.
///
/// In en, this message translates to:
/// **'Elevation data: Open-Meteo (CC BY 4.0)'**
String get losElevationAttribution;
/// No description provided for @contacts_pathTrace.
///
/// In en, this message translates to: