diff --git a/Program.cs b/Program.cs index 63b1788..896c544 100644 --- a/Program.cs +++ b/Program.cs @@ -122,10 +122,12 @@ public class ViewTool : ITool { public class CropTool : ITool { + enum Mode { Sizing, Translating }; + Photo photo; Vector2i mouseDragStart; Vector2i mouseDragEnd; - bool dragging; + Mode mode; string status = ""; public CropTool(Photo photo) { @@ -138,15 +140,38 @@ public class CropTool : ITool { Vector2i mousePosition = (Vector2i) mouse.Position; Vector2i imagePosition = transform.ScreenToImage(mousePosition); + List corners = Util.RectangleCorners(photo.CropRectangle); + Vector2i? oppositeCorner = null; + bool mouseNearHandle = false; + for (int i = 0; i < 4; i++) { + Vector2i corner = corners[i]; + Vector2i handlePosition = transform.ImageToScreen(corner.X, corner.Y); + if (Vector2i.Subtract(mousePosition, handlePosition).ManhattanLength < 10) { + mouseNearHandle = true; + oppositeCorner = corners[(i + 2) % 4]; + break; + } + } + bool mouseInRectangle = photo.CropRectangle.Contains(imagePosition.X, imagePosition.Y); if (mouse.IsButtonPressed(MouseButton.Button1)) { - dragging = mouseInRectangle; + if (mouseNearHandle || !mouseInRectangle) { + mode = Mode.Sizing; + } else { + mode = Mode.Translating; + } + } + if (mouseNearHandle) { + game.Cursor = MouseCursor.Hand; + } else if (mouseInRectangle) { + game.Cursor = MouseCursor.Default; + } else { + game.Cursor = MouseCursor.Crosshair; } - game.Cursor = mouseInRectangle ? MouseCursor.Default : MouseCursor.Crosshair; - if (!dragging) { + if (mode == Mode.Sizing) { if (mouse.IsButtonPressed(MouseButton.Button1)) { - mouseDragStart = imagePosition; + mouseDragStart = oppositeCorner ?? imagePosition; } if (mouse.IsButtonDown(MouseButton.Button1)) { mouseDragEnd = imagePosition; @@ -297,6 +322,16 @@ public static class Util { return new Box2i(left, top, left + width, top + height); } + // resulting items are ordered such that a corner's opposite is 2 indexes away. + public static List RectangleCorners(Rectangle r) { + List result = new(4); + result.Add(new(r.Left, r.Top)); + result.Add(new(r.Right, r.Top)); + result.Add(new(r.Right, r.Bottom)); + result.Add(new(r.Left, r.Bottom)); + return result; + } + public static Image MakeImage(float width, float height) { return new((int) Math.Ceiling(width), (int) Math.Ceiling(height)); } @@ -724,8 +759,8 @@ public class Game : GameWindow { // string[] files = Directory.GetFiles(@"c:\users\colin\pictures\photos\2023\07\14\"); // string[] files = Directory.GetFiles(@"c:\users\colin\pictures\photos\2023\09\06\jpg"); // string[] files = Directory.GetFiles(@"G:\DCIM\100EOSR6\"); - // string[] files = Directory.GetFiles(@"c:\users\colin\desktop\totte-output\2023\08\29"); - string[] files = Directory.GetFiles(@"c:\users\colin\desktop\export"); + string[] files = Directory.GetFiles(@"c:\users\colin\desktop\totte-output\2023\08\03"); + // string[] files = Directory.GetFiles(@"c:\users\colin\desktop\export"); // string[] files = Directory.GetFiles(@"C:\Users\colin\Pictures\photos\2018\06\23"); // string[] files = Directory.GetFiles(@"C:\Users\colin\Desktop\Germany all\104D7000"); // string[] files = Directory.GetFiles(@"C:\Users\colin\Desktop\many-birds\");