Files
BITKit/Src/Unity/Scripts/UX/Settings/UXSettings.cs

179 lines
4.8 KiB
C#
Raw Normal View History

2023-11-30 00:25:43 +08:00
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Cysharp.Threading.Tasks;
2025-03-24 14:42:40 +08:00
using Net.BITKit.Localization;
2025-02-24 23:02:43 +08:00
using Newtonsoft.Json;
using Unity.Mathematics;
2023-11-30 00:25:43 +08:00
using UnityEngine;
using UnityEngine.UIElements;
#if UNITY_EDITOR
using Types = FullscreenEditor.Types;
#endif
namespace BITKit.UX.Settings
{
2025-02-24 23:02:43 +08:00
public interface IUXSettings:IUXPanel{}
public class UXSettings<T,TValue> : UIToolkitSubPanel<T>,IUXSettings where T: IUXPanel
2023-11-30 00:25:43 +08:00
{
2025-03-24 14:42:40 +08:00
private readonly ILocalizationService _localizationService;
2025-02-24 23:02:43 +08:00
private readonly TValue _value;
private readonly IWrapper<TValue> _valueWrapper;
2025-03-24 14:42:40 +08:00
public UXSettings(IServiceProvider serviceProvider, IWrapper<TValue> valueWrapper, ILocalizationService localizationService) : base(serviceProvider)
2023-11-30 00:25:43 +08:00
{
2025-02-24 23:02:43 +08:00
_valueWrapper = valueWrapper;
2025-03-24 14:42:40 +08:00
_localizationService = localizationService;
2025-02-24 23:02:43 +08:00
_value = _valueWrapper.Value;
2023-11-30 00:25:43 +08:00
}
2025-08-03 02:28:50 +08:00
2025-02-24 23:02:43 +08:00
[UXBindPath("settings-container")]
private VisualElement _settingsContainer;
2023-11-30 00:25:43 +08:00
2025-08-03 02:28:50 +08:00
[UXBindPath("confirm-button",true)]
private Button _confirmButton;
2025-02-24 23:02:43 +08:00
private void Save()
2023-11-30 00:25:43 +08:00
{
2025-08-03 02:28:50 +08:00
if (_confirmButton is null)
{
_valueWrapper.Value = _value;
}
2023-11-30 00:25:43 +08:00
}
2025-08-03 02:28:50 +08:00
2025-02-24 23:02:43 +08:00
protected override void OnInitiated()
2023-11-30 00:25:43 +08:00
{
2025-02-24 23:02:43 +08:00
base.OnInitiated();
2025-08-03 02:28:50 +08:00
if (_confirmButton is not null)
{
_confirmButton.clicked += OnConfirmButtonOnclicked;
}
Rebuild();
}
private void OnConfirmButtonOnclicked()
{
_valueWrapper.Value = _value;
}
private void Rebuild()
{
2025-02-24 23:02:43 +08:00
_settingsContainer.Clear();
foreach (var propertyInfo in typeof(TValue).GetProperties())
2023-11-30 00:25:43 +08:00
{
2025-03-24 14:42:40 +08:00
if(propertyInfo.SetMethod is null)continue;
2025-02-24 23:02:43 +08:00
var name = propertyInfo.GetDisplayName();
var value = propertyInfo.GetValue(_valueWrapper.Value);
2025-03-24 14:42:40 +08:00
if (CreateVisualElement() is { } visualElement)
{
visualElement.viewDataKey = name;
visualElement.AddToClassList("localized");
}
VisualElement CreateVisualElement()
2023-11-30 00:25:43 +08:00
{
2025-03-24 14:42:40 +08:00
switch (propertyInfo.PropertyType)
2025-02-24 23:02:43 +08:00
{
2025-03-24 14:42:40 +08:00
case var type when type == typeof(bool):
2025-02-24 23:02:43 +08:00
{
2025-03-24 14:42:40 +08:00
var checkBox = _settingsContainer.Create<Toggle>();
checkBox.label = _localizationService.GetLocalizedString(name);
checkBox.SetValueWithoutNotify(value.As<bool>());
checkBox.RegisterValueChangedCallback(x =>
{
propertyInfo.SetValue(_value, x.newValue);
Save();
});
return checkBox;
}
break;
case var type when type == typeof(float):
2025-02-24 23:02:43 +08:00
{
2025-03-24 14:42:40 +08:00
var slider = _settingsContainer.Create<Slider>();
slider.label = _localizationService.GetLocalizedString(name);
slider.showInputField = true;
slider.showMixedValue = true;
2025-07-11 11:45:45 +08:00
slider.lowValue = 0.01f;
2025-03-24 14:42:40 +08:00
slider.highValue = 100;
slider.SetValueWithoutNotify(value.As<float>());
slider.RegisterValueChangedCallback(x =>
{
propertyInfo.SetValue(_value, x.newValue);
Save();
});
return slider;
}
break;
case var type when type == typeof(int):
2025-02-24 23:02:43 +08:00
{
2025-03-24 14:42:40 +08:00
var slider = _settingsContainer.Create<SliderInt>();
slider.label = _localizationService.GetLocalizedString(name);
slider.showInputField = true;
slider.showMixedValue = true;
slider.lowValue = 1;
slider.highValue = 100;
slider.SetValueWithoutNotify(value.As<int>());
slider.RegisterValueChangedCallback(x =>
{
propertyInfo.SetValue(_value, x.newValue);
Save();
});
return slider;
}
break;
case var type when type == typeof(string):
2025-02-24 23:02:43 +08:00
{
2025-03-24 14:42:40 +08:00
var textField = _settingsContainer.Create<TextField>();
textField.label = _localizationService.GetLocalizedString(name);
textField.SetValueWithoutNotify(value.As<string>());
textField.RegisterValueChangedCallback(x =>
{
propertyInfo.SetValue(_value, x.newValue);
Save();
});
return textField;
}
break;
case var type when type.IsEnum:
2025-02-24 23:02:43 +08:00
{
2025-03-24 14:42:40 +08:00
var enumField = _settingsContainer.Create<EnumField>();
enumField.label = _localizationService.GetLocalizedString(name);
enumField.Init(value as Enum);
enumField.SetValueWithoutNotify(value as Enum);
enumField.RegisterValueChangedCallback(x =>
{
propertyInfo.SetValue(_value, x.newValue);
Save();
});
return enumField;
}
break;
2025-08-03 02:28:50 +08:00
case var type when type == typeof(int2):
{
var vector2Field = _settingsContainer.Create<Vector2Field>();
vector2Field.label = _localizationService.GetLocalizedString(name);
var int2Value = value.As<int2>();
vector2Field.value = new Vector2(int2Value.x, int2Value.y);
vector2Field.RegisterValueChangedCallback(x =>
{
propertyInfo.SetValue(_value, new int2((int)x.newValue.x, (int)x.newValue.y));
Save();
});
return vector2Field;
}
2025-02-24 23:02:43 +08:00
}
2025-03-24 14:42:40 +08:00
return null;
2023-11-30 00:25:43 +08:00
}
}
}
2025-08-03 02:28:50 +08:00
2023-11-30 00:25:43 +08:00
}
}