Keep comparison and multi-selection visible

This commit is contained in:
livio committed 2026-10-05 18:29:18 +02:00
1 parent e70a30f7d7
commit 8a8fc1dfe4
2 files changed
+35 -9

No files matched your search

+2 -2
View File
@@ -29,8 +29,8 @@
<ApplicationId>it.liviomerola.lmemappecatastali.pro</ApplicationId> <ApplicationId>it.liviomerola.lmemappecatastali.pro</ApplicationId>
<!-- Versions --> <!-- Versions -->
<ApplicationDisplayVersion>1.0.21</ApplicationDisplayVersion> <ApplicationDisplayVersion>1.0.22</ApplicationDisplayVersion>
<ApplicationVersion>121</ApplicationVersion> <ApplicationVersion>122</ApplicationVersion>
<Version>$(ApplicationDisplayVersion)</Version> <Version>$(ApplicationDisplayVersion)</Version>
<!-- 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 -->
+33 -7
View File
@@ -349,7 +349,8 @@ function init(dotNetReference) {
}); });
lmeState.map.createPane("drawingsMarkerPane", lmeState.map._norotatePane || lmeState.map._mapPane); lmeState.map.createPane("drawingsMarkerPane", lmeState.map._norotatePane || lmeState.map._mapPane);
lmeState.map.createPane("gpsAccuracyPane", lmeState.map._rotatePane || lmeState.map._mapPane); lmeState.map.createPane("gpsAccuracyPane", lmeState.map._rotatePane || lmeState.map._mapPane);
lmeState.map.createPane("comparisonPane", lmeState.map._rotatePane || lmeState.map._mapPane); const comparisonPane = lmeState.map.createPane("comparisonPane", lmeState.map._rotatePane || lmeState.map._mapPane);
comparisonPane.style.zIndex = "680";
const managerHighlightPane = lmeState.map.createPane("managerHighlightPane", lmeState.map._rotatePane || lmeState.map._mapPane); const managerHighlightPane = lmeState.map.createPane("managerHighlightPane", lmeState.map._rotatePane || lmeState.map._mapPane);
managerHighlightPane.style.zIndex = "650"; managerHighlightPane.style.zIndex = "650";
lmeState.drawingsRenderer = L.canvas({ pane: "drawingsPane", tolerance: 14 }); lmeState.drawingsRenderer = L.canvas({ pane: "drawingsPane", tolerance: 14 });
@@ -395,7 +396,7 @@ function init(dotNetReference) {
return; return;
} }
hideDrawingScopeMenu(); hideDrawingScopeMenu();
clearManagerHighlight(); if (!multiSelectionHasObjects()) 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);
@@ -453,6 +454,10 @@ function init(dotNetReference) {
|| selectedParent?.dataset.highlightKey === lmeState.managerHighlightedParentKey) { || selectedParent?.dataset.highlightKey === lmeState.managerHighlightedParentKey) {
return; return;
} }
if (multiSelectionHasObjects()) {
renderSelectedManagerHighlight();
return;
}
clearManagerHighlight(); clearManagerHighlight();
}); });
lmeState.managerOutsideSelectionBound = true; lmeState.managerOutsideSelectionBound = true;
@@ -1607,7 +1612,7 @@ function setLayerOrder(order) {
normalized.forEach((key, index) => { normalized.forEach((key, index) => {
const zIndex = String(590 - index * 20); const zIndex = String(590 - index * 20);
const paneNames = [panes[key]]; const paneNames = [panes[key]];
if (key === "drawings") paneNames.push("drawingsMarkerPane", "comparisonPane"); if (key === "drawings") paneNames.push("drawingsMarkerPane");
if (key === "gpsPosition") paneNames.push("gpsAccuracyPane"); if (key === "gpsPosition") paneNames.push("gpsAccuracyPane");
paneNames.forEach(paneName => { paneNames.forEach(paneName => {
const pane = lmeState.map.getPane(paneName); const pane = lmeState.map.getPane(paneName);
@@ -2194,6 +2199,7 @@ function refreshLayerManager() {
scrollHost.scrollTop = scrollTop; scrollHost.scrollTop = scrollTop;
}); });
} }
if (multiSelectionHasObjects()) renderSelectedManagerHighlight();
} }
function renderLayerManagerCategory(category, records) { function renderLayerManagerCategory(category, records) {
@@ -3261,13 +3267,15 @@ function compareSelectedGeometries() {
const resultLayers = []; const resultLayers = [];
const addResult = (feature, name, color, role) => { const addResult = (feature, name, color, role) => {
if (!feature) return; if (!feature) return;
const overlapResult = role === "overlap";
feature.properties = { feature.properties = {
name, name,
_lmeSource: "Confronto confini",
_lmeColor: color, _lmeColor: color,
_lmeFillColor: color, _lmeFillColor: color,
_lmeWeight: 3, _lmeWeight: overlapResult ? 5 : 3,
_lmeOpacity: 1, _lmeOpacity: 1,
_lmeFillOpacity: 0.48, _lmeFillOpacity: overlapResult ? 0.72 : 0.48,
_lmeComparisonResult: true, _lmeComparisonResult: true,
_lmeComparisonRole: role, _lmeComparisonRole: role,
_lmeManagerId: undefined _lmeManagerId: undefined
@@ -3278,6 +3286,13 @@ function compareSelectedGeometries() {
addResult(onlyFirst, `Solo ${managedObjectLabel(polygons[0], 0)}`, "#ef4444", "only-first"); addResult(onlyFirst, `Solo ${managedObjectLabel(polygons[0], 0)}`, "#ef4444", "only-first");
addResult(onlySecond, `Solo ${managedObjectLabel(polygons[1], 1)}`, "#2563eb", "only-second"); addResult(onlySecond, `Solo ${managedObjectLabel(polygons[1], 1)}`, "#2563eb", "only-second");
addResult(overlap, "Sovrapposizione", "#16a34a", "overlap"); addResult(overlap, "Sovrapposizione", "#16a34a", "overlap");
const comparisonIds = [...resultLayers].reverse().map(layer => managedLayerId(layer, "drawings"));
const previousOrder = lmeState.managerObjectOrder.drawings || [];
lmeState.managerObjectOrder.drawings = [
...comparisonIds,
...previousOrder.filter(id => !comparisonIds.includes(id))
];
saveLayerManagerState();
const firstArea = onlyFirst ? turf.area(onlyFirst) : 0; const secondArea = onlySecond ? turf.area(onlySecond) : 0; const overlapArea = overlap ? turf.area(overlap) : 0; const firstArea = onlyFirst ? turf.area(onlyFirst) : 0; const secondArea = onlySecond ? turf.area(onlySecond) : 0; const overlapArea = overlap ? turf.area(overlap) : 0;
const message = `Confronto creato. Solo primo confine: ${formatArea(firstArea)}. Solo secondo confine: ${formatArea(secondArea)}. Sovrapposizione: ${formatArea(overlapArea)}.`; const message = `Confronto creato. Solo primo confine: ${formatArea(firstArea)}. Solo secondo confine: ${formatArea(secondArea)}. Sovrapposizione: ${formatArea(overlapArea)}.`;
lmeState.managerSelectedObjectIds.clear(); lmeState.managerSelectedObjectIds.clear();
@@ -3358,6 +3373,10 @@ function toggleMultiSelection() {
return lmeState.multiSelectionEnabled; return lmeState.multiSelectionEnabled;
} }
function multiSelectionHasObjects() {
return lmeState.multiSelectionEnabled && lmeState.managerSelectedObjectIds.size > 0;
}
function refreshMultipleMapSelection(preferredRecord) { function refreshMultipleMapSelection(preferredRecord) {
clearManagerHighlight(); clearManagerHighlight();
const selectedRecords = selectedManagedRecords(); const selectedRecords = selectedManagedRecords();
@@ -3389,8 +3408,8 @@ function showLeafletToolbarHelp() {
<div><dt>▱</dt><dd><strong>Elimina disegni</strong>Premi il cestino e scegli Solo selezionato oppure Tutti. L'oggetto rimosso può essere recuperato con Annulla o dal cestino negli strumenti avanzati.</dd></div> <div><dt>▱</dt><dd><strong>Elimina disegni</strong>Premi il cestino e scegli Solo selezionato oppure Tutti. L'oggetto rimosso può essere recuperato con Annulla o dal cestino negli strumenti avanzati.</dd></div>
<div><dt>✓</dt><dd><strong>Controlla e ripara</strong>Verifica gli oggetti selezionati e prova a correggere coordinate duplicate o poligoni non validi. Esempio: usalo quando un contorno importato non si esporta o si riempie male; al termine compare un riepilogo.</dd></div> <div><dt>✓</dt><dd><strong>Controlla e ripara</strong>Verifica gli oggetti selezionati e prova a correggere coordinate duplicate o poligoni non validi. Esempio: usalo quando un contorno importato non si esporta o si riempie male; al termine compare un riepilogo.</dd></div>
<div><dt>◉</dt><dd><strong>Crea foro</strong>Seleziona esattamente due poligoni: prima l'area esterna, poi quella interna. Esempio: sottrai il cortile dal perimetro di un fabbricato o un'isola esclusa da un'area di lavoro.</dd></div> <div><dt>◉</dt><dd><strong>Crea foro</strong>Seleziona esattamente due poligoni: prima l'area esterna, poi quella interna. Esempio: sottrai il cortile dal perimetro di un fabbricato o un'isola esclusa da un'area di lavoro.</dd></div>
<div><dt>☑</dt><dd><strong>Selezione multipla</strong>Attiva il comando e tocca più oggetti sulla mappa per aggiungerli o rimuoverli dalla selezione. Disattivalo per tornare alla selezione singola. È utile prima di Confronta, Unisci, Buffer e altre operazioni su più oggetti.</dd></div> <div><dt>☑</dt><dd><strong>Selezione multipla</strong>Attiva il comando e tocca più oggetti sulla mappa per aggiungerli o rimuoverli dalla selezione. Gli oggetti restano evidenziati anche aprendo e chiudendo i pannelli. Disattivalo per tornare alla selezione singola.</dd></div>
<div><dt>⇄</dt><dd><strong>Confronta due confini</strong>Apri il comando e scegli Confronta dopo aver selezionato esattamente due poligoni. L'app crea il solo primo in rosso, il solo secondo in blu e la sovrapposizione in verde. Usa Pulisci confronto per rimuovere soltanto questi risultati.</dd></div> <div><dt>⇄</dt><dd><strong>Confronta due confini</strong>Apri il comando e scegli Confronta dopo aver selezionato esattamente due poligoni. Il gruppo Confronto confini viene collocato sopra gli altri layer: rosso indica solo il primo, blu solo il secondo e verde la sovrapposizione. Usa Pulisci confronto per rimuovere soltanto questi risultati.</dd></div>
<div><dt>PF</dt><dd><strong>Scarica Punti Fiduciali</strong>Seleziona una particella o un foglio catastale; in alternativa usa la particella rilevata dal GPS. I PF vengono aggiunti come sottogruppo del relativo foglio e richiedono LME Pro.</dd></div> <div><dt>PF</dt><dd><strong>Scarica Punti Fiduciali</strong>Seleziona una particella o un foglio catastale; in alternativa usa la particella rilevata dal GPS. I PF vengono aggiunti come sottogruppo del relativo foglio e richiedono LME Pro.</dd></div>
<div><dt>?</dt><dd><strong>Guida</strong>Riapre questa descrizione. I risultati di riparazione e confronto vengono mostrati anche in una finestra; per uscire dalla visualizzazione rosso, blu e verde usa Pulisci confronto.</dd></div> <div><dt>?</dt><dd><strong>Guida</strong>Riapre questa descrizione. I risultati di riparazione e confronto vengono mostrati anche in una finestra; per uscire dalla visualizzazione rosso, blu e verde usa Pulisci confronto.</dd></div>
</dl> </dl>
@@ -4050,6 +4069,13 @@ function highlightManagedParent(row, key, records) {
} }
function renderSelectedManagerHighlight() { function renderSelectedManagerHighlight() {
if (multiSelectionHasObjects()) {
const selected = [...lmeState.managerSelectedObjectIds]
.map(id => lmeState.managerRecords.get(id))
.filter(Boolean);
renderManagerHighlight(selected);
return;
}
if (lmeState.managerHighlightedParentRecords?.length) { if (lmeState.managerHighlightedParentRecords?.length) {
renderManagerHighlight(lmeState.managerHighlightedParentRecords); renderManagerHighlight(lmeState.managerHighlightedParentRecords);
return; return;