Ticket #21901: 21901.patch

File 21901.patch, 9.9 KB (added by taylor.smock, 4 years ago)

Avoid updating buttons during panning

  • src/org/openstreetmap/josm/gui/MapMover.java

    diff --git a/src/org/openstreetmap/josm/gui/MapMover.java b/src/org/openstreetmap/josm/gui/MapMover.java
    index ed694864cc..c2338f6e53 100644
    a b public class MapMover extends MouseAdapter implements Destroyable {  
    185185        if (allowMovement) {
    186186            doMoveForDrag(e);
    187187        } else {
    188             endMovement();
     188            endMovement(e);
    189189        }
    190190    }
    191191
    public class MapMover extends MouseAdapter implements Destroyable {  
    195195        }
    196196        EastNorth center = nc.getCenter();
    197197        EastNorth mouseCenter = nc.getEastNorth(e.getX(), e.getY());
    198         nc.zoomTo(mousePosMoveStart.getEastNorth().add(center).subtract(mouseCenter));
     198        nc.zoomTo(e, mousePosMoveStart.getEastNorth().add(center).subtract(mouseCenter));
    199199    }
    200200
    201201    /**
    public class MapMover extends MouseAdapter implements Destroyable {  
    217217    @Override
    218218    public void mouseReleased(MouseEvent e) {
    219219        if (e.getButton() == MouseEvent.BUTTON3 || (PlatformManager.isPlatformOsx() && e.getButton() == MouseEvent.BUTTON1)) {
    220             endMovement();
     220            endMovement(e);
    221221        }
    222222    }
    223223
    public class MapMover extends MouseAdapter implements Destroyable {  
    237237    /**
    238238     * End the movement. Setting back the cursor and clear the movement variables
    239239     */
    240     private void endMovement() {
     240    private void endMovement(MouseEvent e) {
    241241        if (!movementInProgress()) {
    242242            return;
    243243        }
     244        doMoveForDrag(e);
    244245        nc.resetCursor(this);
    245246        mousePosMoveStart = null;
    246247        MainApplication.getLayerManager().getLayers().forEach(Layer::invalidate);
    public class MapMover extends MouseAdapter implements Destroyable {  
    270271            if (e.getModifiersEx() == MouseEvent.CTRL_DOWN_MASK) {
    271272                doMoveForDrag(e);
    272273            } else {
    273                 endMovement();
     274                endMovement(e);
    274275            }
    275276        }
    276277    }
  • src/org/openstreetmap/josm/gui/NavigatableComponent.java

    diff --git a/src/org/openstreetmap/josm/gui/NavigatableComponent.java b/src/org/openstreetmap/josm/gui/NavigatableComponent.java
    index cde5057396..224d980482 100644
    a b import java.awt.event.ComponentAdapter;  
    88import java.awt.event.ComponentEvent;
    99import java.awt.event.HierarchyEvent;
    1010import java.awt.event.HierarchyListener;
     11import java.awt.event.InputEvent;
     12import java.awt.event.MouseEvent;
    1113import java.awt.geom.AffineTransform;
    1214import java.awt.geom.Point2D;
    1315import java.nio.charset.StandardCharsets;
    public class NavigatableComponent extends JComponent implements Helpful {  
    7779
    7880    /**
    7981     * Interface to notify listeners of the change of the zoom area.
     82     * If you need to not paint during panning, override {@link #zoomChanged(InputEvent)}.
    8083     * @since 10600 (functional interface)
    8184     */
    8285    @FunctionalInterface
    public class NavigatableComponent extends JComponent implements Helpful {  
    8588         * Method called when the zoom area has changed.
    8689         */
    8790        void zoomChanged();
     91
     92        /**
     93         * Method called when the zoom area has changed.
     94         * @param event The originating input event. May be {@code null}.
     95         * @since xxx
     96         */
     97        default void zoomChanged(InputEvent event) {
     98            zoomChanged();
     99        }
    88100    }
    89101
    90102    /**
    public class NavigatableComponent extends JComponent implements Helpful {  
    141153        }
    142154    }
    143155
     156    /**
     157     * Fire zoom changed events. Kept for backwards compatibility.
     158     * @deprecated Since xxx, use {@link #fireZoomChanged(InputEvent)} instead ({@code null} safe)
     159     */
     160    @Deprecated
    144161    protected static void fireZoomChanged() {
     162
     163    }
     164
     165    protected static void fireZoomChanged(InputEvent originatingEvent) {
    145166        GuiHelper.runInEDTAndWait(() -> {
    146167            for (ZoomChangeListener l : zoomChangeListeners) {
    147                 l.zoomChanged();
     168                l.zoomChanged(originatingEvent);
    148169            }
    149170        });
     171        // Just in case someone, somewhere, decided to subclass this and override fireZoomChanged.
     172        fireZoomChanged();
    150173    }
    151174
    152175    // The only events that may move/resize this map view are window movements or changes to the map view size.
    public class NavigatableComponent extends JComponent implements Helpful {  
    617640     * @param initial true if this call initializes the viewport.
    618641     */
    619642    public void zoomTo(EastNorth center, double scale, boolean initial) {
     643        zoomTo(null, center, scale, initial);
     644    }
     645
     646    /**
     647     * Zoom to the given coordinate and scale.
     648     *
     649     * @param e The originating input event
     650     * @param center The center x-value (easting) to zoom to.
     651     * @param scale The scale to use.
     652     * @param initial true if this call initializes the viewport.
     653     */
     654    void zoomTo(InputEvent e, EastNorth center, double scale, boolean initial) {
    620655        Bounds b = getProjection().getWorldBoundsLatLon();
    621656        ProjectionBounds pb = getProjection().getWorldBoundsBoxEastNorth();
    622657        double newScale = scale;
    public class NavigatableComponent extends JComponent implements Helpful {  
    682717        newCenter = newCenter.subtract(enShift);
    683718
    684719        EastNorth oldCenter = getCenter();
    685         if (!newCenter.equals(oldCenter) || !Utils.equalsEpsilon(getScale(), newScale)) {
     720        if (!newCenter.equals(oldCenter) || !Utils.equalsEpsilon(getScale(), newScale)
     721                || (e != null && e.getID() == MouseEvent.MOUSE_RELEASED)) {
    686722            if (!initial) {
    687723                pushZoomUndo(oldCenter, getScale());
    688724            }
    689             zoomNoUndoTo(newCenter, newScale, initial);
     725            zoomNoUndoTo(e, newCenter, newScale, initial);
    690726        }
    691727    }
    692728
    693729    /**
    694730     * Zoom to the given coordinate without adding to the zoom undo buffer.
    695731     *
     732     * @param originatingEvent The originating input event
    696733     * @param newCenter The center x-value (easting) to zoom to.
    697734     * @param newScale The scale to use.
    698735     * @param initial true if this call initializes the viewport.
    699736     */
    700     private void zoomNoUndoTo(EastNorth newCenter, double newScale, boolean initial) {
     737    private void zoomNoUndoTo(InputEvent originatingEvent, EastNorth newCenter, double newScale, boolean initial) {
    701738        if (!Utils.equalsEpsilon(getScale(), newScale)) {
    702739            state = state.usingScale(newScale);
    703740        }
    public class NavigatableComponent extends JComponent implements Helpful {  
    706743        }
    707744        if (!initial) {
    708745            repaint();
    709             fireZoomChanged();
     746            fireZoomChanged(originatingEvent);
    710747        }
    711748    }
    712749
    public class NavigatableComponent extends JComponent implements Helpful {  
    718755        zoomTo(newCenter, getScale());
    719756    }
    720757
     758    /**
     759     * Zoom to given east/north.
     760     * @param e The originating input event
     761     * @param newCenter new center coordinates
     762     */
     763    void zoomTo(InputEvent e, EastNorth newCenter) {
     764        zoomTo(e, newCenter, getScale(), false);
     765    }
     766
    721767    /**
    722768     * Zoom to given lat/lon.
    723769     * @param newCenter new center coordinates
    public class NavigatableComponent extends JComponent implements Helpful {  
    943989        if (!zoomUndoBuffer.isEmpty()) {
    944990            ZoomData zoom = zoomUndoBuffer.pop();
    945991            zoomRedoBuffer.push(new ZoomData(getCenter(), getScale()));
    946             zoomNoUndoTo(zoom.getCenterEastNorth(), zoom.getScale(), false);
     992            zoomNoUndoTo(null, zoom.getCenterEastNorth(), zoom.getScale(), false);
    947993        }
    948994    }
    949995
    public class NavigatableComponent extends JComponent implements Helpful {  
    9541000        if (!zoomRedoBuffer.isEmpty()) {
    9551001            ZoomData zoom = zoomRedoBuffer.pop();
    9561002            zoomUndoBuffer.push(new ZoomData(getCenter(), getScale()));
    957             zoomNoUndoTo(zoom.getCenterEastNorth(), zoom.getScale(), false);
     1003            zoomNoUndoTo(null, zoom.getCenterEastNorth(), zoom.getScale(), false);
    9581004        }
    9591005    }
    9601006
  • src/org/openstreetmap/josm/gui/autofilter/AutoFilterManager.java

    diff --git a/src/org/openstreetmap/josm/gui/autofilter/AutoFilterManager.java b/src/org/openstreetmap/josm/gui/autofilter/AutoFilterManager.java
    index 3a7ccb67a2..c96baef2b3 100644
    a b package org.openstreetmap.josm.gui.autofilter;  
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
    66import java.awt.Graphics2D;
     7import java.awt.event.InputEvent;
     8import java.awt.event.MouseEvent;
    79import java.util.ArrayList;
    810import java.util.Arrays;
    911import java.util.Collection;
    implements ZoomChangeListener, MapModeChangeListener, DataSetListener, Preferenc  
    127129        registerAutoFilterRules(AutoFilterRule.defaultRules());
    128130    }
    129131
    130     private synchronized void updateButtons() {
     132    private void updateButtons() {
     133        updateButtons(null);
     134    }
     135
     136    private synchronized void updateButtons(InputEvent inputEvent) {
     137        // Don't update while dragging
     138        if (inputEvent != null && inputEvent instanceof MouseEvent &&
     139                ((MouseEvent) inputEvent).getID() == MouseEvent.MOUSE_DRAGGED) {
     140            return;
     141        }
    131142        MapFrame map = MainApplication.getMap();
    132143        if (enabledRule != null && map != null
    133144                && enabledRule.getMinZoomLevel() <= Selector.GeneralSelector.scale2level(map.mapView.getDist100Pixel())) {
    implements ZoomChangeListener, MapModeChangeListener, DataSetListener, Preferenc  
    261272
    262273    @Override
    263274    public void zoomChanged() {
    264         updateButtons();
     275        this.zoomChanged(null);
     276    }
     277
     278    @Override
     279    public void zoomChanged(InputEvent event) {
     280        updateButtons(event);
    265281    }
    266282
    267283    @Override