diff --git a/Components/Pages/Home.razor b/Components/Pages/Home.razor index 171e6b0..e242d6e 100644 --- a/Components/Pages/Home.razor +++ b/Components/Pages/Home.razor @@ -58,8 +58,15 @@ } +
- +
@@ -175,7 +182,7 @@ La cornice grande resta separata dalle particelle e puo essere nascosta anche nei progetti salvati.
@@ -187,7 +194,7 @@

Disegni e misure

@@ -300,11 +307,11 @@ Il comando agisce subito sulla mappa e sui dati del progetto caricato.
@@ -357,11 +364,11 @@

GPS e percorso

@@ -415,6 +422,7 @@
@code { + private const string FlagPreferencePrefix = "lme_flag_"; private string ActiveTab { get; set; } = "map"; private string SearchText { get; set; } = string.Empty; private string NewProjectName { get; set; } = string.Empty; @@ -437,6 +445,7 @@ private bool CatalogBusy { get; set; } private bool GpsActive { get; set; } private bool ShowGpsPosition { get; set; } = true; + private bool ShowSelectedParcels { get; set; } = true; private bool DrawToolsVisible { get; set; } private bool TrailEnabled { get; set; } private bool LayerPanelOpen { get; set; } @@ -502,6 +511,8 @@ protected override async Task OnInitializedAsync() { + LoadFlagPreferences(); + try { GoogleMapsApiKey = await SecureStorage.Default.GetAsync("google_maps_api_key") ?? string.Empty; @@ -537,6 +548,7 @@ if (firstRender) { await JS.InvokeVoidAsync("lmeMap.init"); + await ApplyFlagPreferencesToMapAsync(); await CenterOnInitialLocationAsync(); await MigrateLegacyProjectAsync(); } @@ -854,9 +866,9 @@ } } - private async Task ToggleGpsPosition(ChangeEventArgs args) + private async Task ApplyGpsPositionVisibility() { - ShowGpsPosition = (bool?)args.Value == true; + SaveFlagPreferences(); await JS.InvokeVoidAsync("lmeMap.setGpsPositionVisible", ShowGpsPosition); } @@ -969,6 +981,7 @@ private async Task ClearImportedLayers() { ShowImportedSheetLayer = false; + SaveFlagPreferences(); await JS.InvokeVoidAsync("lmeMap.clearImported"); } private Task AddProjectMarker() => JS.InvokeVoidAsync("lmeMap.addProjectMarker", PoiName).AsTask(); @@ -976,30 +989,33 @@ private async Task ApplyKmlSheetLayerOption() { ShowImportedSheetLayer = IncludeKmlSheetLayer; + SaveFlagPreferences(); await JS.InvokeVoidAsync("lmeMap.setIncludeKmlSheetLayer", IncludeKmlSheetLayer); await JS.InvokeVoidAsync("lmeMap.setImportedSheetLayerVisible", ShowImportedSheetLayer); } private Task ApplyImportedSheetLayerVisibility() { + SaveFlagPreferences(); return JS.InvokeVoidAsync("lmeMap.setImportedSheetLayerVisible", ShowImportedSheetLayer).AsTask(); } - private async Task ToggleImportedMeasurements(ChangeEventArgs args) + private async Task ApplyImportedMeasurementsVisibility() { - ShowImportedMeasurements = (bool?)args.Value == true; + SaveFlagPreferences(); await JS.InvokeVoidAsync("lmeMap.setImportedMeasurementsVisible", ShowImportedMeasurements); } - private async Task ToggleDrawingMeasurements(ChangeEventArgs args) + private async Task ApplyDrawingMeasurementsVisibility() { - ShowDrawingMeasurements = (bool?)args.Value == true; + SaveFlagPreferences(); await JS.InvokeVoidAsync("lmeMap.setDrawingMeasurementsVisible", ShowDrawingMeasurements); } private async Task ToggleDrawTools() { DrawToolsVisible = !DrawToolsVisible; + SaveFlagPreferences(); await JS.InvokeVoidAsync("lmeMap.setDrawToolsVisible", DrawToolsVisible); if (DrawToolsVisible) @@ -1164,6 +1180,7 @@ ShowDrawingMeasurements = options.ShowDrawingMeasurements; DrawToolsVisible = options.DrawToolsVisible; ShowGpsPosition = options.GpsPositionVisible; + ShowSelectedParcels = options.SelectedParcelsVisible; TrailEnabled = options.TrailEnabled; var activeLayers = (options.CadastreLayers ?? []).ToHashSet(StringComparer.Ordinal); @@ -1171,6 +1188,7 @@ { layer.Enabled = activeLayers.Contains(layer.Key); } + SaveFlagPreferences(); } private async Task DeleteProject() @@ -1203,9 +1221,9 @@ } } private Task CenterOnGps() => JS.InvokeVoidAsync("lmeMap.centerOnGps").AsTask(); - private async Task ToggleTrail(ChangeEventArgs args) + private async Task ApplyTrailOption() { - TrailEnabled = (bool?)args.Value == true; + SaveFlagPreferences(); await JS.InvokeVoidAsync("lmeMap.toggleTrail", TrailEnabled); } private async Task ChangeBaseLayer(ChangeEventArgs args) @@ -1310,9 +1328,87 @@ private async Task ToggleCadastreLayer(CadastralLayer layer, ChangeEventArgs args) { layer.Enabled = args.Value is true; + SaveFlagPreferences(); await JS.InvokeVoidAsync("lmeMap.toggleCadastreLayer", layer.Key, layer.Enabled); } + private void LoadFlagPreferences() + { + IncludeCadastralParcels = GetFlagPreference("include_cadastral_parcels", true); + IncludeKmlSheetLayer = GetFlagPreference("include_kml_sheet_layer", false); + ShowImportedSheetLayer = GetFlagPreference("show_imported_sheet_layer", false); + ShowImportedMeasurements = GetFlagPreference("show_imported_measurements", false); + ShowDrawingMeasurements = GetFlagPreference("show_drawing_measurements", true); + DrawToolsVisible = GetFlagPreference("draw_tools_visible", false); + ShowGpsPosition = GetFlagPreference("show_gps_position", true); + ShowSelectedParcels = GetFlagPreference("show_selected_parcels", true); + TrailEnabled = GetFlagPreference("trail_enabled", false); + ExportImported = GetFlagPreference("export_imported", true); + ExportImportedSheets = GetFlagPreference("export_imported_sheets", true); + ExportCadastral = GetFlagPreference("export_cadastral", true); + ExportDrawings = GetFlagPreference("export_drawings", true); + ExportPoi = GetFlagPreference("export_poi", true); + ExportTrail = GetFlagPreference("export_trail", true); + + foreach (var layer in CadastralLayers) + { + layer.Enabled = GetFlagPreference($"cadastre_layer_{layer.Key}", layer.Enabled); + } + } + + private void SaveFlagPreferences() + { + SetFlagPreference("include_cadastral_parcels", IncludeCadastralParcels); + SetFlagPreference("include_kml_sheet_layer", IncludeKmlSheetLayer); + SetFlagPreference("show_imported_sheet_layer", ShowImportedSheetLayer); + SetFlagPreference("show_imported_measurements", ShowImportedMeasurements); + SetFlagPreference("show_drawing_measurements", ShowDrawingMeasurements); + SetFlagPreference("draw_tools_visible", DrawToolsVisible); + SetFlagPreference("show_gps_position", ShowGpsPosition); + SetFlagPreference("show_selected_parcels", ShowSelectedParcels); + SetFlagPreference("trail_enabled", TrailEnabled); + SetFlagPreference("export_imported", ExportImported); + SetFlagPreference("export_imported_sheets", ExportImportedSheets); + SetFlagPreference("export_cadastral", ExportCadastral); + SetFlagPreference("export_drawings", ExportDrawings); + SetFlagPreference("export_poi", ExportPoi); + SetFlagPreference("export_trail", ExportTrail); + + foreach (var layer in CadastralLayers) + { + SetFlagPreference($"cadastre_layer_{layer.Key}", layer.Enabled); + } + } + + private async Task ApplyFlagPreferencesToMapAsync() + { + await JS.InvokeVoidAsync("lmeMap.setIncludeKmlSheetLayer", IncludeKmlSheetLayer); + await JS.InvokeVoidAsync("lmeMap.setImportedSheetLayerVisible", ShowImportedSheetLayer); + await JS.InvokeVoidAsync("lmeMap.setImportedMeasurementsVisible", ShowImportedMeasurements); + await JS.InvokeVoidAsync("lmeMap.setDrawingMeasurementsVisible", ShowDrawingMeasurements); + await JS.InvokeVoidAsync("lmeMap.setDrawToolsVisible", DrawToolsVisible); + await JS.InvokeVoidAsync("lmeMap.setGpsPositionVisible", ShowGpsPosition); + await JS.InvokeVoidAsync("lmeMap.setSelectedParcelsVisible", ShowSelectedParcels); + await JS.InvokeVoidAsync("lmeMap.toggleTrail", TrailEnabled); + + foreach (var layer in CadastralLayers) + { + await JS.InvokeVoidAsync("lmeMap.toggleCadastreLayer", layer.Key, layer.Enabled); + } + } + + private static bool GetFlagPreference(string name, bool defaultValue) => + Preferences.Default.Get($"{FlagPreferencePrefix}{name}", defaultValue); + + private static void SetFlagPreference(string name, bool value) => + Preferences.Default.Set($"{FlagPreferencePrefix}{name}", value); + + private async Task ApplySelectedParcelsVisibility() + { + SaveFlagPreferences(); + await JS.InvokeVoidAsync("lmeMap.setSelectedParcelsVisible", ShowSelectedParcels); + } + private async Task ExportCadastralImage() { ActiveTab = "map"; @@ -1351,6 +1447,7 @@ public bool ShowDrawingMeasurements { get; init; } = true; public bool DrawToolsVisible { get; init; } public bool GpsPositionVisible { get; init; } = true; + public bool SelectedParcelsVisible { get; init; } = true; public bool TrailEnabled { get; init; } } diff --git a/LMEMappeCatastaliApp.csproj b/LMEMappeCatastaliApp.csproj index d067e8e..7f14ed6 100644 --- a/LMEMappeCatastaliApp.csproj +++ b/LMEMappeCatastaliApp.csproj @@ -28,8 +28,8 @@ com.companyname.lmemappecatastaliapp - 0.2.16 - 20 + 0.2.17 + 21 None diff --git a/Services/AzureMapsService.cs b/Services/AzureMapsService.cs index 31a5d1f..4ff176f 100644 --- a/Services/AzureMapsService.cs +++ b/Services/AzureMapsService.cs @@ -13,7 +13,7 @@ public sealed class AzureMapsService public AzureMapsService() { - _httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("LMEMappeCatastali/0.2.16"); + _httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("LMEMappeCatastali/0.2.17"); _httpClient.DefaultRequestHeaders.Accept.ParseAdd("application/json"); } diff --git a/Services/NetworkLocationService.cs b/Services/NetworkLocationService.cs index 26d8033..2e9e312 100644 --- a/Services/NetworkLocationService.cs +++ b/Services/NetworkLocationService.cs @@ -13,7 +13,7 @@ public sealed class NetworkLocationService public NetworkLocationService() { - httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("LMEMappeCatastali/0.2.16"); + httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("LMEMappeCatastali/0.2.17"); } public async Task GetApproximateLocationAsync( diff --git a/wwwroot/js/lme-map.js b/wwwroot/js/lme-map.js index 68ab857..1f8964a 100644 --- a/wwwroot/js/lme-map.js +++ b/wwwroot/js/lme-map.js @@ -26,6 +26,7 @@ const lmeState = { lastAccuracy: 0, gpsTrail: null, selectedParcelsLayer: null, + selectedParcelsVisible: true, gpsParcelLayer: null, gpsTrailEnabled: false, gpsTrailPoints: [], @@ -50,6 +51,7 @@ window.lmeMap = { exportCadastreView, closeCadastrePreview, clearSelectedParcels, + setSelectedParcelsVisible, clearMapElements, fitImported, clearImported, @@ -1701,6 +1703,7 @@ function captureDisplayOptions() { showDrawingMeasurements: lmeState.showDrawingMeasurements, drawToolsVisible: Boolean(lmeState.drawControl), gpsPositionVisible: lmeState.gpsPositionVisible, + selectedParcelsVisible: lmeState.selectedParcelsVisible, trailEnabled: lmeState.gpsTrailEnabled }; } @@ -1733,6 +1736,7 @@ function applyProjectDisplayOptions(options) { setBaseLayer(options.baseLayer); } setGpsPositionVisible(options.gpsPositionVisible !== false); + setSelectedParcelsVisible(options.selectedParcelsVisible !== false); toggleTrail(Boolean(options.trailEnabled)); setDrawToolsVisible(Boolean(options.drawToolsVisible)); } @@ -2066,6 +2070,30 @@ function clearSelectedParcels() { setInfo(count ? `${count} particelle selezionate rimosse.` : "Non ci sono particelle selezionate da rimuovere."); } +function setSelectedParcelsVisible(enabled) { + lmeState.selectedParcelsVisible = Boolean(enabled); + if (!lmeState.map || !lmeState.selectedParcelsLayer) { + return; + } + + if (lmeState.selectedParcelsVisible) { + if (!lmeState.map.hasLayer(lmeState.selectedParcelsLayer)) { + lmeState.selectedParcelsLayer.addTo(lmeState.map); + } + lmeState.selectedParcelsLayer.bringToFront(); + const count = lmeState.selectedParcelsLayer.toGeoJSON().features?.length || 0; + setInfo(count + ? `${count} particelle selezionate visibili.` + : "Nessuna particella selezionata da mostrare."); + return; + } + + if (lmeState.map.hasLayer(lmeState.selectedParcelsLayer)) { + lmeState.map.removeLayer(lmeState.selectedParcelsLayer); + } + setInfo("Particelle selezionate nascoste; i dati restano nel progetto."); +} + function clearMapElements() { const count = lmeState.selectedParcelsLayer.getLayers().length + lmeState.gpsParcelLayer.getLayers().length