mirror of
https://github.com/wwiinnddyy/LanMountainDesktop.git
synced 2026-06-20 23:54:26 +08:00
Introduce IPC wire-format appearance DTOs (PluginIsolation.Contracts) and clarify they are distinct from the runtime PluginSdk snapshot. Update PluginSdk comments to document the runtime-facing snapshot shape. Change ComponentColorSchemeHelper to use the HostMaterialColorProvider and add an overload that accepts a MaterialColorSnapshot. Add new services and pipelines (MaterialColorService, MaterialSurfaceService, WindowMaterialService, WallpaperColorPipeline) and refactor AppearanceThemeService to depend on MaterialColorService while removing legacy internal implementations. Add multiple unit tests (ComponentColorSchemeHelper, PluginAppearanceBoundary, SettingsCatalogService, WallpaperSettingsPageViewModel) and update localization resources with new material_color and wallpaper keys.
126 lines
4.7 KiB
C#
126 lines
4.7 KiB
C#
using System.Collections.Generic;
|
|
using Avalonia;
|
|
using Avalonia.Media;
|
|
using LanMountainDesktop.ComponentSystem;
|
|
using LanMountainDesktop.Models;
|
|
using LanMountainDesktop.Services;
|
|
using LanMountainDesktop.Shared.Contracts;
|
|
using Xunit;
|
|
|
|
namespace LanMountainDesktop.Tests;
|
|
|
|
public sealed class ComponentColorSchemeHelperTests
|
|
{
|
|
[Fact]
|
|
public void GetCurrentGlobalThemeColorMode_UsesMaterialColorSnapshot()
|
|
{
|
|
var snapshot = CreateSnapshot(ThemeAppearanceValues.ColorModeWallpaperMonet);
|
|
|
|
var mode = ComponentColorSchemeHelper.GetCurrentGlobalThemeColorMode(snapshot);
|
|
|
|
Assert.Equal(ThemeAppearanceValues.ColorModeWallpaperMonet, mode);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(ThemeAppearanceValues.ColorSchemeNative, ThemeAppearanceValues.ColorModeWallpaperMonet, false)]
|
|
[InlineData(ThemeAppearanceValues.ColorSchemeFollowSystem, ThemeAppearanceValues.ColorModeDefaultNeutral, true)]
|
|
[InlineData(null, ThemeAppearanceValues.ColorModeDefaultNeutral, false)]
|
|
public void ShouldUseMonetColor_FollowsExpectedRules(
|
|
string? componentColorScheme,
|
|
string globalThemeColorMode,
|
|
bool expected)
|
|
{
|
|
var shouldUseMonetColor = ComponentColorSchemeHelper.ShouldUseMonetColor(componentColorScheme, globalThemeColorMode);
|
|
|
|
Assert.Equal(expected, shouldUseMonetColor);
|
|
}
|
|
|
|
private static MaterialColorSnapshot CreateSnapshot(string themeColorMode)
|
|
{
|
|
var seed = Color.Parse("#FF123456");
|
|
var accent = Color.Parse("#FF214365");
|
|
var palette = new MaterialColorPalette(
|
|
Color.Parse("#FF315577"),
|
|
Color.Parse("#FF557799"),
|
|
accent,
|
|
Color.Parse("#FFFFFFFF"),
|
|
Color.Parse("#FF5F7F9F"),
|
|
Color.Parse("#FF7F9FBF"),
|
|
Color.Parse("#FF9FBFDF"),
|
|
Color.Parse("#FF17314B"),
|
|
Color.Parse("#FF102840"),
|
|
Color.Parse("#FF082038"),
|
|
Color.Parse("#FF0B1118"),
|
|
Color.Parse("#FF141C24"),
|
|
Color.Parse("#FF1C2630"),
|
|
Color.Parse("#FFF5F7FA"),
|
|
Color.Parse("#FFC8D0DA"),
|
|
Color.Parse("#FF9EA8B4"),
|
|
Color.Parse("#FF91B8E8"),
|
|
Color.Parse("#FFF5F7FA"),
|
|
Color.Parse("#FFFFFFFF"),
|
|
Color.Parse("#FF9FBFDF"),
|
|
Color.Parse("#33141C24"),
|
|
Color.Parse("#441C2630"),
|
|
Color.Parse("#55315577"),
|
|
Color.Parse("#FF315577"),
|
|
Color.Parse("#88557799"),
|
|
Color.Parse("#667F9FBF"));
|
|
var monetPalette = new MonetPalette(
|
|
[seed],
|
|
seed,
|
|
palette.Primary,
|
|
palette.Secondary,
|
|
Color.Parse("#FF775577"),
|
|
Color.Parse("#FF202830"),
|
|
Color.Parse("#FF26313B"));
|
|
var surfaces = new Dictionary<MaterialSurfaceRole, MaterialSurfaceSnapshot>
|
|
{
|
|
[MaterialSurfaceRole.WindowBackground] = new(
|
|
MaterialSurfaceRole.WindowBackground,
|
|
Color.Parse("#FF101820"),
|
|
Color.Parse("#33557799"),
|
|
18,
|
|
0.92),
|
|
[MaterialSurfaceRole.OverlayPanel] = new(
|
|
MaterialSurfaceRole.OverlayPanel,
|
|
Color.Parse("#FF202A34"),
|
|
Color.Parse("#556688AA"),
|
|
24,
|
|
0.88)
|
|
};
|
|
|
|
return new MaterialColorSnapshot(
|
|
IsNightMode: true,
|
|
ThemeColorMode: themeColorMode,
|
|
ThemeWallpaperColorSource: ThemeAppearanceValues.WallpaperColorSourceAuto,
|
|
ColorSourceKind: MaterialColorSourceKind.CustomSeed,
|
|
ResolvedSeedSource: "user_color",
|
|
CornerRadiusTokens: new AppearanceCornerRadiusTokens(
|
|
new CornerRadius(2),
|
|
new CornerRadius(4),
|
|
new CornerRadius(6),
|
|
new CornerRadius(8),
|
|
new CornerRadius(10),
|
|
new CornerRadius(12),
|
|
new CornerRadius(14),
|
|
new CornerRadius(8)),
|
|
UserThemeColor: seed.ToString(),
|
|
SelectedWallpaperSeed: seed.ToString(),
|
|
EffectiveSeedColor: seed,
|
|
AccentColor: accent,
|
|
MonetPalette: monetPalette,
|
|
Palette: palette,
|
|
WallpaperSeedCandidates: [seed],
|
|
SystemMaterialMode: ThemeAppearanceValues.MaterialMica,
|
|
AvailableSystemMaterialModes: [ThemeAppearanceValues.MaterialAuto, ThemeAppearanceValues.MaterialMica],
|
|
CanChangeSystemMaterial: true,
|
|
UseSystemChrome: false,
|
|
ResolvedWallpaperPath: @"C:\wallpaper.png",
|
|
UseNativeWallpaperChangeEvents: true,
|
|
NativeWallpaperChangeEventsActive: true,
|
|
WallpaperPollingActive: true,
|
|
Surfaces: surfaces);
|
|
}
|
|
}
|