allow user to drag around the crop box

This commit is contained in:
Colin McMillen 2023-08-04 00:43:47 -04:00
parent c953fa2b47
commit 1c586a6197

View File

@ -81,14 +81,14 @@ public class ViewTool : ITool {
// FIXME: remove unneeded dependencies on "Game" or at least refactor them a bit. // FIXME: remove unneeded dependencies on "Game" or at least refactor them a bit.
public class CropTool : ITool { public class CropTool : ITool {
Photo activePhoto; Photo photo;
Vector2i mouseDragStart; Vector2i mouseDragStart;
Vector2i mouseDragEnd; Vector2i mouseDragEnd;
bool dragging; bool dragging;
string status = ""; string status = "";
public CropTool(Photo photo) { public CropTool(Photo photo) {
activePhoto = photo; this.photo = photo;
mouseDragStart = new(photo.CropRectangle.Left, photo.CropRectangle.Top); mouseDragStart = new(photo.CropRectangle.Left, photo.CropRectangle.Top);
mouseDragEnd = new(photo.CropRectangle.Right, photo.CropRectangle.Bottom); mouseDragEnd = new(photo.CropRectangle.Right, photo.CropRectangle.Bottom);
} }
@ -98,7 +98,7 @@ public class CropTool : ITool {
Vector2i imagePosition = game.ScreenToImage(mousePosition); Vector2i imagePosition = game.ScreenToImage(mousePosition);
if (mouse.IsButtonPressed(MouseButton.Button1)) { if (mouse.IsButtonPressed(MouseButton.Button1)) {
dragging = activePhoto.CropRectangle.Contains(imagePosition.X, imagePosition.Y); dragging = photo.CropRectangle.Contains(imagePosition.X, imagePosition.Y);
} }
if (!dragging) { if (!dragging) {
@ -111,23 +111,41 @@ public class CropTool : ITool {
var (left, right, top, bottom) = GetCrop(); var (left, right, top, bottom) = GetCrop();
if (left != right && top != bottom) { if (left != right && top != bottom) {
activePhoto.CropRectangle = Rectangle.FromLTRB(left, top, right, bottom); photo.CropRectangle = Rectangle.FromLTRB(left, top, right, bottom);
} else { } else {
activePhoto.CropRectangle = Rectangle.Empty; photo.CropRectangle = Rectangle.Empty;
} }
} else { } else {
// FIXME if (mouse.IsButtonDown(MouseButton.Button1)) {
Vector2 delta = mouse.Delta;
Vector2i imageDelta = game.ScreenToImageDelta((int) delta.X, (int) delta.Y);
photo.CropRectangle.Offset(imageDelta.X, imageDelta.Y);
if (photo.CropRectangle.Left < 0) {
photo.CropRectangle.Offset(-photo.CropRectangle.Left, 0);
}
if (photo.CropRectangle.Right > photo.Size.X) {
int overshoot = photo.CropRectangle.Right - photo.Size.X;
photo.CropRectangle.Offset(-overshoot, 0);
}
if (photo.CropRectangle.Top < 0) {
photo.CropRectangle.Offset(0, -photo.CropRectangle.Top);
}
if (photo.CropRectangle.Bottom > photo.Size.Y) {
int overshoot = photo.CropRectangle.Bottom - photo.Size.Y;
photo.CropRectangle.Offset(0, -overshoot);
}
}
} }
Rectangle r = activePhoto.CropRectangle; Rectangle r = photo.CropRectangle;
status = $"({r.Left}, {r.Top}) {r.Width}x{r.Height}"; status = $"({r.Left}, {r.Top}, {r.Right}, {r.Bottom}) {r.Width}x{r.Height}";
if (input.IsKeyPressed(Keys.Enter)) { if (input.IsKeyPressed(Keys.Enter)) {
return ToolStatus.Done; return ToolStatus.Done;
} }
if (input.IsKeyPressed(Keys.Escape)) { if (input.IsKeyPressed(Keys.Escape)) {
activePhoto.CropRectangle = Rectangle.Empty; photo.CropRectangle = Rectangle.Empty;
return ToolStatus.Canceled; return ToolStatus.Canceled;
} }
@ -828,10 +846,14 @@ public class Game : GameWindow {
} }
} }
public Vector2i ScreenToImageDelta(int x, int y) {
return new((int) (x / activeScale), (int) (y / activeScale));
}
public Vector2i ScreenToImage(int x, int y) { public Vector2i ScreenToImage(int x, int y) {
int rx = (int) ((x - activeOffset.X) / activeScale); int rx = (int) ((x - activeOffset.X) / activeScale);
rx = Math.Clamp(rx, 0, photos[photoIndex].Size.X);
int ry = (int) ((y - activeOffset.Y) / activeScale); int ry = (int) ((y - activeOffset.Y) / activeScale);
rx = Math.Clamp(rx, 0, photos[photoIndex].Size.X);
ry = Math.Clamp(ry, 0, photos[photoIndex].Size.Y); ry = Math.Clamp(ry, 0, photos[photoIndex].Size.Y);
return new(rx, ry); return new(rx, ry);
} }