Files
LanMountainDesktop/LanMountainDesktop.PluginSdk/PluginAppearanceContext.cs

90 lines
2.9 KiB
C#
Raw Normal View History

2026-03-20 22:37:37 +08:00
namespace LanMountainDesktop.PluginSdk;
2026-04-12 13:52:52 +08:00
/// <summary>
/// 插件外观上下文实现,提供主题、圆角等外观资源的访问和变更通知。
/// </summary>
2026-03-20 22:37:37 +08:00
public sealed class PluginAppearanceContext : IPluginAppearanceContext
{
2026-04-12 13:52:52 +08:00
private PluginAppearanceSnapshot _snapshot;
/// <summary>
/// 创建插件外观上下文实例。
/// </summary>
/// <param name="snapshot">初始外观快照</param>
2026-03-20 22:37:37 +08:00
public PluginAppearanceContext(PluginAppearanceSnapshot snapshot)
{
ArgumentNullException.ThrowIfNull(snapshot);
ArgumentNullException.ThrowIfNull(snapshot.CornerRadiusTokens);
2026-04-12 13:52:52 +08:00
_snapshot = snapshot with
2026-03-20 22:37:37 +08:00
{
ThemeVariant = string.IsNullOrWhiteSpace(snapshot.ThemeVariant)
? "Unknown"
: snapshot.ThemeVariant.Trim()
};
}
2026-04-12 13:52:52 +08:00
/// <inheritdoc />
public PluginAppearanceSnapshot Snapshot => _snapshot;
/// <inheritdoc />
public event EventHandler<AppearanceChangedEvent>? Changed;
/// <summary>
/// 更新外观快照并触发变更事件。
/// 此方法由宿主调用,用于在主题、圆角等外观属性变化时通知插件。
/// </summary>
/// <param name="newSnapshot">新的外观快照</param>
/// <param name="changedProperties">变更的属性集合</param>
public void UpdateSnapshot(PluginAppearanceSnapshot newSnapshot, IReadOnlyCollection<AppearanceProperty> changedProperties)
{
ArgumentNullException.ThrowIfNull(newSnapshot);
ArgumentNullException.ThrowIfNull(changedProperties);
_snapshot = newSnapshot with
{
ThemeVariant = string.IsNullOrWhiteSpace(newSnapshot.ThemeVariant)
? "Unknown"
: newSnapshot.ThemeVariant.Trim()
};
if (changedProperties.Count > 0)
{
Changed?.Invoke(this, new AppearanceChangedEvent(_snapshot, changedProperties));
}
}
2026-03-20 22:37:37 +08:00
2026-04-12 13:52:52 +08:00
/// <inheritdoc />
2026-03-20 22:37:37 +08:00
public double ResolveScaledCornerRadius(double baseRadius, double? minimum = null, double? maximum = null)
{
2026-04-08 00:55:10 +08:00
var value = Math.Max(0d, baseRadius);
if (!minimum.HasValue && !maximum.HasValue)
{
return value;
}
var clampedMin = minimum ?? value;
var clampedMax = maximum ?? value;
return Math.Clamp(value, clampedMin, clampedMax);
2026-03-20 22:37:37 +08:00
}
2026-04-12 13:52:52 +08:00
/// <inheritdoc />
2026-03-20 22:37:37 +08:00
public double ResolveCornerRadius(PluginCornerRadiusPreset preset, double? minimum = null, double? maximum = null)
{
2026-04-12 13:52:52 +08:00
var resolved = Math.Max(0d, _snapshot.CornerRadiusTokens.Get(preset));
2026-03-20 22:37:37 +08:00
if (!minimum.HasValue && !maximum.HasValue)
{
return resolved;
}
2026-04-12 13:52:52 +08:00
var clampedMin = minimum ?? 0d;
var clampedMax = maximum ?? double.MaxValue;
2026-03-20 22:37:37 +08:00
if (clampedMin > clampedMax)
{
(clampedMin, clampedMax) = (clampedMax, clampedMin);
}
return Math.Clamp(resolved, clampedMin, clampedMax);
}
}