Files
Fishing2/Assets/Scripts/Model/Common/Services/Settings/Settings.cs
2025-08-29 09:11:08 +08:00

120 lines
3.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Linq;
using NBF.Setting;
namespace NBF
{
public class Settings : MonoService<Settings>, ISettings
{
private readonly Dictionary<string, List<OptionBase>> _dictionary = new Dictionary<string, List<OptionBase>>();
protected override void OnAwake()
{
List<OptionBase> list = new List<OptionBase>();
var options = Reflection.GetAllNonAbstractDerivedTypes<OptionBase>();
foreach (var option in options)
{
var settingOption = Activator.CreateInstance(option);
if (settingOption is OptionBase optionSetting)
{
list.Add(optionSetting);
optionSetting.Initialize(this);
}
}
list.SortBySortAttribute();
AddRangeToTab(list);
}
public void LoadAllSettings()
{
foreach (var list in _dictionary.Values)
{
foreach (var option in list)
{
option.Load();
}
}
}
/// <summary>
/// 是否有未保存的设置
/// </summary>
public bool HaveNotAppleSettings()
{
return _dictionary.Values.SelectMany(list => list).Any(option => option.HaveNotApple());
}
#region
public T GetSettingOption<T>() where T : OptionBase
{
foreach (var option in _dictionary.Values.SelectMany(options => options))
{
if (option is T optionSetting)
{
return optionSetting;
}
}
return null;
}
/// <summary>
/// 获取指定 Tab 的所有 OptionBase
/// </summary>
public List<OptionBase> GetOptionsByTab(string group)
{
if (string.IsNullOrEmpty(group))
{
throw new ArgumentException("Tab name cannot be null or empty.");
}
return _dictionary.TryGetValue(group, out var options) ? options : new List<OptionBase>();
}
/// <summary>
/// 获取所有 Tab 名字列表
/// </summary>
public IEnumerable<string> GetAllTabs()
{
return _dictionary.Keys;
}
/// <summary>
/// 将 OptionBase 按 Tab 分类存入字典
/// </summary>
private void AddToTab(OptionBase option)
{
if (option == null) return;
if (string.IsNullOrEmpty(option.Tab)) return;
// 如果字典中没有该 Tab则新建一个 List 并加入字典
if (!_dictionary.ContainsKey(option.Tab))
{
_dictionary[option.Tab] = new List<OptionBase>();
}
// 将 Option 添加到对应的 Tab List 中
_dictionary[option.Tab].Add(option);
}
/// <summary>
/// 批量添加 OptionBase 到字典
/// </summary>
private void AddRangeToTab(IEnumerable<OptionBase> options)
{
if (options == null) return;
foreach (var option in options)
{
AddToTab(option);
}
}
#endregion
}
}