diff --git a/BuildTime.txt b/BuildTime.txt index c16ded6..67fd6f9 100644 --- a/BuildTime.txt +++ b/BuildTime.txt @@ -1 +1 @@ -2026-03-24 17:25:50 \ No newline at end of file +2026-03-24 17:41:18 \ No newline at end of file diff --git a/GitCommit.txt b/GitCommit.txt index 88d8b17..9ea4b91 100644 --- a/GitCommit.txt +++ b/GitCommit.txt @@ -1 +1 @@ -5fd826a \ No newline at end of file +6c75c51 \ No newline at end of file diff --git a/Gui/Apps/Settings.cs b/Gui/Apps/Settings.cs index 18c3939..101aaf8 100644 --- a/Gui/Apps/Settings.cs +++ b/Gui/Apps/Settings.cs @@ -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(); @@ -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); } diff --git a/Gui/WindowManager.cs b/Gui/WindowManager.cs index e382f67..7118cf2 100644 --- a/Gui/WindowManager.cs +++ b/Gui/WindowManager.cs @@ -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() diff --git a/Settings/Settings.cs b/Settings/Settings.cs index fb3c787..dc6c34c 100644 --- a/Settings/Settings.cs +++ b/Settings/Settings.cs @@ -38,6 +38,7 @@ namespace CMLeonOS.Settings { "GUI_MouseSensitivity", "1.0" }, { "GUI_ScreenWidth", "1280" }, { "GUI_ScreenHeight", "800" }, + { "GUI_WallpaperPath", "" }, { "GUI_DarkNotepad", "false" }, { "SkipToGui", "false" } }; @@ -190,6 +191,23 @@ namespace CMLeonOS.Settings } } + public static string GUI_WallpaperPath + { + get + { + if (settings.TryGetValue("GUI_WallpaperPath", out string value)) + { + return value; + } + return string.Empty; + } + set + { + settings["GUI_WallpaperPath"] = value ?? string.Empty; + SaveSettings(); + } + } + public static bool GUI_DarkNotepad { get