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

Last change on this file since 13256 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
RevLine 
[6380]1// License: GPL. For details, see LICENSE file.
[115]2package org.openstreetmap.josm.gui;
3
[3754]4import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
5
[10078]6import java.awt.Dimension;
[115]7
8import javax.swing.JSlider;
[10078]9import javax.swing.UIManager;
[115]10import javax.swing.event.ChangeEvent;
11import javax.swing.event.ChangeListener;
12
[2252]13import org.openstreetmap.josm.gui.help.Helpful;
[13201]14import org.openstreetmap.josm.gui.NavigatableComponent.ZoomChangeListener;
[115]15
[12391]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 */
[13201]19class MapSlider extends JSlider implements ZoomChangeListener, ChangeListener, Helpful {
[1169]20
[12537]21 private static final double ZOOM_STEP = 1.1;
[115]22 private final MapView mv;
[8840]23 private boolean preventChange;
[9818]24 private int lastValue;
[155]25
[8836]26 MapSlider(MapView mv) {
[10078]27 super(0, 160);
[1169]28 setOpaque(false);
29 this.mv = mv;
[13201]30 NavigatableComponent.addZoomChangeListener(this);
[1169]31 addChangeListener(this);
[2114]32 // Call this manually once so it gets setup correctly
[13201]33 zoomChanged();
[10078]34 int w = UIManager.getDefaults().getInt("Slider.thumbWidth") + 150;
35 setPreferredSize(new Dimension(w, 27));
[155]36 }
[1169]37
[6084]38 @Override
[13201]39 public void zoomChanged() {
[9818]40 double maxScale = this.mv.getMaxScale();
[12537]41 int zoom = (int) Math.round(Math.log(maxScale/mv.getScale())/Math.log(ZOOM_STEP));
[8510]42 preventChange = true;
[1722]43 setValue(zoom);
[9818]44 lastValue = zoom;
[8510]45 preventChange = false;
[1169]46 }
47
[6084]48 @Override
[1169]49 public void stateChanged(ChangeEvent e) {
[1337]50 if (preventChange) return;
[1722]51
[9818]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();
[12537]60 double scale = maxScale/Math.pow(ZOOM_STEP, getValue());
[9818]61 double snapped = mv.scaleFloor(scale);
62 mv.zoomTo(this.mv.getCenter(), snapped);
63 }
[13201]64 zoomChanged();
[1169]65 }
66
[6084]67 @Override
[1169]68 public String helpTopic() {
[3754]69 return ht("/MapView/Slider");
[1169]70 }
[2512]71}
Note: See TracBrowser for help on using the repository browser.