118 lines
4.4 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|