Changeset 34770 in osm


Ignore:
Timestamp:
2018-12-07T16:58:49+01:00 (6 years ago)
Author:
gerdp
Message:

fix #17082 UndoSelection : repeated Ctrl+Shift+Z now circles through all previously made selections

File:
1 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/utilsplugin2/src/org/openstreetmap/josm/plugins/utilsplugin2/selection/UndoSelectionAction.java

    r33297 r34770  
    3030    }
    3131
    32     private int myAutomaticSelectionHash;
    3332    private Collection<OsmPrimitive> lastSel;
    3433    private int index;
     34
    3535    @Override
    3636    public void actionPerformed(ActionEvent e) {
     
    3939            LinkedList<Collection<? extends OsmPrimitive>> history = ds.getSelectionHistory();
    4040            if (history == null || history.isEmpty()) return; // empty history
     41            if (lastSel != null) {
     42                Collection<OsmPrimitive> selection = ds.getSelected();
     43                if (selection.containsAll(lastSel) && lastSel.containsAll(selection)) {
     44                        // repeated action
     45                } else {
     46                        index = -1;
     47                }
     48            }
     49
    4150            int num = history.size();
     51            int k = 0;
    4252
    43             Collection<OsmPrimitive> selection = ds.getSelected();
    44 
    45             if (selection != null && selection.hashCode() != myAutomaticSelectionHash) {
    46                 // manual selection or another pluging selection noticed
    47                 index = history.indexOf(lastSel);
    48                 // first is selected, next list is previous selection
    49             }
    50             int k = 0;
    5153            Set<OsmPrimitive> newsel = new HashSet<>();
    52             do {
     54            while (k < num) {
    5355                if (index+1 < history.size()) index++; else index = 0;
    5456                Collection<? extends OsmPrimitive> histsel = history.get(index);
     
    5658                newsel.clear();
    5759                newsel.addAll(histsel);
    58                 newsel.retainAll(ds.allNonDeletedPrimitives());
    59                 if (!newsel.isEmpty()) break;
     60                newsel.removeIf(p -> p == null || p.isDeleted());
    6061                k++;
    61             } while (k < num);
     62                if (!newsel.isEmpty()) {
     63                        if (newsel.containsAll(ds.getSelected()) && ds.getSelected().containsAll(newsel)) {
     64                                // ignore no-change selection
     65                                continue;
     66                        }
     67                        break;
     68                }
     69            }
    6270
     71            // set new selection (is added to history)
    6372            ds.setSelected(newsel);
    6473            lastSel = ds.getSelected();
    65             myAutomaticSelectionHash = lastSel.hashCode();
    66             // remember last automatic selection
    6774        }
    6875    }
     
    7077    @Override
    7178    protected void updateEnabledState() {
    72         setEnabled(getLayerManager().getEditDataSet() != null);
     79        DataSet ds = getLayerManager().getEditDataSet();
     80        lastSel = null;
     81        index = -1;
     82                setEnabled(ds != null && ds.getSelectionHistory().isEmpty());
    7383    }
    7484}
Note: See TracChangeset for help on using the changeset viewer.