From 27ee03494b1552acbdee6ce45a5d2e6a5cd19294 Mon Sep 17 00:00:00 2001 From: drdev Date: Thu, 6 Feb 2014 05:36:46 +0000 Subject: [PATCH] Improve restored scroll position after adjusting image view zoom --- .../toolbox/itemmanager/views/ImageView.java | 53 ++++++++++++++++++- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ImageView.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ImageView.java index dbed2c85d20..ced9c31a1ae 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ImageView.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ImageView.java @@ -68,6 +68,7 @@ public class ImageView extends ItemView { private Point hoverPoint; private Point hoverScrollPos; private ItemInfo hoveredItem; + private ItemInfo focalItem; private ArrayList orderedItems = new ArrayList(); private ArrayList groups = new ArrayList(); @@ -266,7 +267,50 @@ public class ImageView extends ItemView { } if (imageSizeOption == imageSizeOption0) { return; } imageSizeOption = imageSizeOption0; + + //determine item to retain scroll position of following image size change + ItemInfo focalItem0 = getFocalItem(); + if (focalItem0 == null) { + updateLayout(false); + return; + } + + int offsetTop = focalItem0.getTop() - getScrollValue(); updateLayout(false); + setScrollValue(focalItem0.getTop() - offsetTop); + focalItem = focalItem0; //cache focal item so consecutive image size changes use the same item + } + + private ItemInfo getFocalItem() { + if (focalItem != null) { //use cached focalItem if one + return focalItem; + } + + if (hoveredItem != null) { + return hoveredItem; + } + + //if not item hovered, use first fully visible item as focal point + final int visibleTop = getScrollValue(); + for (Group group : groups) { + if (group.getBottom() < visibleTop) { + continue; + } + for (Pile pile : group.piles) { + if (group.getBottom() < visibleTop) { + continue; + } + for (ItemInfo item : pile.items) { + if (item.getTop() >= visibleTop) { + return item; + } + } + } + } + if (orderedItems.isEmpty()) { + return null; + } + return orderedItems.get(0); } @Override @@ -316,6 +360,8 @@ public class ImageView extends ItemView { } private void updateLayout(boolean forRefresh) { + focalItem = null; //clear cached focalItem when layout changes + int x, groupY, pileY, pileHeight, maxPileHeight; int y = PADDING; int groupX = PADDING; @@ -484,7 +530,10 @@ public class ImageView extends ItemView { private boolean updateHoveredItem(Point hoverPoint0, Point hoverScrollPos0) { hoverPoint = hoverPoint0; - hoverScrollPos = hoverScrollPos0; + if (hoverScrollPos != hoverScrollPos0) { + hoverScrollPos = hoverScrollPos0; + focalItem = null; //clear cached focalItem when scroll changes + } if (lockHoveredItem) { return false; } @@ -743,7 +792,7 @@ public class ImageView extends ItemView { g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); final Dimension visibleSize = getVisibleSize(); - final int visibleTop = getScroller().getVerticalScrollBar().getValue(); + final int visibleTop = getScrollValue(); final int visibleBottom = visibleTop + visibleSize.height; FSkin.setGraphicsFont(g2d, GROUP_HEADER_FONT);