Compare commits

...
2 Commits
Author SHA1 Message Date
livio 49ed7d5f0e Mantieni aperto il gestore livelli al refresh 2026-09-22 16:15:12 +02:00
livio 3856a9f675 Correggi deselezione oggetti mappa 2026-09-22 16:01:35 +02:00
6 changed files with 79 additions and 6 deletions

No files matched your search

+4
View File
@@ -713,6 +713,10 @@
private async Task ToggleLayerPanel() private async Task ToggleLayerPanel()
{ {
LayerPanelOpen = !LayerPanelOpen; LayerPanelOpen = !LayerPanelOpen;
if (!LayerPanelOpen)
{
await JS.InvokeVoidAsync("lmeMap.clearLayerManagerSelection");
}
if (LayerPanelOpen) if (LayerPanelOpen)
{ {
ActiveTab = "map"; ActiveTab = "map";
+2 -2
View File
@@ -28,8 +28,8 @@
<ApplicationId>com.companyname.lmemappecatastaliapp</ApplicationId> <ApplicationId>com.companyname.lmemappecatastaliapp</ApplicationId>
<!-- Versions --> <!-- Versions -->
<ApplicationDisplayVersion>0.2.19</ApplicationDisplayVersion> <ApplicationDisplayVersion>0.2.21</ApplicationDisplayVersion>
<ApplicationVersion>23</ApplicationVersion> <ApplicationVersion>25</ApplicationVersion>
<!-- To develop, package, and publish an app to the Microsoft Store, see: https://aka.ms/MauiTemplateUnpackaged --> <!-- To develop, package, and publish an app to the Microsoft Store, see: https://aka.ms/MauiTemplateUnpackaged -->
<WindowsPackageType>None</WindowsPackageType> <WindowsPackageType>None</WindowsPackageType>
+1 -1
View File
@@ -13,7 +13,7 @@ public sealed class AzureMapsService
public AzureMapsService() public AzureMapsService()
{ {
_httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("LMEMappeCatastali/0.2.19"); _httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("LMEMappeCatastali/0.2.21");
_httpClient.DefaultRequestHeaders.Accept.ParseAdd("application/json"); _httpClient.DefaultRequestHeaders.Accept.ParseAdd("application/json");
} }
+1 -1
View File
@@ -13,7 +13,7 @@ public sealed class NetworkLocationService
public NetworkLocationService() public NetworkLocationService()
{ {
httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("LMEMappeCatastali/0.2.19"); httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("LMEMappeCatastali/0.2.21");
} }
public async Task<NetworkLocationSnapshot?> GetApproximateLocationAsync( public async Task<NetworkLocationSnapshot?> GetApproximateLocationAsync(
+5
View File
@@ -354,6 +354,11 @@ input[type="checkbox"] {
outline: 2px solid #2563eb; outline: 2px solid #2563eb;
} }
.layer-manager-object-selected > summary {
background: #fff0fb;
box-shadow: inset 3px 0 #ff00d4;
}
.gps-overlay { .gps-overlay {
position: absolute; position: absolute;
top: 72px; top: 72px;
+66 -2
View File
@@ -51,10 +51,12 @@ const lmeState = {
managerHighlight: null, managerHighlight: null,
managerHighlightedObjectId: null, managerHighlightedObjectId: null,
managerHighlightedCategoryKey: null, managerHighlightedCategoryKey: null,
managerOutsideSelectionBound: false,
managerHiddenObjects: new Map(), managerHiddenObjects: new Map(),
managerHiddenObjectIds: new Set(), managerHiddenObjectIds: new Set(),
managerHiddenCategories: new Set(), managerHiddenCategories: new Set(),
managerObjectOrder: {} managerObjectOrder: {},
managerExpandedRows: new Set()
}; };
// AdE publishes the cadastral WMS in ETRS89. WMS 1.1.1 keeps the longitude, // AdE publishes the cadastral WMS in ETRS89. WMS 1.1.1 keeps the longitude,
@@ -78,6 +80,7 @@ window.lmeMap = {
setImportedSheetLayerVisible, setImportedSheetLayerVisible,
setLayerOrder, setLayerOrder,
refreshLayerManager, refreshLayerManager,
clearLayerManagerSelection: clearManagerHighlight,
setImportedMeasurementsVisible, setImportedMeasurementsVisible,
setDrawingMeasurementsVisible, setDrawingMeasurementsVisible,
addProjectMarker, addProjectMarker,
@@ -190,6 +193,7 @@ function init() {
} }
lmeState.map.on("click", async event => { lmeState.map.on("click", async event => {
clearManagerHighlight();
const info = await queryFeatureInfo(event.latlng); const info = await queryFeatureInfo(event.latlng);
if (info) { if (info) {
L.popup().setLatLng(event.latlng).setContent(info).openOn(lmeState.map); L.popup().setLatLng(event.latlng).setContent(info).openOn(lmeState.map);
@@ -211,6 +215,19 @@ function init() {
closeCadastrePreview(); closeCadastrePreview();
} }
}); });
if (!lmeState.managerOutsideSelectionBound) {
document.addEventListener("pointerdown", event => {
if (!lmeState.managerHighlightedObjectId) {
return;
}
const selectedRow = event.target?.closest?.(".layer-manager-object");
if (selectedRow?.dataset.objectId === lmeState.managerHighlightedObjectId) {
return;
}
clearManagerHighlight();
});
lmeState.managerOutsideSelectionBound = true;
}
setInfo("Mappa pronta: satellite + catasto AdE"); setInfo("Mappa pronta: satellite + catasto AdE");
} }
@@ -1164,6 +1181,9 @@ function refreshLayerManager() {
if (!container || !lmeState.map) { if (!container || !lmeState.map) {
return; return;
} }
captureLayerManagerExpansion(container);
const scrollHost = container.closest(".map-layer-panel");
const scrollTop = scrollHost?.scrollTop || 0;
applyStoredLayerManagerVisibility(); applyStoredLayerManagerVisibility();
container.innerHTML = ""; container.innerHTML = "";
lmeState.managerRecords = new Map(); lmeState.managerRecords = new Map();
@@ -1184,6 +1204,12 @@ function refreshLayerManager() {
applyManagedVisualOrder(container); applyManagedVisualOrder(container);
bindLayerManagerDrag(container); bindLayerManagerDrag(container);
bindLayerManagerMoveButtons(container); bindLayerManagerMoveButtons(container);
if (scrollHost) {
scrollHost.scrollTop = scrollTop;
window.requestAnimationFrame(() => {
scrollHost.scrollTop = scrollTop;
});
}
} }
function renderLayerManagerCategory(category, records) { function renderLayerManagerCategory(category, records) {
@@ -1191,6 +1217,7 @@ function renderLayerManagerCategory(category, records) {
group.className = "layer-manager-group"; group.className = "layer-manager-group";
group.dataset.dragType = "category"; group.dataset.dragType = "category";
group.dataset.categoryKey = category.key; group.dataset.categoryKey = category.key;
bindLayerManagerExpansion(group, `category:${category.key}`);
const visibleCount = records.filter(record => !lmeState.managerHiddenObjectIds.has(record.id)).length; const visibleCount = records.filter(record => !lmeState.managerHiddenObjectIds.has(record.id)).length;
const categoryVisible = !lmeState.managerHiddenCategories.has(category.key) const categoryVisible = !lmeState.managerHiddenCategories.has(category.key)
&& (!category.roots.length || category.roots.some(layer => lmeState.map.hasLayer(layer))); && (!category.roots.length || category.roots.some(layer => lmeState.map.hasLayer(layer)));
@@ -1221,6 +1248,7 @@ function renderLayerManagerBlock(category, source, records) {
block.dataset.dragType = "block"; block.dataset.dragType = "block";
block.dataset.categoryKey = category.key; block.dataset.categoryKey = category.key;
block.dataset.blockKey = source; block.dataset.blockKey = source;
bindLayerManagerExpansion(block, `block:${category.key}:${source}`);
const visibleCount = records.filter(record => !lmeState.managerHiddenObjectIds.has(record.id)).length; const visibleCount = records.filter(record => !lmeState.managerHiddenObjectIds.has(record.id)).length;
const visible = visibleCount === records.length; const visible = visibleCount === records.length;
block.innerHTML = `<summary><button type="button" class="layer-drag-handle" aria-label="Trascina blocco">☰</button><input type="checkbox" ${visible ? "checked" : ""} aria-label="Mostra blocco"><span class="layer-manager-title">${escapeHtml(source)}</span>${layerManagerMoveButtons("blocco")}<span class="layer-manager-count">${records.length}</span></summary><div class="layer-manager-children"></div>`; block.innerHTML = `<summary><button type="button" class="layer-drag-handle" aria-label="Trascina blocco">☰</button><input type="checkbox" ${visible ? "checked" : ""} aria-label="Mostra blocco"><span class="layer-manager-title">${escapeHtml(source)}</span>${layerManagerMoveButtons("blocco")}<span class="layer-manager-count">${records.length}</span></summary><div class="layer-manager-children"></div>`;
@@ -1239,8 +1267,12 @@ function renderLayerManagerBlock(category, source, records) {
function renderLayerManagerObject(record, index) { function renderLayerManagerObject(record, index) {
const object = document.createElement("details"); const object = document.createElement("details");
object.className = "layer-manager-object"; object.className = "layer-manager-object";
if (record.id === lmeState.managerHighlightedObjectId) {
object.classList.add("layer-manager-object-selected");
}
object.dataset.dragType = "object"; object.dataset.dragType = "object";
object.dataset.objectId = record.id; object.dataset.objectId = record.id;
bindLayerManagerExpansion(object, `object:${record.id}`);
const visible = !lmeState.managerHiddenObjectIds.has(record.id); const visible = !lmeState.managerHiddenObjectIds.has(record.id);
object.innerHTML = `<summary><button type="button" class="layer-drag-handle" aria-label="Trascina oggetto">☰</button><input type="checkbox" ${visible ? "checked" : ""} aria-label="Mostra oggetto"><span class="layer-manager-title">${escapeHtml(managedObjectLabel(record, index))}</span>${layerManagerMoveButtons("oggetto")}<span class="layer-manager-count">›</span></summary><div class="layer-manager-details"></div>`; object.innerHTML = `<summary><button type="button" class="layer-drag-handle" aria-label="Trascina oggetto">☰</button><input type="checkbox" ${visible ? "checked" : ""} aria-label="Mostra oggetto"><span class="layer-manager-title">${escapeHtml(managedObjectLabel(record, index))}</span>${layerManagerMoveButtons("oggetto")}<span class="layer-manager-count">›</span></summary><div class="layer-manager-details"></div>`;
const checkbox = object.querySelector("input"); const checkbox = object.querySelector("input");
@@ -1260,6 +1292,28 @@ function renderLayerManagerObject(record, index) {
return object; return object;
} }
function captureLayerManagerExpansion(container) {
container.querySelectorAll("details[data-expansion-key]").forEach(row => {
if (row.open) {
lmeState.managerExpandedRows.add(row.dataset.expansionKey);
} else {
lmeState.managerExpandedRows.delete(row.dataset.expansionKey);
}
});
}
function bindLayerManagerExpansion(row, key) {
row.dataset.expansionKey = key;
row.open = lmeState.managerExpandedRows.has(key);
row.addEventListener("toggle", () => {
if (row.open) {
lmeState.managerExpandedRows.add(key);
} else {
lmeState.managerExpandedRows.delete(key);
}
});
}
function setManagedCategoryVisible(category, visible) { function setManagedCategoryVisible(category, visible) {
if (category.key === "imported") { if (category.key === "imported") {
lmeState.importedVisible = visible; lmeState.importedVisible = visible;
@@ -1343,9 +1397,16 @@ function managedCategoryEnabled(categoryKey) {
} }
function highlightManagedObject(record) { function highlightManagedObject(record) {
lmeState.managerHighlight.clearLayers(); if (lmeState.managerHighlightedObjectId === record.id) {
clearManagerHighlight();
return;
}
clearManagerHighlight();
lmeState.managerHighlightedObjectId = record.id; lmeState.managerHighlightedObjectId = record.id;
lmeState.managerHighlightedCategoryKey = record.categoryKey; lmeState.managerHighlightedCategoryKey = record.categoryKey;
document.querySelectorAll(".layer-manager-object").forEach(row => {
row.classList.toggle("layer-manager-object-selected", row.dataset.objectId === record.id);
});
const geojson = record.layer.toGeoJSON?.(); const geojson = record.layer.toGeoJSON?.();
if (geojson) { if (geojson) {
L.geoJSON(geojson, { L.geoJSON(geojson, {
@@ -1370,6 +1431,9 @@ function clearManagerHighlight() {
lmeState.managerHighlight?.clearLayers(); lmeState.managerHighlight?.clearLayers();
lmeState.managerHighlightedObjectId = null; lmeState.managerHighlightedObjectId = null;
lmeState.managerHighlightedCategoryKey = null; lmeState.managerHighlightedCategoryKey = null;
document.querySelectorAll(".layer-manager-object-selected").forEach(row => {
row.classList.remove("layer-manager-object-selected");
});
} }
function layerManagerMoveButtons(label) { function layerManagerMoveButtons(label) {