Files
Cielonos/Packages/io.continis.subassets/Editor/Settings/SubAssetsToolboxSettingsProvider.cs
SoulliesOfficial f26f9fd374 爆更
2026-03-20 12:07:44 -04:00

118 lines
4.4 KiB
C#

using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine.UIElements;
namespace SubAssetsToolbox.Editor
{
internal static class SubAssetsToolboxSettingsProvider
{
private const string SettingsPath = "Project/SubAssets Toolbox";
private const string UxmlPath = "Packages/io.continis.subassets/UI/UIToolkit/ProjectSettings.uxml";
private static List<string> _extensions;
private static ListView _listView;
private static EnumField _redirectionModeField;
private static Button _resetFileTypesBtn;
[SettingsProvider]
private static SettingsProvider CreateSettingsProvider()
{
return new SettingsProvider(SettingsPath, SettingsScope.Project)
{
activateHandler = (_, rootElement) => CreateUI(rootElement),
keywords = new[] { "subassets", "sub-assets", "redirect", "extensions" }
};
}
private static void SyncToSetting()
{
SubAssetsToolboxSettings.PatchExtensions.SetValue(_extensions.ToArray(), true);
}
private static void CreateUI(VisualElement root)
{
ReferencePatchingMode currentMode = SubAssetsToolboxSettings.PatchReferences.value;
bool redirectionIsEnabled = currentMode != ReferencePatchingMode.Disabled;
_extensions = new List<string>(SubAssetsToolboxSettings.PatchExtensions.value);
VisualTreeAsset visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>(UxmlPath);
VisualElement template = visualTree.Instantiate();
template.style.flexGrow = 1f;
_redirectionModeField = template.Q<EnumField>("RedirectionModeField");
_redirectionModeField.Init(ReferencePatchingMode.Disabled);
_redirectionModeField.SetValueWithoutNotify(currentMode);
_redirectionModeField.RegisterValueChangedCallback(OnRedirectionModeChanged);
_listView = template.Q<ListView>("ExtensionsList");
_listView.itemsSource = _extensions;
_listView.SetEnabled(redirectionIsEnabled);
_listView.makeItem = MakeItem;
_listView.bindItem = BindItem;
_listView.unbindItem = UnbindItem;
_listView.itemsAdded += indices =>
{
foreach (int i in indices)
_extensions[i] = "ext";
_listView.RefreshItems();
SyncToSetting();
};
_listView.itemsRemoved += _ => SyncToSetting();
_listView.itemIndexChanged += (_, _) => SyncToSetting();
_resetFileTypesBtn = template.Q<Button>("ResetBtn");
_resetFileTypesBtn.SetEnabled(redirectionIsEnabled);
_resetFileTypesBtn.clicked += ResetExtensionsToDefaults;
root.Add(template);
}
private static void OnRedirectionModeChanged(ChangeEvent<Enum> evt)
{
ReferencePatchingMode mode = (ReferencePatchingMode)evt.newValue;
SubAssetsToolboxSettings.PatchReferences.SetValue(mode, true);
bool enabled = mode != ReferencePatchingMode.Disabled;
_listView.SetEnabled(enabled);
_resetFileTypesBtn.SetEnabled(enabled);
}
private static void ResetExtensionsToDefaults()
{
_extensions.Clear();
_extensions.AddRange(SubAssetsToolboxSettings.DefaultExtensionsToScan);
_listView.RefreshItems();
SyncToSetting();
}
private static VisualElement MakeItem()
{
return new TextField();
}
private static void BindItem(VisualElement element, int index)
{
TextField field = (TextField)element;
field.SetValueWithoutNotify(_extensions[index]);
field.userData = index;
field.RegisterValueChangedCallback(OnExtensionChanged);
}
private static void UnbindItem(VisualElement element, int index)
{
TextField field = (TextField)element;
field.UnregisterValueChangedCallback(OnExtensionChanged);
}
private static void OnExtensionChanged(ChangeEvent<string> evt)
{
TextField field = (TextField)evt.target;
int index = (int)field.userData;
_extensions[index] = evt.newValue;
SyncToSetting();
}
}
}