Changeset 18837 in josm for trunk


Ignore:
Timestamp:
2023-09-20T21:24:36+02:00 (17 months ago)
Author:
taylor.smock
Message:

Fix #23057: An invisible layer should not become active when removing a layer

Location:
trunk
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/dialogs/layer/DeleteLayerAction.java

    r11093 r18837  
    66import java.awt.Component;
    77import java.awt.event.ActionEvent;
     8import java.util.HashMap;
    89import java.util.List;
     10import java.util.Map;
    911
    1012import javax.swing.AbstractAction;
     
    4648        if (!SaveLayersDialog.saveUnsavedModifications(selectedLayers, SaveLayersDialog.Reason.DELETE))
    4749            return;
     50        final Map<Integer, Layer> layerMap = model.selectedIndices().filter(i -> model.getLayer(i) != null)
     51                .collect(HashMap::new, (map, value) -> map.put(value, model.getLayer(value)), HashMap::putAll);
    4852        for (Layer l: selectedLayers) {
    4953            if (model.getLayerManager().containsLayer(l)) {
     
    5155                // this is why we need to check if every layer is still in the list of selected layers.
    5256                model.getLayerManager().removeLayer(l);
     57            }
     58        }
     59        // Set the next active layer to the next visible layer
     60        if (layerMap.size() == 1) {
     61            final int selected = Math.min(layerMap.keySet().iterator().next(), model.getRowCount() - 1);
     62            int currentLayerIndex = selected;
     63            Layer layer = model.getLayer(currentLayerIndex);
     64            // If the user has the last layer selected, we need to wrap around.
     65            boolean reversed = false;
     66            while (layer != null && !layer.isVisible() && currentLayerIndex < model.getRowCount() && currentLayerIndex >= 0) {
     67                if (reversed) {
     68                    currentLayerIndex--;
     69                } else {
     70                    currentLayerIndex++;
     71                }
     72                if (currentLayerIndex == model.getRowCount()) {
     73                    reversed = true;
     74                    currentLayerIndex = selected;
     75                }
     76                layer = model.getLayer(currentLayerIndex);
     77            }
     78            if (layer != null) {
     79                model.getLayerManager().setActiveLayer(layer);
     80                // Reset the selection
     81                model.getSelectionModel().setSelectionInterval(selected, selected);
    5382            }
    5483        }
  • trunk/test/unit/org/openstreetmap/josm/actions/DeleteLayerActionTest.java

    r18487 r18837  
    55import static org.junit.jupiter.api.Assertions.assertNull;
    66
    7 import org.junit.jupiter.api.extension.RegisterExtension;
    87import org.junit.jupiter.api.Test;
    98import org.openstreetmap.josm.data.osm.DataSet;
    109import org.openstreetmap.josm.gui.MainApplication;
    1110import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    12 import org.openstreetmap.josm.testutils.JOSMTestRules;
    13 
    14 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
     11import org.openstreetmap.josm.testutils.annotations.Main;
     12import org.openstreetmap.josm.testutils.annotations.Projection;
    1513
    1614/**
    1715 * Unit tests for class {@link DeleteLayerAction}.
    1816 */
     17@Main
     18@Projection
    1919final class DeleteLayerActionTest {
    20 
    21     /**
    22      * Setup test.
    23      */
    24     @RegisterExtension
    25     @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
    26     public static JOSMTestRules test = new JOSMTestRules().main().projection();
    27 
    2820    /**
    2921     * Unit test of {@link DeleteLayerAction#actionPerformed}
Note: See TracChangeset for help on using the changeset viewer.