OverlayRenderer: Fix overlay resizing logic

Prior to this commit, reducing the size of an overlay not attached to an
anchor point using the north or west edges and corners such that its
dimensions would be below the minimum overlay size would push that
overlay in that direction as it was dragged. This commit updates the
overlay resize logic to prevent "pushing" overlays when trying to reduce
the width or height below the overlay's minimum size.
This commit is contained in:
Jordan Atwood
2020-07-14 20:58:10 -07:00
committed by Tomas Slusny
parent 8a82b4dfc5
commit 6bac3e81b8

View File

@@ -460,53 +460,83 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener
if (inOverlayResizingMode)
{
final Rectangle r = currentManagedBounds;
final int left = p.x - currentManagedBounds.x; // Distance (in pixels) from the left edge of the bounds
final int top = p.y - currentManagedBounds.y; // Distance (in pixels) from the top edge of the bounds
final int originalX = currentManagedBounds.x;
final int originalY = currentManagedBounds.y;
int x = originalX;
int y = originalY;
int width = currentManagedBounds.width;
int height = currentManagedBounds.height;
final int dx = p.x - r.x;
final int dy = p.y - r.y;
switch (clientUI.getCurrentCursor().getType())
{
case Cursor.N_RESIZE_CURSOR:
int height = r.height - dy;
r.setRect(r.x, r.y + dy, r.width, height);
y += top;
height -= top;
break;
case Cursor.NW_RESIZE_CURSOR:
int width = r.width - dx;
height = r.height - dy;
r.setRect(r.x + dx, r.y + dy, width, height);
x += left;
y += top;
width -= left;
height -= top;
break;
case Cursor.W_RESIZE_CURSOR:
width = r.width - dx;
r.setRect(r.x + dx, r.y, width, r.height);
x += left;
width -= left;
break;
case Cursor.SW_RESIZE_CURSOR:
width = r.width - dx;
height = dy;
r.setRect(r.x + dx, r.y, width, height);
x += left;
width -= left;
height = top;
break;
case Cursor.S_RESIZE_CURSOR:
height = dy;
r.setRect(r.x, r.y, r.width, height);
height = top;
break;
case Cursor.SE_RESIZE_CURSOR:
width = dx;
height = dy;
r.setRect(r.x, r.y, width, height);
width = left;
height = top;
break;
case Cursor.E_RESIZE_CURSOR:
width = dx;
r.setRect(r.x, r.y, width, r.height);
width = left;
break;
case Cursor.NE_RESIZE_CURSOR:
width = dx;
height = r.height - dy;
r.setRect(r.x, r.y + dy, width, height);
y += top;
width = left;
height -= top;
break;
default:
// center
}
currentManagedOverlay.setPreferredSize(new Dimension(Math.max(MIN_OVERLAY_SIZE, currentManagedBounds.width), Math.max(MIN_OVERLAY_SIZE, currentManagedBounds.height)));
final int widthOverflow = Math.max(0, MIN_OVERLAY_SIZE - width);
final int heightOverflow = Math.max(0, MIN_OVERLAY_SIZE - height);
final int dx = x - originalX;
final int dy = y - originalY;
// If this resize operation would cause the dimensions to go below the minimum width/height, reset the
// dimensions and adjust the x/y position accordingly as needed
if (widthOverflow > 0)
{
width = MIN_OVERLAY_SIZE;
if (dx > 0)
{
x -= widthOverflow;
}
}
if (heightOverflow > 0)
{
height = MIN_OVERLAY_SIZE;
if (dy > 0)
{
y -= heightOverflow;
}
}
currentManagedBounds.setRect(x, y, width, height);
currentManagedOverlay.setPreferredSize(new Dimension(currentManagedBounds.width, currentManagedBounds.height));
if (currentManagedOverlay.getPreferredLocation() != null)
{