source: josm/trunk/src/org/openstreetmap/josm/gui/MapSlider.java@ 9997

Last change on this file since 9997 was 9818, checked in by wiktorn, 8 years ago

Snap scale to mercator zoom levels.

See #12350

Patch submitted by: kolesar

  • Property svn:eol-style set to native
File size: 1.9 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui;
3
4import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
5
6import java.beans.PropertyChangeEvent;
7import java.beans.PropertyChangeListener;
8
9import javax.swing.JSlider;
10import javax.swing.event.ChangeEvent;
11import javax.swing.event.ChangeListener;
12
13import org.openstreetmap.josm.gui.help.Helpful;
14
15class MapSlider extends JSlider implements PropertyChangeListener, ChangeListener, Helpful {
16
17 private static final double zoomStep = 1.1;
18 private final MapView mv;
19 private boolean preventChange;
20 private int lastValue;
21
22 MapSlider(MapView mv) {
23 super(0, 150);
24 setOpaque(false);
25 this.mv = mv;
26 mv.addPropertyChangeListener("scale", this);
27 addChangeListener(this);
28 // Call this manually once so it gets setup correctly
29 propertyChange(null);
30 }
31
32 @Override
33 public void propertyChange(PropertyChangeEvent evt) {
34 double maxScale = this.mv.getMaxScale();
35 int zoom = (int) Math.round(Math.log(maxScale/mv.getScale())/Math.log(zoomStep));
36 preventChange = true;
37 setValue(zoom);
38 lastValue = zoom;
39 preventChange = false;
40 }
41
42 @Override
43 public void stateChanged(ChangeEvent e) {
44 if (preventChange) return;
45
46 if (!getModel().getValueIsAdjusting() && mv.getNativeScaleLayer() != null) {
47 if (getValue() < lastValue) {
48 mv.zoomOut();
49 } else if (getValue() > lastValue) {
50 mv.zoomIn();
51 }
52 } else {
53 double maxScale = this.mv.getMaxScale();
54 double scale = maxScale/Math.pow(zoomStep, getValue());
55 double snapped = mv.scaleFloor(scale);
56 mv.zoomTo(this.mv.getCenter(), snapped);
57 }
58 propertyChange(null);
59 }
60
61 @Override
62 public String helpTopic() {
63 return ht("/MapView/Slider");
64 }
65}
Note: See TracBrowser for help on using the repository browser.