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

Last change on this file since 13219 was 13201, checked in by Don-vip, 6 years ago

fix #15039 - prevent zoom level from jumping after click on slider (patch by ar2988-os)

  • Property svn:eol-style set to native
File size: 2.2 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.awt.Dimension;
7
8import javax.swing.JSlider;
9import javax.swing.UIManager;
10import javax.swing.event.ChangeEvent;
11import javax.swing.event.ChangeListener;
12
13import org.openstreetmap.josm.gui.help.Helpful;
14import org.openstreetmap.josm.gui.NavigatableComponent.ZoomChangeListener;
15
16/**
17 * This is the slider used in the top left corner of the map view. It allows the user to select the scale
18 */
19class MapSlider extends JSlider implements ZoomChangeListener, ChangeListener, Helpful {
20
21 private static final double ZOOM_STEP = 1.1;
22 private final MapView mv;
23 private boolean preventChange;
24 private int lastValue;
25
26 MapSlider(MapView mv) {
27 super(0, 160);
28 setOpaque(false);
29 this.mv = mv;
30 NavigatableComponent.addZoomChangeListener(this);
31 addChangeListener(this);
32 // Call this manually once so it gets setup correctly
33 zoomChanged();
34 int w = UIManager.getDefaults().getInt("Slider.thumbWidth") + 150;
35 setPreferredSize(new Dimension(w, 27));
36 }
37
38 @Override
39 public void zoomChanged() {
40 double maxScale = this.mv.getMaxScale();
41 int zoom = (int) Math.round(Math.log(maxScale/mv.getScale())/Math.log(ZOOM_STEP));
42 preventChange = true;
43 setValue(zoom);
44 lastValue = zoom;
45 preventChange = false;
46 }
47
48 @Override
49 public void stateChanged(ChangeEvent e) {
50 if (preventChange) return;
51
52 if (!getModel().getValueIsAdjusting() && mv.getNativeScaleLayer() != null) {
53 if (getValue() < lastValue) {
54 mv.zoomOut();
55 } else if (getValue() > lastValue) {
56 mv.zoomIn();
57 }
58 } else {
59 double maxScale = this.mv.getMaxScale();
60 double scale = maxScale/Math.pow(ZOOM_STEP, getValue());
61 double snapped = mv.scaleFloor(scale);
62 mv.zoomTo(this.mv.getCenter(), snapped);
63 }
64 zoomChanged();
65 }
66
67 @Override
68 public String helpTopic() {
69 return ht("/MapView/Slider");
70 }
71}
Note: See TracBrowser for help on using the repository browser.