mirror of
https://github.com/wwiinnddyy/LanMountainDesktop.git
synced 2026-06-22 00:54:26 +08:00
0.7.4
首先我加了CI课程表json的读取,然后把天气时钟这个老问题也修了。
This commit is contained in:
@@ -1,7 +1,8 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Threading.Tasks;
|
||||
using Avalonia.Media;
|
||||
using Avalonia.Media.Imaging;
|
||||
@@ -15,6 +16,7 @@ namespace LanMountainDesktop.ViewModels;
|
||||
public sealed partial class WallpaperSettingsPageViewModel : ViewModelBase
|
||||
{
|
||||
private readonly ISettingsFacadeService _settingsFacade;
|
||||
private readonly ISystemWallpaperProvider _systemWallpaperProvider;
|
||||
private readonly LocalizationService _localizationService = new();
|
||||
private readonly string _languageCode;
|
||||
private bool _isInitializing;
|
||||
@@ -22,9 +24,11 @@ public sealed partial class WallpaperSettingsPageViewModel : ViewModelBase
|
||||
public WallpaperSettingsPageViewModel(ISettingsFacadeService settingsFacade)
|
||||
{
|
||||
_settingsFacade = settingsFacade;
|
||||
_systemWallpaperProvider = HostSystemWallpaperProvider.GetOrCreate();
|
||||
_languageCode = _localizationService.NormalizeLanguageCode(_settingsFacade.Region.Get().LanguageCode);
|
||||
WallpaperPlacements = CreateWallpaperPlacements();
|
||||
WallpaperTypes = CreateWallpaperTypes();
|
||||
RefreshIntervals = CreateRefreshIntervals();
|
||||
PresetColors = CreatePresetColors();
|
||||
RefreshLocalizedText();
|
||||
|
||||
@@ -35,8 +39,11 @@ public sealed partial class WallpaperSettingsPageViewModel : ViewModelBase
|
||||
|
||||
public IReadOnlyList<SelectionOption> WallpaperPlacements { get; }
|
||||
public IReadOnlyList<SelectionOption> WallpaperTypes { get; }
|
||||
public IReadOnlyList<SelectionOption> RefreshIntervals { get; }
|
||||
public IReadOnlyList<string> PresetColors { get; }
|
||||
|
||||
public bool IsSystemWallpaperSupported => RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
|
||||
|
||||
[ObservableProperty]
|
||||
private string _wallpaperPath = string.Empty;
|
||||
|
||||
@@ -49,6 +56,9 @@ public sealed partial class WallpaperSettingsPageViewModel : ViewModelBase
|
||||
[ObservableProperty]
|
||||
private SelectionOption _selectedWallpaperPlacement = null!;
|
||||
|
||||
[ObservableProperty]
|
||||
private SelectionOption _selectedRefreshInterval = null!;
|
||||
|
||||
[ObservableProperty]
|
||||
private string _wallpaperHeader = string.Empty;
|
||||
|
||||
@@ -73,6 +83,18 @@ public sealed partial class WallpaperSettingsPageViewModel : ViewModelBase
|
||||
[ObservableProperty]
|
||||
private string _filePickerTitle = string.Empty;
|
||||
|
||||
[ObservableProperty]
|
||||
private string _systemWallpaperLabel = string.Empty;
|
||||
|
||||
[ObservableProperty]
|
||||
private string _refreshIntervalLabel = string.Empty;
|
||||
|
||||
[ObservableProperty]
|
||||
private string _refreshButtonTooltip = string.Empty;
|
||||
|
||||
[ObservableProperty]
|
||||
private string _systemWallpaperStatus = string.Empty;
|
||||
|
||||
[ObservableProperty]
|
||||
private bool _isImageOrVideo;
|
||||
|
||||
@@ -82,13 +104,15 @@ public sealed partial class WallpaperSettingsPageViewModel : ViewModelBase
|
||||
[ObservableProperty]
|
||||
private bool _isImage;
|
||||
|
||||
[ObservableProperty]
|
||||
private bool _isSystemWallpaper;
|
||||
|
||||
[ObservableProperty]
|
||||
private Bitmap? _previewImage;
|
||||
|
||||
[ObservableProperty]
|
||||
private IBrush? _previewBrush;
|
||||
|
||||
// 自定义颜色持久化
|
||||
[ObservableProperty]
|
||||
private Color _customColor = Colors.White;
|
||||
|
||||
@@ -110,7 +134,11 @@ public sealed partial class WallpaperSettingsPageViewModel : ViewModelBase
|
||||
string.Equals(option.Value, wallpaperPlacement, StringComparison.OrdinalIgnoreCase))
|
||||
?? WallpaperPlacements[0];
|
||||
|
||||
// 加载自定义颜色
|
||||
var refreshIntervalSeconds = wallpaper.SystemWallpaperRefreshIntervalSeconds;
|
||||
SelectedRefreshInterval = RefreshIntervals.FirstOrDefault(option =>
|
||||
GetIntervalSeconds(option.Value) == refreshIntervalSeconds)
|
||||
?? RefreshIntervals[2];
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(wallpaper.CustomColor) && Color.TryParse(wallpaper.CustomColor, out var customColor))
|
||||
{
|
||||
CustomColor = customColor;
|
||||
@@ -119,6 +147,7 @@ public sealed partial class WallpaperSettingsPageViewModel : ViewModelBase
|
||||
|
||||
UpdateVisibility();
|
||||
UpdatePreviewFromCurrentSelection();
|
||||
UpdateSystemWallpaperStatus();
|
||||
}
|
||||
|
||||
partial void OnSelectedWallpaperTypeChanged(SelectionOption value)
|
||||
@@ -132,8 +161,9 @@ public sealed partial class WallpaperSettingsPageViewModel : ViewModelBase
|
||||
private void UpdateVisibility()
|
||||
{
|
||||
IsImage = SelectedWallpaperType?.Value == "Image";
|
||||
IsImageOrVideo = IsImage;
|
||||
IsImageOrVideo = IsImage || SelectedWallpaperType?.Value == "SystemWallpaper";
|
||||
IsSolidColor = SelectedWallpaperType?.Value == "SolidColor";
|
||||
IsSystemWallpaper = SelectedWallpaperType?.Value == "SystemWallpaper";
|
||||
}
|
||||
|
||||
partial void OnSelectedColorChanged(string? value)
|
||||
@@ -145,13 +175,18 @@ public sealed partial class WallpaperSettingsPageViewModel : ViewModelBase
|
||||
partial void OnCustomColorChanged(Color value)
|
||||
{
|
||||
CustomColorBrush = new SolidColorBrush(value);
|
||||
// 将自定义颜色应用到壁纸
|
||||
var colorHex = $"#{value.A:X2}{value.R:X2}{value.G:X2}{value.B:X2}";
|
||||
SelectedColor = colorHex;
|
||||
if (_isInitializing) return;
|
||||
SaveWallpaper();
|
||||
}
|
||||
|
||||
partial void OnSelectedRefreshIntervalChanged(SelectionOption value)
|
||||
{
|
||||
if (_isInitializing) return;
|
||||
SaveWallpaper();
|
||||
}
|
||||
|
||||
public async Task ImportWallpaperAsync(string sourcePath)
|
||||
{
|
||||
var importedPath = await _settingsFacade.WallpaperMedia.ImportAssetAsync(sourcePath);
|
||||
@@ -170,6 +205,12 @@ public sealed partial class WallpaperSettingsPageViewModel : ViewModelBase
|
||||
|
||||
private void UpdatePreviewFromCurrentSelection()
|
||||
{
|
||||
if (IsSystemWallpaper)
|
||||
{
|
||||
UpdateSystemWallpaperPreview();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!IsImage)
|
||||
{
|
||||
ClearPreviewImage();
|
||||
@@ -180,10 +221,24 @@ public sealed partial class WallpaperSettingsPageViewModel : ViewModelBase
|
||||
UpdatePreviewImage(WallpaperPath);
|
||||
}
|
||||
|
||||
private void UpdatePreviewImage(string path)
|
||||
private void UpdateSystemWallpaperPreview()
|
||||
{
|
||||
var systemPath = _systemWallpaperProvider.GetWallpaperPath();
|
||||
if (string.IsNullOrWhiteSpace(systemPath))
|
||||
{
|
||||
ClearPreviewImage();
|
||||
SystemWallpaperStatus = L("settings.wallpaper.system.unavailable", "Unable to read system wallpaper");
|
||||
return;
|
||||
}
|
||||
|
||||
SystemWallpaperStatus = systemPath;
|
||||
UpdatePreviewImage(systemPath);
|
||||
}
|
||||
|
||||
private void UpdatePreviewImage(string? path)
|
||||
{
|
||||
var previousPreview = PreviewImage;
|
||||
if (string.IsNullOrWhiteSpace(path) || !System.IO.File.Exists(path))
|
||||
if (string.IsNullOrWhiteSpace(path) || !File.Exists(path))
|
||||
{
|
||||
previousPreview?.Dispose();
|
||||
PreviewImage = null;
|
||||
@@ -193,7 +248,7 @@ public sealed partial class WallpaperSettingsPageViewModel : ViewModelBase
|
||||
|
||||
try
|
||||
{
|
||||
using var stream = System.IO.File.OpenRead(path);
|
||||
using var stream = File.OpenRead(path);
|
||||
var bitmap = new Bitmap(stream);
|
||||
PreviewImage = bitmap;
|
||||
PreviewBrush = WallpaperImageBrushFactory.Create(bitmap, SelectedWallpaperPlacement?.Value);
|
||||
@@ -215,9 +270,21 @@ public sealed partial class WallpaperSettingsPageViewModel : ViewModelBase
|
||||
previousPreview?.Dispose();
|
||||
}
|
||||
|
||||
private void UpdateSystemWallpaperStatus()
|
||||
{
|
||||
if (!IsSystemWallpaper) return;
|
||||
UpdateSystemWallpaperPreview();
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
private void RefreshSystemWallpaper()
|
||||
{
|
||||
UpdateSystemWallpaperPreview();
|
||||
}
|
||||
|
||||
partial void OnSelectedWallpaperPlacementChanged(SelectionOption value)
|
||||
{
|
||||
if (IsImage && PreviewImage is not null)
|
||||
if ((IsImage || IsSystemWallpaper) && PreviewImage is not null)
|
||||
{
|
||||
PreviewBrush = WallpaperImageBrushFactory.Create(PreviewImage, value?.Value);
|
||||
}
|
||||
@@ -236,16 +303,46 @@ public sealed partial class WallpaperSettingsPageViewModel : ViewModelBase
|
||||
{
|
||||
var selectedType = SelectedWallpaperType?.Value ?? "Image";
|
||||
var selectedPlacement = SelectedWallpaperPlacement?.Value ?? WallpaperImageBrushFactory.Fill;
|
||||
var normalizedPath = SelectedWallpaperType?.Value == "SolidColor" || string.IsNullOrWhiteSpace(WallpaperPath)
|
||||
? null
|
||||
: WallpaperPath;
|
||||
var refreshIntervalSeconds = GetIntervalSeconds(SelectedRefreshInterval?.Value);
|
||||
|
||||
string? normalizedPath;
|
||||
if (selectedType == "SolidColor" || selectedType == "SystemWallpaper")
|
||||
{
|
||||
normalizedPath = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
normalizedPath = string.IsNullOrWhiteSpace(WallpaperPath) ? null : WallpaperPath;
|
||||
}
|
||||
|
||||
var customColorHex = $"#{CustomColor.A:X2}{CustomColor.R:X2}{CustomColor.G:X2}{CustomColor.B:X2}";
|
||||
_settingsFacade.Wallpaper.Save(new WallpaperSettingsState(
|
||||
normalizedPath,
|
||||
selectedType,
|
||||
SelectedColor,
|
||||
selectedPlacement,
|
||||
customColorHex));
|
||||
customColorHex,
|
||||
refreshIntervalSeconds));
|
||||
}
|
||||
|
||||
private static int GetIntervalSeconds(string? value)
|
||||
{
|
||||
return value switch
|
||||
{
|
||||
"30s" => 30,
|
||||
"1m" => 60,
|
||||
"5m" => 300,
|
||||
"10m" => 600,
|
||||
"15m" => 900,
|
||||
"30m" => 1800,
|
||||
"1h" => 3600,
|
||||
"2h" => 7200,
|
||||
"4h" => 14400,
|
||||
"8h" => 28800,
|
||||
"12h" => 43200,
|
||||
"24h" => 86400,
|
||||
_ => 300
|
||||
};
|
||||
}
|
||||
|
||||
private IReadOnlyList<SelectionOption> CreateWallpaperPlacements()
|
||||
@@ -262,10 +359,36 @@ public sealed partial class WallpaperSettingsPageViewModel : ViewModelBase
|
||||
|
||||
private IReadOnlyList<SelectionOption> CreateWallpaperTypes()
|
||||
{
|
||||
return
|
||||
[
|
||||
var types = new List<SelectionOption>
|
||||
{
|
||||
new SelectionOption("Image", L("settings.wallpaper.type.image", "Image")),
|
||||
new SelectionOption("SolidColor", L("settings.wallpaper.type.solid_color", "Solid Color"))
|
||||
};
|
||||
|
||||
if (IsSystemWallpaperSupported)
|
||||
{
|
||||
types.Add(new SelectionOption("SystemWallpaper", L("settings.wallpaper.type.system", "System Wallpaper")));
|
||||
}
|
||||
|
||||
return types;
|
||||
}
|
||||
|
||||
private IReadOnlyList<SelectionOption> CreateRefreshIntervals()
|
||||
{
|
||||
return
|
||||
[
|
||||
new SelectionOption("30s", L("settings.wallpaper.refresh.30s", "30 seconds")),
|
||||
new SelectionOption("1m", L("settings.wallpaper.refresh.1m", "1 minute")),
|
||||
new SelectionOption("5m", L("settings.wallpaper.refresh.5m", "5 minutes")),
|
||||
new SelectionOption("10m", L("settings.wallpaper.refresh.10m", "10 minutes")),
|
||||
new SelectionOption("15m", L("settings.wallpaper.refresh.15m", "15 minutes")),
|
||||
new SelectionOption("30m", L("settings.wallpaper.refresh.30m", "30 minutes")),
|
||||
new SelectionOption("1h", L("settings.wallpaper.refresh.1h", "1 hour")),
|
||||
new SelectionOption("2h", L("settings.wallpaper.refresh.2h", "2 hours")),
|
||||
new SelectionOption("4h", L("settings.wallpaper.refresh.4h", "4 hours")),
|
||||
new SelectionOption("8h", L("settings.wallpaper.refresh.8h", "8 hours")),
|
||||
new SelectionOption("12h", L("settings.wallpaper.refresh.12h", "12 hours")),
|
||||
new SelectionOption("24h", L("settings.wallpaper.refresh.24h", "24 hours"))
|
||||
];
|
||||
}
|
||||
|
||||
@@ -289,6 +412,9 @@ public sealed partial class WallpaperSettingsPageViewModel : ViewModelBase
|
||||
WallpaperPlacementDescription = L("settings.wallpaper.placement_desc", "Adjust how the image fills the desktop.");
|
||||
ImportWallpaperButtonText = L("settings.wallpaper.pick_button", "Import Wallpaper");
|
||||
FilePickerTitle = L("filepicker.title", "Select wallpaper");
|
||||
SystemWallpaperLabel = L("settings.wallpaper.system.label", "System Wallpaper");
|
||||
RefreshIntervalLabel = L("settings.wallpaper.refresh_interval", "Refresh Interval");
|
||||
RefreshButtonTooltip = L("settings.wallpaper.refresh_now", "Refresh Now");
|
||||
}
|
||||
|
||||
private string L(string key, string fallback)
|
||||
|
||||
Reference in New Issue
Block a user