using Array = Godot.Collections.Array; namespace GFramework.Godot.Text; /// /// 负责把配置、开关和注册表装配为宿主标签的实际效果集合。 /// 该控制器是组合式扩展的装配中心,使 保持轻量。 /// internal sealed class RichTextEffectsController { private readonly Func _animatedEffectsEnabledAccessor; private readonly Func _frameworkEffectsEnabledAccessor; private readonly IRichTextEffectHost _host; private readonly Func _profileAccessor; private readonly Func _registryAccessor; /// /// 初始化控制器实例。 /// /// 目标富文本标签。 /// 当前效果注册表访问器。 /// 当前配置访问器。 /// 框架效果总开关访问器。 /// 字符动画开关访问器。 /// /// 当 、 /// /// 为 时抛出。 /// public RichTextEffectsController( IRichTextEffectHost host, Func registryAccessor, Func profileAccessor, Func frameworkEffectsEnabledAccessor, Func animatedEffectsEnabledAccessor) { _host = host ?? throw new ArgumentNullException(nameof(host)); _registryAccessor = registryAccessor ?? throw new ArgumentNullException(nameof(registryAccessor)); _profileAccessor = profileAccessor ?? throw new ArgumentNullException(nameof(profileAccessor)); _frameworkEffectsEnabledAccessor = frameworkEffectsEnabledAccessor ?? throw new ArgumentNullException(nameof(frameworkEffectsEnabledAccessor)); _animatedEffectsEnabledAccessor = animatedEffectsEnabledAccessor ?? throw new ArgumentNullException(nameof(animatedEffectsEnabledAccessor)); } /// /// 初始化并立即刷新宿主标签的效果集合。 /// public void Initialize() { RefreshEffects(); } /// /// 根据当前配置和开关重建宿主标签上的 。 /// public void RefreshEffects() { var frameworkEffectsEnabled = _frameworkEffectsEnabledAccessor(); if (frameworkEffectsEnabled && !_host.BbcodeEnabled) { _host.BbcodeEnabled = true; } if (!frameworkEffectsEnabled) { _host.CustomEffects = new Array(); return; } var profile = _profileAccessor() ?? RichTextProfile.CreateBuiltInDefault(); var registry = _registryAccessor() ?? throw new InvalidOperationException("The rich text effect registry accessor returned null."); var effects = registry.CreateEffects(profile, _animatedEffectsEnabledAccessor()); var customEffects = new Array(); foreach (var effect in effects) { customEffects.Add(effect); } _host.CustomEffects = customEffects; } }