更换壁纸功能

This commit is contained in:
2026-03-24 17:45:40 +08:00
parent 6c75c51e01
commit fc61afb6a7
5 changed files with 151 additions and 4 deletions

View File

@@ -18,8 +18,10 @@ using Cosmos.System.Graphics;
using CMLeonOS;
using CMLeonOS.Gui.UILib;
using CMLeonOS.Settings;
using CMLeonOS.Utils;
using System;
using System.Drawing;
using System.IO;
namespace CMLeonOS.Gui.Apps
{
@@ -30,6 +32,7 @@ namespace CMLeonOS.Gui.Apps
AppWindow window;
Window currentCategoryWindow;
private FileBrowser wallpaperBrowser;
WindowManager wm = ProcessManager.GetProcess<WindowManager>();
@@ -92,6 +95,70 @@ namespace CMLeonOS.Gui.Apps
SettingsManager.SkipToGui = @checked;
}
private void ShowMessage(string title, string text)
{
MessageBox messageBox = new MessageBox(this, title, text);
messageBox.Show();
}
private string GetWallpaperLabel()
{
string path = SettingsManager.GUI_WallpaperPath;
if (string.IsNullOrWhiteSpace(path))
{
return "Current wallpaper: Default";
}
string fileName = Path.GetFileName(path);
if (string.IsNullOrWhiteSpace(fileName))
{
fileName = path;
}
return $"Current wallpaper: {fileName}";
}
private void ApplyWallpaper(string path)
{
string sanitizedPath = string.IsNullOrWhiteSpace(path) ? string.Empty : PathUtil.Sanitize(path.Trim());
if (!string.IsNullOrWhiteSpace(sanitizedPath))
{
if (!File.Exists(sanitizedPath))
{
ShowMessage("Wallpaper", "File not found.");
return;
}
if (!Path.GetExtension(sanitizedPath).Equals(".bmp", StringComparison.OrdinalIgnoreCase))
{
ShowMessage("Wallpaper", "Only BMP wallpapers are supported.");
return;
}
}
if (!wm.ApplyWallpaper(sanitizedPath))
{
ShowMessage("Wallpaper", "Failed to apply wallpaper.");
return;
}
SettingsManager.GUI_WallpaperPath = sanitizedPath;
ShowAppearanceCategory();
}
private void OpenWallpaperBrowser()
{
wallpaperBrowser = new FileBrowser(this, wm, (string selectedPath) =>
{
if (!string.IsNullOrWhiteSpace(selectedPath))
{
ApplyWallpaper(selectedPath);
}
}, selectDirectoryOnly: false);
wallpaperBrowser.Show();
}
private void MouseSensitivityChanged(float value)
{
SettingsManager.GUI_MouseSensitivity = value;
@@ -126,6 +193,20 @@ namespace CMLeonOS.Gui.Apps
skipToGui.CheckBoxChanged = SkipToGuiChanged;
wm.AddWindow(skipToGui);
appearance.DrawString("Wallpaper", Color.Gray, 12, 132);
appearance.DrawString(GetWallpaperLabel(), Color.Black, 12, 152);
appearance.DrawString("Choose a BMP file or restore the embedded default wallpaper.", Color.Gray, 12, 172);
Button chooseWallpaper = new Button(appearance, 12, 198, 132, 24);
chooseWallpaper.Text = "Choose BMP";
chooseWallpaper.OnClick = (_, _) => OpenWallpaperBrowser();
wm.AddWindow(chooseWallpaper);
Button defaultWallpaper = new Button(appearance, 154, 198, 132, 24);
defaultWallpaper.Text = "Use Default";
defaultWallpaper.OnClick = (_, _) => ApplyWallpaper(string.Empty);
wm.AddWindow(defaultWallpaper);
wm.Update(window);
}

View File

@@ -21,9 +21,11 @@ using CMLeonOS.Gui.ShellComponents;
using CMLeonOS.Settings;
using CMLeonOS.Driver;
using CMLeonOS.Logger;
using CMLeonOS.Utils;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
namespace CMLeonOS.Gui
{
@@ -79,6 +81,8 @@ namespace CMLeonOS.Gui
private Bitmap wallpaperResized;
internal string CurrentWallpaperPath { get; private set; } = string.Empty;
internal int Fps
{
get
@@ -357,7 +361,51 @@ namespace CMLeonOS.Gui
private void SetupWallpaper()
{
wallpaperResized = wallpaperBitmap.Resize(ScreenWidth, ScreenHeight);
if (!ApplyWallpaper(SettingsManager.GUI_WallpaperPath, rerender: false))
{
ApplyWallpaper(string.Empty, rerender: false);
}
}
internal bool ApplyWallpaper(string path, bool rerender = true)
{
try
{
Bitmap sourceBitmap = wallpaperBitmap;
string sanitizedPath = string.Empty;
if (!string.IsNullOrWhiteSpace(path))
{
sanitizedPath = PathUtil.Sanitize(path.Trim());
if (!File.Exists(sanitizedPath))
{
return false;
}
if (!Path.GetExtension(sanitizedPath).Equals(".bmp", StringComparison.OrdinalIgnoreCase))
{
return false;
}
sourceBitmap = new Bitmap(File.ReadAllBytes(sanitizedPath));
}
wallpaperResized = sourceBitmap.Resize(ScreenWidth, ScreenHeight);
CurrentWallpaperPath = sanitizedPath;
if (rerender)
{
RerenderAll();
}
return true;
}
catch (Exception ex)
{
Logger.Logger.Instance.Error("WindowManager", $"Failed to apply wallpaper: {ex.Message}");
return false;
}
}
private void UpdateCursor()