diff --git a/src/album/editor/Editor.java b/src/album/editor/Editor.java index e198d80..18aac44 100644 --- a/src/album/editor/Editor.java +++ b/src/album/editor/Editor.java @@ -19,7 +19,7 @@ import javax.swing.border.*; */ public class Editor extends JComponent - implements MouseListener, MouseMotionListener + implements MouseListener, MouseMotionListener, MouseWheelListener { // Given from input image BufferedImage img; @@ -49,7 +49,7 @@ public class Editor roi.left = -0.4f; roi.right = 0.4f; - rescale(imgScale * 680); + rescale(imgScale * 680, null); /* Dimension size = new Dimension(680, 680); setPreferredSize(size); @@ -69,12 +69,19 @@ public class Editor */ addMouseListener(this); addMouseMotionListener(this); + addMouseWheelListener(this); } - void rescale(double newScale) { + void rescale(double newScale, Point center) { + // TODO Get the visible rect + // TODO find "center" in visible rect. If null or not there make it the actual center + // TODO Make up a virtual visible rect by scaling actual visible rect + // TODO calculate top left coordinate in new virtual visible rect + // TODO translate visible rect to same top left as virtual + // TODO scroll to visible rect scale = newScale; side = (int)Math.round(scale / imgScale); Dimension size = new Dimension(side, side); @@ -94,22 +101,17 @@ public class Editor super.paintComponent(g1); if (dirty) { -// System.out.println("Recalculating"); - AffineTransform screenToCoord = new AffineTransform(); - screenToCoord.translate(side/2d, side/2d); - screenToCoord.scale(side, -side); - AffineTransform coordToScreen = new AffineTransform(); - coordToScreen.scale(1d/side, -1d/side); - coordToScreen.translate(-side/2d, -side/2d); - - this.screenToCoord = coordToScreen; - this.coordToScreen = screenToCoord; + coordToScreen.translate(side/2d, side/2d); + coordToScreen.scale(side, -side); + AffineTransform screenToCoord = new AffineTransform(); + screenToCoord.scale(1d/side, -1d/side); + screenToCoord.translate(-side/2d, -side/2d); + this.screenToCoord = screenToCoord; + this.coordToScreen = coordToScreen; dirty = false; - } else { -// System.out.println("using cached transform"); } Graphics2D g = (Graphics2D)g1; @@ -191,7 +193,7 @@ public class Editor int value = zoomSlider.getValue(); if (value != previousValue) { previousValue = value; - rescale(value * 0.01); + rescale(value * 0.01, null); } } }); @@ -228,7 +230,9 @@ public class Editor Container c = frame.getContentPane(); c.setLayout(new BorderLayout()); c.add(x.createControlPanel(), BorderLayout.EAST); - c.add(new JScrollPane(x), BorderLayout.CENTER); + JScrollPane scroller = new JScrollPane(x); + scroller.setWheelScrollingEnabled(false); + c.add(scroller, BorderLayout.CENTER); frame.pack(); frame.setVisible(true); @@ -386,6 +390,17 @@ public class Editor setCursor(cursors[findRegion(e.getX(), e.getY())]); } + public void mouseWheelMoved(MouseWheelEvent e) { + int units = e.getUnitsToScroll(); + System.out.println(units); + rescale(scale * (1f + units / 100f), e.getPoint()); + // this. + } + + + + + static void log(String x) { System.out.println(x); } @@ -453,6 +468,7 @@ public class Editor return cache; } } + } // eof