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