diff --git a/Program.cs b/Program.cs index d75ad19..95da4be 100644 --- a/Program.cs +++ b/Program.cs @@ -126,8 +126,8 @@ public class CropTool : ITool { } var (left, right, top, bottom) = GetCrop(); - Vector2i size = new(right - left, bottom - top); + status = $"({left}, {top}) {size.X}x{size.Y}"; Rectangle crop = Rectangle.Empty; @@ -167,27 +167,6 @@ public class CropTool : ITool { } public void Draw(UiGeometry geometry, Game game) { - if (activePhoto.CropRectangle == Rectangle.Empty) { - return; - } - - Vector2i leftTop = game.ImageToScreen(activePhoto.CropRectangle.Left, activePhoto.CropRectangle.Top); - Vector2i rightBottom = game.ImageToScreen(activePhoto.CropRectangle.Right, activePhoto.CropRectangle.Bottom); - var (left, top) = leftTop; - var (right, bottom) = rightBottom; - - Color4 shadeColor = new Color4(0, 0, 0, 0.75f); - game.DrawFilledBox(new Box2i(0, 0, left, geometry.PhotoBox.Max.Y), shadeColor); - game.DrawFilledBox(new Box2i(left, 0, geometry.PhotoBox.Max.X, top), shadeColor); - game.DrawFilledBox(new Box2i(left, bottom, geometry.PhotoBox.Max.X, geometry.PhotoBox.Max.Y), shadeColor); - game.DrawFilledBox(new Box2i(right, top, geometry.PhotoBox.Max.X, bottom), shadeColor); - game.DrawBox(new Box2i(left, top, right, bottom), 1, Color4.White); - game.DrawBox(new Box2i(left - 1, top - 1 , right + 1, bottom + 1), 1, Color4.Black); - game.DrawBox(new Box2i(left - 2, top - 2 , right + 2, bottom + 2), 1, Color4.White); - game.DrawHorizontalLine(left, Util.Lerp(top, bottom, 1.0 / 3), right, Color4.White); - game.DrawHorizontalLine(left, Util.Lerp(top, bottom, 2.0 / 3), right, Color4.White); - game.DrawVerticalLine(Util.Lerp(left, right, 1.0 / 3), top, bottom, Color4.White); - game.DrawVerticalLine(Util.Lerp(left, right, 2.0 / 3), top, bottom, Color4.White); } public string Status() { @@ -712,6 +691,8 @@ public class Game : GameWindow { protected override void OnUpdateFrame(FrameEventArgs e) { base.OnUpdateFrame(e); + Photo previousPhoto = photos[photoIndex]; + KeyboardState input = KeyboardState; bool shiftIsDown = input.IsKeyDown(Keys.LeftShift) || input.IsKeyDown(Keys.RightShift); @@ -860,6 +841,10 @@ public class Game : GameWindow { } // Handle tool switching. + if (photos[photoIndex] != previousPhoto) { + activeTool = viewTool; + } + if (activeTool == viewTool) { if (input.IsKeyPressed(Keys.C)) { activeTool = new CropTool(photos[photoIndex]); @@ -867,7 +852,6 @@ public class Game : GameWindow { } // Delegate input to the active tool. - activeTool.SetActivePhoto(photos[photoIndex]); ToolState state = activeTool.HandleInput(geometry, KeyboardState, MouseState, this); // Change back to the default tool if the active tool is done. @@ -1076,6 +1060,8 @@ public class Game : GameWindow { Texture star = (activePhoto.Rating > i) ? STAR_FILLED : STAR_EMPTY; DrawTexture(star, geometry.StarBoxes[i].Min.X, geometry.StarBoxes[i].Min.Y); } + bool cropActive = activeTool.GetType().Name == "CropTool"; + DrawCropRectangle(cropActive); // Draw thumbnail boxes. ribbonIndex = Math.Clamp(photoIndex - (geometry.ThumbnailBoxes.Count - 1) / 2, 0, Math.Max(0, photos.Count - geometry.ThumbnailBoxes.Count)); @@ -1113,6 +1099,31 @@ public class Game : GameWindow { } } + void DrawCropRectangle(bool active) { + Photo activePhoto = photos[photoIndex]; + if (activePhoto.CropRectangle == Rectangle.Empty) { + return; + } + + Vector2i leftTop = ImageToScreen(activePhoto.CropRectangle.Left, activePhoto.CropRectangle.Top); + Vector2i rightBottom = ImageToScreen(activePhoto.CropRectangle.Right, activePhoto.CropRectangle.Bottom); + var (left, top) = leftTop; + var (right, bottom) = rightBottom; + + Color4 shadeColor = new Color4(0, 0, 0, 0.75f); + DrawFilledBox(new Box2i(0, 0, left, geometry.PhotoBox.Max.Y), shadeColor); + DrawFilledBox(new Box2i(left, 0, geometry.PhotoBox.Max.X, top), shadeColor); + DrawFilledBox(new Box2i(left, bottom, geometry.PhotoBox.Max.X, geometry.PhotoBox.Max.Y), shadeColor); + DrawFilledBox(new Box2i(right, top, geometry.PhotoBox.Max.X, bottom), shadeColor); + DrawBox(new Box2i(left, top, right, bottom), 1, Color4.White); + if (active) { + DrawHorizontalLine(left, Util.Lerp(top, bottom, 1.0 / 3), right, Color4.White); + DrawHorizontalLine(left, Util.Lerp(top, bottom, 2.0 / 3), right, Color4.White); + DrawVerticalLine(Util.Lerp(left, right, 1.0 / 3), top, bottom, Color4.White); + DrawVerticalLine(Util.Lerp(left, right, 2.0 / 3), top, bottom, Color4.White); + } + } + public Vector2i ScreenToImage(int x, int y) { int rx = (int) ((x - activeOffset.X) / activeScale); rx = Math.Clamp(rx, 0, photos[photoIndex].Size.X);