diff --git a/GFramework.Game.Abstractions/setting/ISettingsPersistence.cs b/GFramework.Game.Abstractions/setting/ISettingsPersistence.cs index 37531e7..9e3074b 100644 --- a/GFramework.Game.Abstractions/setting/ISettingsPersistence.cs +++ b/GFramework.Game.Abstractions/setting/ISettingsPersistence.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using GFramework.Core.Abstractions.utility; @@ -40,4 +40,14 @@ public interface ISettingsPersistence : IContextUtility /// 加载所有已知类型的设置数据 /// Task> LoadAllAsync(IEnumerable knownTypes); + + /// + /// 重置指定类型的设置数据为默认值 + /// + Task ResetAsync() where T : class, ISettingsData, new(); + + /// + /// 重置所有设置数据为默认值 + /// + Task ResetAllAsync(); } \ No newline at end of file diff --git a/GFramework.Game/setting/SettingsPersistence.cs b/GFramework.Game/setting/SettingsPersistence.cs index a2abf95..c26cea4 100644 --- a/GFramework.Game/setting/SettingsPersistence.cs +++ b/GFramework.Game/setting/SettingsPersistence.cs @@ -1,7 +1,8 @@ -using GFramework.Core.Abstractions.storage; +using GFramework.Core.Abstractions.storage; using GFramework.Core.extensions; using GFramework.Core.utility; using GFramework.Game.Abstractions.setting; +using GFramework.Game.setting.events; namespace GFramework.Game.setting; @@ -23,10 +24,14 @@ public class SettingsPersistence : AbstractContextUtility, ISettingsPersistence if (await _storage.ExistsAsync(key)) { - return await _storage.ReadAsync(key); + var result = await _storage.ReadAsync(key); + this.SendEvent(new SettingsLoadedEvent(result)); + return result; } - return new T(); + var newSettings = new T(); + this.SendEvent(new SettingsLoadedEvent(newSettings)); + return newSettings; } /// @@ -38,6 +43,7 @@ public class SettingsPersistence : AbstractContextUtility, ISettingsPersistence { var key = GetKey(); await _storage.WriteAsync(key, section); + this.SendEvent(new SettingsSavedEvent(section)); } /// @@ -59,6 +65,7 @@ public class SettingsPersistence : AbstractContextUtility, ISettingsPersistence { var key = GetKey(); _storage.Delete(key); + this.SendEvent(new SettingsDeletedEvent(typeof(T))); await Task.CompletedTask; } @@ -68,12 +75,15 @@ public class SettingsPersistence : AbstractContextUtility, ISettingsPersistence /// 包含所有设置数据的可枚举集合 public async Task SaveAllAsync(IEnumerable allData) { - foreach (var data in allData) + var dataList = allData.ToList(); + foreach (var data in dataList) { var type = data.GetType(); var key = GetKey(type); await _storage.WriteAsync(key, data); } + + this.SendEvent(new SettingsBatchSavedEvent(dataList)); } /// @@ -84,6 +94,7 @@ public class SettingsPersistence : AbstractContextUtility, ISettingsPersistence public async Task> LoadAllAsync(IEnumerable knownTypes) { var result = new Dictionary(); + var allSettings = new List(); foreach (var type in knownTypes) { @@ -100,11 +111,57 @@ public class SettingsPersistence : AbstractContextUtility, ISettingsPersistence var loaded = (ISettingsData)((dynamic)task).Result; result[type] = loaded; + allSettings.Add(loaded); } + this.SendEvent(new SettingsAllLoadedEvent(allSettings)); return result; } + public async Task ResetAsync() where T : class, ISettingsData, new() + { + var type = typeof(T); + var key = GetKey(type); + + T oldSettings; + if (await _storage.ExistsAsync(key)) + { + oldSettings = await _storage.ReadAsync(key); + } + else + { + oldSettings = new T(); + } + + var newSettings = new T(); + await _storage.WriteAsync(key, newSettings); + + this.SendEvent(new SettingsResetEvent(oldSettings, newSettings)); + return newSettings; + } + + public async Task ResetAllAsync() + { + var knownTypes = new List(); + + var audioSettings = await LoadAllAsync(knownTypes); + var allNewSettings = new List(); + + foreach (var kvp in audioSettings) + { + var type = kvp.Key; + var key = GetKey(type); + + var newSettings = Activator.CreateInstance(type) as ISettingsSection; + if (newSettings is null) continue; + + await _storage.WriteAsync(key, newSettings); + allNewSettings.Add(newSettings); + } + + this.SendEvent(new SettingsResetAllEvent(allNewSettings)); + } + protected override void OnInit() { _storage = this.GetUtility()!; diff --git a/GFramework.Game/setting/SettingsSystem.cs b/GFramework.Game/setting/SettingsSystem.cs index 3c07c9d..70ba895 100644 --- a/GFramework.Game/setting/SettingsSystem.cs +++ b/GFramework.Game/setting/SettingsSystem.cs @@ -1,6 +1,7 @@ -using GFramework.Core.extensions; +using GFramework.Core.extensions; using GFramework.Core.system; using GFramework.Game.Abstractions.setting; +using GFramework.Game.setting.events; namespace GFramework.Game.setting; @@ -79,11 +80,22 @@ public class SettingsSystem : AbstractSystem, ISettingsSystem /// 尝试应用可应用的设置配置 /// /// 设置配置对象 - private static void TryApply(ISettingsSection section) + private void TryApply(ISettingsSection section) { if (section is IApplyAbleSettings applyable) { - applyable.Apply(); + this.SendEvent(new SettingsApplyingEvent(section)); + + try + { + applyable.Apply(); + this.SendEvent(new SettingsAppliedEvent(section, true)); + } + catch (Exception ex) + { + this.SendEvent(new SettingsAppliedEvent(section, false, ex)); + throw; + } } } } \ No newline at end of file diff --git a/GFramework.Game/setting/events/SettingsDeletedEvent.cs b/GFramework.Game/setting/events/SettingsDeletedEvent.cs new file mode 100644 index 0000000..8bde8be --- /dev/null +++ b/GFramework.Game/setting/events/SettingsDeletedEvent.cs @@ -0,0 +1,24 @@ +using GFramework.Game.Abstractions.setting; + +namespace GFramework.Game.setting.events; + +/// +/// 表示设置删除事件 +/// +public class SettingsDeletedEvent(Type settingsType) : ISettingsChangedEvent +{ + /// + /// 获取被删除的设置类型 + /// + public Type SettingsType { get; } = settingsType; + + /// + /// 获取设置实例,删除事件中返回 null + /// + public ISettingsSection Settings => null!; + + /// + /// 获取删除时间 + /// + public DateTime ChangedAt { get; } = DateTime.UtcNow; +} \ No newline at end of file diff --git a/GFramework.Game/setting/events/SettingsResetAllEvent.cs b/GFramework.Game/setting/events/SettingsResetAllEvent.cs new file mode 100644 index 0000000..5d7e24a --- /dev/null +++ b/GFramework.Game/setting/events/SettingsResetAllEvent.cs @@ -0,0 +1,30 @@ +using GFramework.Game.Abstractions.setting; + +namespace GFramework.Game.setting.events; + +/// +/// 表示所有设置重置完成事件 +/// +/// 重置后的所有设置 +public class SettingsResetAllEvent(IEnumerable newSettings) : ISettingsChangedEvent +{ + /// + /// 获取重置后的所有设置 + /// + public IReadOnlyCollection NewSettings { get; } = newSettings.ToList(); + + /// + /// 获取设置类型,固定返回 ISettingsSection + /// + public Type SettingsType => typeof(ISettingsSection); + + /// + /// 获取设置实例,批量事件中返回 null + /// + public ISettingsSection Settings => null!; + + /// + /// 获取重置时间 + /// + public DateTime ChangedAt { get; } = DateTime.UtcNow; +} \ No newline at end of file diff --git a/GFramework.Game/setting/events/SettingsResetEvent.cs b/GFramework.Game/setting/events/SettingsResetEvent.cs new file mode 100644 index 0000000..ae4e40b --- /dev/null +++ b/GFramework.Game/setting/events/SettingsResetEvent.cs @@ -0,0 +1,52 @@ +using GFramework.Game.Abstractions.setting; + +namespace GFramework.Game.setting.events; + +/// +/// 表示设置重置事件 +/// +/// 设置节类型 +public class SettingsResetEvent : ISettingsChangedEvent + where T : ISettingsSection +{ + /// + /// 构造函数 + /// + /// 重置前的设置 + /// 重置后的新设置 + public SettingsResetEvent(T oldSettings, T newSettings) + { + OldSettings = oldSettings; + NewSettings = newSettings; + } + + /// + /// 获取重置前的设置 + /// + public T OldSettings { get; } + + /// + /// 获取重置后的新设置 + /// + public T NewSettings { get; } + + /// + /// 获取类型化的设置实例(返回新设置) + /// + public T TypedSettings => NewSettings; + + /// + /// 获取设置类型 + /// + public Type SettingsType => typeof(T); + + /// + /// 获取设置实例 + /// + public ISettingsSection Settings => NewSettings; + + /// + /// 获取重置时间 + /// + public DateTime ChangedAt { get; } = DateTime.UtcNow; +} \ No newline at end of file