修复bug

This commit is contained in:
2026-03-24 17:24:16 +08:00
parent 78ebe0c2a6
commit 5fd826ab54
5 changed files with 68 additions and 27 deletions

View File

@@ -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<WindowManager>();
@@ -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();

View File

@@ -15,6 +15,7 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.
using CMLeonOS.Gui;
using System;
namespace CMLeonOS.UILib.Animations
{
@@ -23,6 +24,7 @@ namespace CMLeonOS.UILib.Animations
/// </summary>
internal abstract class Animation
{
internal Action Completed { get; set; }
/// <summary>
/// The easing type of the animation.
/// </summary>
@@ -80,6 +82,7 @@ namespace CMLeonOS.UILib.Animations
if (Finished)
{
Stop();
Completed?.Invoke();
}
}, (ulong)((1000d /* ms */ / 60d) * 1e+6d /* ms -> ns */ ), true));
}

View File

@@ -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;