Ignore:
Timestamp:
2019-01-03T20:06:44+01:00 (6 years ago)
Author:
simon04
Message:

fix #16706 - Zoom to selection should not zoom out for zoom on a node

Simplify bound enlargements in org.openstreetmap.josm.actions.AutoScaleAction#modeSelectionOrConflict

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java

    r14397 r14628  
    292292                mapView.zoomNext();
    293293                break;
    294             default:
    295                 BoundingXYVisitor bbox = getBoundingBox();
    296                 if (bbox != null && bbox.getBounds() != null) {
    297                     mapView.zoomTo(bbox);
    298                 }
    299             }
    300         }
    301         putValue("active", Boolean.TRUE);
     294            case PROBLEM:
     295                modeProblem(new ValidatorBoundingXYVisitor());
     296                break;
     297            case DATA:
     298                modeData(new BoundingXYVisitor());
     299                break;
     300            case LAYER:
     301                modeLayer(new BoundingXYVisitor());
     302                break;
     303            case SELECTION:
     304            case CONFLICT:
     305                modeSelectionOrConflict(new BoundingXYVisitor());
     306                break;
     307            case DOWNLOAD:
     308                modeDownload(new BoundingXYVisitor());
     309                break;
     310            }
     311            putValue("active", Boolean.TRUE);
     312        }
    302313    }
    303314
     
    328339    }
    329340
    330     private BoundingXYVisitor getBoundingBox() {
    331         switch (mode) {
    332         case PROBLEM:
    333             return modeProblem(new ValidatorBoundingXYVisitor());
    334         case DATA:
    335             return modeData(new BoundingXYVisitor());
    336         case LAYER:
    337             return modeLayer(new BoundingXYVisitor());
    338         case SELECTION:
    339         case CONFLICT:
    340             return modeSelectionOrConflict(new BoundingXYVisitor());
    341         case DOWNLOAD:
    342             return modeDownload(new BoundingXYVisitor());
    343         default:
    344             return new BoundingXYVisitor();
    345         }
    346     }
    347 
    348     private static BoundingXYVisitor modeProblem(ValidatorBoundingXYVisitor v) {
     341    private static void modeProblem(ValidatorBoundingXYVisitor v) {
    349342        TestError error = MainApplication.getMap().validatorDialog.getSelectedError();
    350343        if (error == null)
    351             return null;
     344            return;
    352345        v.visit(error);
    353346        if (v.getBounds() == null)
    354             return null;
    355         v.enlargeBoundingBox(Config.getPref().getDouble("validator.zoom-enlarge-bbox", 0.0002));
    356         return v;
    357     }
    358 
    359     private static BoundingXYVisitor modeData(BoundingXYVisitor v) {
     347            return;
     348        MainApplication.getMap().mapView.zoomTo(v);
     349    }
     350
     351    private static void modeData(BoundingXYVisitor v) {
    360352        for (Layer l : MainApplication.getLayerManager().getLayers()) {
    361353            l.visitBoundingBox(v);
    362354        }
    363         return v;
    364     }
    365 
    366     private BoundingXYVisitor modeLayer(BoundingXYVisitor v) {
     355        MainApplication.getMap().mapView.zoomTo(v);
     356    }
     357
     358    private void modeLayer(BoundingXYVisitor v) {
    367359        // try to zoom to the first selected layer
    368360        Layer l = getFirstSelectedLayer();
    369361        if (l == null)
    370             return null;
     362            return;
    371363        l.visitBoundingBox(v);
    372         return v;
    373     }
    374 
    375     private BoundingXYVisitor modeSelectionOrConflict(BoundingXYVisitor v) {
     364        MainApplication.getMap().mapView.zoomTo(v);
     365    }
     366
     367    private void modeSelectionOrConflict(BoundingXYVisitor v) {
    376368        Collection<IPrimitive> sel = new HashSet<>();
    377369        if (AutoScaleMode.SELECTION == mode) {
     
    395387                    tr("Information"),
    396388                    JOptionPane.INFORMATION_MESSAGE);
    397             return null;
     389            return;
    398390        }
    399391        for (IPrimitive osm : sel) {
    400392            osm.accept(v);
    401393        }
    402 
    403         // Increase the bounding box by up to 100% to give more context.
    404         v.enlargeBoundingBoxLogarithmically(100);
    405         // Make the bounding box at least 100 meter wide to
    406         // ensure reasonable zoom level when zooming onto single nodes.
    407         v.enlargeToMinSize(Config.getPref().getDouble("zoom_to_selection_min_size_in_meter", 100));
    408         return v;
    409     }
    410 
    411     private BoundingXYVisitor modeDownload(BoundingXYVisitor v) {
     394        if (v.getBounds() == null) {
     395            return;
     396        }
     397
     398        // Do not zoom if the current scale covers the selection, #16706
     399        final MapView mapView = MainApplication.getMap().mapView;
     400        final double mapScale = mapView.getScale();
     401        final double minScale = v.getBounds().getScale(mapView.getWidth(), mapView.getHeight());
     402        v.enlargeBoundingBoxLogarithmically();
     403        final double maxScale = v.getBounds().getScale(mapView.getWidth(), mapView.getHeight());
     404        if (minScale <= mapScale && mapScale < maxScale) {
     405            mapView.zoomTo(v.getBounds().getCenter());
     406        } else {
     407            mapView.zoomTo(v);
     408        }
     409    }
     410
     411    private void modeDownload(BoundingXYVisitor v) {
    412412        if (lastZoomTime > 0 &&
    413413                System.currentTimeMillis() - lastZoomTime > Config.getPref().getLong("zoom.bounds.reset.time", TimeUnit.SECONDS.toMillis(10))) {
     
    438438            }
    439439        }
    440         return v;
     440        MainApplication.getMap().mapView.zoomTo(v);
    441441    }
    442442
Note: See TracChangeset for help on using the changeset viewer.