From 5fd826ab54699f4918f8fbb7d9f8bff3512b1fd7 Mon Sep 17 00:00:00 2001 From: Leonmmcoset Date: Tue, 24 Mar 2026 17:24:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BuildTime.txt | 2 +- GitCommit.txt | 2 +- Gui/Apps/ImageViewer.cs | 26 ++----------- Gui/UILib/Animations/Animation.cs | 3 ++ Gui/UILib/AppWindow.cs | 62 ++++++++++++++++++++++++++++++- 5 files changed, 68 insertions(+), 27 deletions(-) diff --git a/BuildTime.txt b/BuildTime.txt index 577d9b4..9261a62 100644 --- a/BuildTime.txt +++ b/BuildTime.txt @@ -1 +1 @@ -2026-03-23 22:09:30 \ No newline at end of file +2026-03-24 17:20:32 \ No newline at end of file diff --git a/GitCommit.txt b/GitCommit.txt index aa69fc8..b818dee 100644 --- a/GitCommit.txt +++ b/GitCommit.txt @@ -1 +1 @@ -9197dfb \ No newline at end of file +78ebe0c \ No newline at end of file diff --git a/Gui/Apps/ImageViewer.cs b/Gui/Apps/ImageViewer.cs index 9935d8a..b105851 100644 --- a/Gui/Apps/ImageViewer.cs +++ b/Gui/Apps/ImageViewer.cs @@ -36,9 +36,7 @@ namespace CMLeonOS.Gui.Apps private AppWindow window; private Window canvas; - private TextBox pathBox; private Button openButton; - private Button loadButton; private Button clearButton; private WindowManager wm = ProcessManager.GetProcess(); @@ -63,12 +61,10 @@ namespace CMLeonOS.Gui.Apps int y = padding; int buttonY = y; - openButton.MoveAndResize(window.Width - (buttonWidth * 3 + padding * 3), buttonY, buttonWidth, toolbarHeight); - loadButton.MoveAndResize(window.Width - (buttonWidth * 2 + padding * 2), buttonY, buttonWidth, toolbarHeight); + openButton.MoveAndResize(window.Width - (buttonWidth * 2 + padding * 2), buttonY, buttonWidth, toolbarHeight); clearButton.MoveAndResize(window.Width - (buttonWidth + padding), buttonY, buttonWidth, toolbarHeight); - - int pathWidth = window.Width - (buttonWidth * 3 + padding * 5); - pathBox.MoveAndResize(padding, y + 3, pathWidth, toolbarHeight - 6); + openButton.Render(); + clearButton.Render(); int canvasY = toolbarHeight + (padding * 2); int canvasHeight = window.Height - canvasY - padding; @@ -181,7 +177,6 @@ namespace CMLeonOS.Gui.Apps byte[] bmpBytes = File.ReadAllBytes(sanitizedPath); currentBitmap = new Bitmap(bmpBytes); currentPath = sanitizedPath; - pathBox.Text = sanitizedPath; window.Title = $"Image Viewer - {Path.GetFileName(sanitizedPath)}"; RenderCanvas(); return true; @@ -209,11 +204,6 @@ namespace CMLeonOS.Gui.Apps fileBrowser.Show(); } - private void LoadFromPath() - { - LoadImage(pathBox.Text); - } - private void ClearImage() { currentBitmap = null; @@ -234,21 +224,11 @@ namespace CMLeonOS.Gui.Apps window.Closing = TryStop; wm.AddWindow(window); - pathBox = new TextBox(window, 0, 0, 1, 1); - pathBox.PlaceholderText = @"0:\path\image.bmp"; - pathBox.Submitted = LoadFromPath; - wm.AddWindow(pathBox); - openButton = new Button(window, 0, 0, 1, 1); openButton.Text = "Open"; openButton.OnClick = (_, _) => OpenDialog(); wm.AddWindow(openButton); - loadButton = new Button(window, 0, 0, 1, 1); - loadButton.Text = "Load"; - loadButton.OnClick = (_, _) => LoadFromPath(); - wm.AddWindow(loadButton); - clearButton = new Button(window, 0, 0, 1, 1); clearButton.Text = "Clear"; clearButton.OnClick = (_, _) => ClearImage(); diff --git a/Gui/UILib/Animations/Animation.cs b/Gui/UILib/Animations/Animation.cs index 453b973..afea590 100644 --- a/Gui/UILib/Animations/Animation.cs +++ b/Gui/UILib/Animations/Animation.cs @@ -15,6 +15,7 @@ // along with this program. If not, see . using CMLeonOS.Gui; +using System; namespace CMLeonOS.UILib.Animations { @@ -23,6 +24,7 @@ namespace CMLeonOS.UILib.Animations /// internal abstract class Animation { + internal Action Completed { get; set; } /// /// The easing type of the animation. /// @@ -80,6 +82,7 @@ namespace CMLeonOS.UILib.Animations if (Finished) { Stop(); + Completed?.Invoke(); } }, (ulong)((1000d /* ms */ / 60d) * 1e+6d /* ms -> ns */ ), true)); } diff --git a/Gui/UILib/AppWindow.cs b/Gui/UILib/AppWindow.cs index a11320e..37d141a 100644 --- a/Gui/UILib/AppWindow.cs +++ b/Gui/UILib/AppWindow.cs @@ -19,6 +19,7 @@ using Cosmos.System.Graphics; using CMLeonOS; using CMLeonOS.Gui.ShellComponents.Dock; using CMLeonOS.Gui.SmoothMono; +using CMLeonOS.UILib.Animations; using System; using System.Drawing; @@ -41,6 +42,7 @@ namespace CMLeonOS.Gui.UILib Icon = defaultAppIconBitmap; RenderDecoration(); + StartOpenAnimation(); } [IL2CPU.API.Attribs.ManifestResourceStream(ResourceName = "CMLeonOS.Gui.Resources.Close.bmp")] @@ -147,18 +149,73 @@ namespace CMLeonOS.Gui.UILib private WindowManager wm; private bool maximised = false; + private bool closeAnimationRunning = false; private int originalX; private int originalY; private int originalWidth; private int originalHeight; + private void StartOpenAnimation() + { + int targetY = Y; + int offsetY = Math.Min(18, Math.Max(8, Height / 12)); + + Move(X, targetY + offsetY, sendWMEvent: false); + + MovementAnimation animation = new MovementAnimation(this) + { + From = new Rectangle(X, Y, Width, Height), + To = new Rectangle(X, targetY, Width, Height), + Duration = 12, + EasingType = EasingType.Sine, + EasingDirection = EasingDirection.Out + }; + animation.Start(); + } + + private void StartCloseAnimation() + { + if (closeAnimationRunning) + { + return; + } + + closeAnimationRunning = true; + + int offsetY = Math.Min(18, Math.Max(8, Height / 12)); + int startX = X; + int startY = Y; + int startWidth = Width; + int startHeight = Height; + + MovementAnimation animation = new MovementAnimation(this) + { + From = new Rectangle(startX, startY, startWidth, startHeight), + To = new Rectangle(startX, startY + offsetY, startWidth, startHeight), + Duration = 10, + EasingType = EasingType.Sine, + EasingDirection = EasingDirection.In + }; + animation.Completed = () => + { + Closing?.Invoke(); + wm.RemoveWindow(this); + closeAnimationRunning = false; + }; + animation.Start(); + } + private void DecorationClicked(int x, int y) { + if (closeAnimationRunning) + { + return; + } + if (x >= Width - titlebarHeight && _canClose) { // Close. - Closing?.Invoke(); - wm.RemoveWindow(this); + StartCloseAnimation(); } else if (x >= Width - (titlebarHeight * (_canClose ? 2 : 1)) && _canResize) { @@ -218,6 +275,7 @@ namespace CMLeonOS.Gui.UILib buttonSpace += titlebarHeight; } if (x >= Width - buttonSpace || maximised || !_canMove) return; + if (closeAnimationRunning) return; uint startMouseX = MouseManager.X; uint startMouseY = MouseManager.Y;