drawing-area: allow zooming in to 32px tiles

git-svn-id: https://micropolis.googlecode.com/svn/trunk/micropolis-java@753 d9718cc8-9f43-0410-858b-315f434eb58c
This commit is contained in:
jason@long.name 2013-07-20 21:29:44 +00:00
parent d452c45d21
commit 103999e578
3 changed files with 49 additions and 6 deletions

View file

@ -223,9 +223,18 @@ public class MainWindow extends JFrame
showErrorMessage(e);
}
}
public void mouseWheelMoved(MouseWheelEvent evt)
{
try {
onMouseWheelMoved(evt);
} catch (Throwable e) {
showErrorMessage(e);
}
}
};
drawingArea.addMouseListener(mouse);
drawingArea.addMouseMotionListener(mouse);
drawingArea.addMouseWheelListener(mouse);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent ev)
@ -981,6 +990,28 @@ public class MainWindow extends JFrame
notificationPane.showZoneStatus(engine, xpos, ypos, z);
}
private void onMouseWheelMoved(MouseWheelEvent evt)
{
boolean zoomOut = evt.getWheelRotation() > 0;
int oldZoom = drawingArea.getTileSize();
int newZoom = zoomOut ? (oldZoom / 2) : (oldZoom * 2);
if (newZoom < 16) { newZoom = 16; }
if (newZoom > 32) { newZoom = 32; }
if (oldZoom != newZoom)
{
// preserve effective mouse position in viewport when changing zoom level
double f = (double)newZoom / (double)oldZoom;
Point pos = drawingAreaScroll.getViewport().getViewPosition();
int newX = (int)Math.round(evt.getX() * f - (evt.getX() - pos.x));
int newY = (int)Math.round(evt.getY() * f - (evt.getY() - pos.y));
drawingArea.selectTileSize(newZoom);
drawingAreaScroll.validate();
drawingAreaScroll.getViewport().setViewPosition(new Point(newX, newY));
}
}
// used when a tool is being pressed
ToolStroke toolStroke;