Patched bug that caused Undoing MoveBounds operations to sometimes move sprite bounds out of range

This commit is contained in:
quinnvoker
2018-12-02 15:13:01 -08:00
parent 07669c2ccb
commit c0c757650c
6 changed files with 96 additions and 73 deletions
+49 -65
View File
@@ -56,8 +56,8 @@ namespace SpriteMapEditor
private Point newPosition;
private Point oldPosition;
private int totalDragX;
private int totalDragY;
private List<Microsoft.Xna.Framework.Rectangle> preDragBounds;
private int drawingRectangleOffset
{
@@ -513,65 +513,42 @@ namespace SpriteMapEditor
{
hovering = true;
Cursor = Cursors.SizeAll;
if (movingWithMouse)
{
newPosition = mousePosition;
newPosition.X /= zoomLevel;
newPosition.Y /= zoomLevel;
int differenceX = newPosition.X - oldPosition.X;
int differenceY = newPosition.Y - oldPosition.Y;
var groupRect = GetSelectedGroupRectangle();
if (groupRect.X + differenceX < 0 ||
groupRect.X + groupRect.Width + differenceX > spriteSheet.Width)
differenceX = 0;
if (groupRect.Y + differenceY < 0 ||
groupRect.Y + groupRect.Height + differenceY > spriteSheet.Height)
differenceY = 0;
totalDragX += differenceX;
totalDragY += differenceY;
foreach (SpriteMapRegion spriteToMove in selectedSprites)
{
var newBounds = spriteToMove.Bounds;
newBounds.X += differenceX;
newBounds.Y += differenceY;
newBounds = ClampRectangleToSheet(newBounds);
spriteToMove.Bounds = newBounds;
}
oldPosition = newPosition;
UpdateHighlightMask();
spriteSheetViewer.Refresh();
LoadSpriteEditorValues();
break;
}
}
}
if(!hovering)
if (movingWithMouse)
{
newPosition = mousePosition;
newPosition.X /= zoomLevel;
newPosition.Y /= zoomLevel;
int differenceX = newPosition.X - oldPosition.X;
int differenceY = newPosition.Y - oldPosition.Y;
var groupRect = GetSelectedGroupRectangle();
if (groupRect.X + differenceX < 0 ||
groupRect.X + groupRect.Width + differenceX > spriteSheet.Width)
differenceX = 0;
if (groupRect.Y + differenceY < 0 ||
groupRect.Y + groupRect.Height + differenceY > spriteSheet.Height)
differenceY = 0;
foreach (SpriteMapRegion spriteToMove in selectedSprites)
{
var newBounds = spriteToMove.Bounds;
newBounds.X += differenceX;
newBounds.Y += differenceY;
spriteToMove.Bounds = newBounds;
}
oldPosition = newPosition;
UpdateHighlightMask();
spriteSheetViewer.Refresh();
LoadSpriteEditorValues();
}
if (!hovering)
Cursor = Cursors.Default;
}
private Microsoft.Xna.Framework.Rectangle ClampRectangleToSheet(Microsoft.Xna.Framework.Rectangle rect)
{
var clampedRect = rect;
//clamp X value
if (clampedRect.X < 0)
clampedRect.X = 0;
else if (clampedRect.X + clampedRect.Width > spriteSheet.Width)
clampedRect.X = spriteSheet.Width - clampedRect.Width;
//clamp Y value
if (clampedRect.Y < 0)
clampedRect.Y = 0;
else if (clampedRect.Y + clampedRect.Height > spriteSheet.Height)
clampedRect.Y = spriteSheet.Height - clampedRect.Height;
return clampedRect;
}
private void spriteSheetViewer_MouseDown(object sender, MouseEventArgs e)
{
if (spriteSheet == null)
@@ -584,8 +561,11 @@ namespace SpriteMapEditor
if (GetDrawingRect(currentSprite.Bounds).Contains(mousePosition))
{
movingWithMouse = true;
totalDragX = 0;
totalDragY = 0;
preDragBounds = new List<Microsoft.Xna.Framework.Rectangle>();
foreach (SpriteMapRegion sprite in selectedSprites)
{
preDragBounds.Add(sprite.Bounds);
}
newPosition = mousePosition;
newPosition.X /= zoomLevel;
newPosition.Y /= zoomLevel;
@@ -602,14 +582,18 @@ namespace SpriteMapEditor
private void spriteSheetViewer_MouseUp(object sender, MouseEventArgs e)
{
movingWithMouse = false;
if(totalDragX != 0 || totalDragY != 0)
if (movingWithMouse)
{
var modification = new SpriteMapModifications.MoveBounds(selectedSprites, totalDragX, totalDragY);
var selection = SpriteMapModifications.ModHelper.GetSelectionList(spriteList);
modification.SetPreChangeSelection(selection);
modification.SetPostChangeSelection(selection);
undoHistory.Add(modification);
movingWithMouse = false;
var totalDragX = selectedSprites[0].Bounds.X - preDragBounds[0].X;
var totalDragY = selectedSprites[0].Bounds.Y - preDragBounds[0].Y;
if (totalDragX != 0 || totalDragY != 0)
{
var modification = new SpriteMapModifications.MoveBounds(selectedSprites, totalDragX, totalDragY, preDragBounds);
modification.Undo();
SpriteMapModifications.ModHelper.DoModificationWithSelectionTracking(modification, spriteList);
undoHistory.Add(modification);
}
}
}