BITFALL/Assets/GSpawn - Level Designer/Scripts/Level Design/Int Pattern/IntPatternDbUI.cs

268 lines
10 KiB
C#
Raw Normal View History

2024-01-27 04:09:57 +08:00
#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;
using UnityEngine.UIElements;
using UnityEditor.UIElements;
using System;
using System.Collections.Generic;
namespace GSpawn
{
public class IntPatternDbUI : PluginUI
{
private const float _minFontSize = 10.0f;
private const float _maxFontSize = 30.0f;
private VisualElement _viewSplitter;
private TextField _codeField;
private TextField _newPatternNameField;
private Button _compileBtn;
[SerializeField]
private float _codeFontSize = 14.0f;
[SerializeField]
private ListViewState _patternViewState;
private ListView<UIIntPatternItem, IntPattern> _patternView;
private EntitySearchField _patternSearchField;
[NonSerialized]
private List<IntPattern> _patternBuffer = new List<IntPattern>();
public float codeFontSize { get { return _codeFontSize; } set { UndoEx.record(this); _codeFontSize = Mathf.Max(_minFontSize, value); } }
public static IntPatternDbUI instance { get { return IntPatternDb.instance.ui; } }
protected override void onRefresh()
{
if (_patternView != null) _patternView.refreshUI();
}
protected override void onBuild()
{
contentContainer.style.flexGrow = 1.0f;
createSearchToolbar();
_viewSplitter = new VisualElement();
_viewSplitter.style.flexGrow = 1.0f;
_viewSplitter.style.flexDirection = FlexDirection.Row;
contentContainer.Add(_viewSplitter);
createPatternView();
populatePatternView();
createCodeArea();
createBottomToolbar();
}
private void createSearchToolbar()
{
var toolbar = new Toolbar();
toolbar.style.flexShrink = 0.0f;
contentContainer.Add(toolbar);
_patternSearchField = new EntitySearchField(toolbar, (entityNames) =>
{ IntPatternDb.instance.getPatternNames(entityNames, null); },
(name) => { _patternView.filterItems(filterPattern); });
}
private void createPatternView()
{
_patternView = new ListView<UIIntPatternItem, IntPattern>(_patternViewState, _viewSplitter);
_patternView.canDelete = true;
_patternView.canRenameItems = true;
_patternView.canMultiSelect = true;
_patternView.selectedItemsWillBeDeleted += onSelectedPatternItemsWillBeDeleted;
_patternView.selectionChanged += onPatternSelectionChanged;
_patternView.selectionDeleted += onPatternSelectionDeleted;
_patternView.canDeleteItem += onCanDeleteItem;
_patternView.style.setBorderWidth(1.0f);
_patternView.style.setBorderColor(UIValues.listViewBorderColor);
_patternView.style.width = 200.0f;
_patternView.style.flexGrow = 0.0f;
}
private void createCodeArea()
{
_codeField = new TextField();
_viewSplitter.Add(_codeField);
_codeField.multiline = true;
_codeField.style.flexGrow = 1.0f;
_codeField.style.fontSize = _codeFontSize;
updateCodeField();
}
private void createBottomToolbar()
{
var bottomToolbar = new Toolbar();
bottomToolbar.style.flexShrink = 0.0f;
contentContainer.Add(bottomToolbar);
var createPatternButton = UI.createSmallCreateNewToolbarButton(bottomToolbar);
createPatternButton.clicked += () => { createNewPattern(); };
createPatternButton.tooltip = "Create a new pattern with the specified name.";
_newPatternNameField = UI.createToolbarTextField(bottomToolbar);
_newPatternNameField.style.flexGrow = 0.0f;
_newPatternNameField.style.width = _patternView.style.width.value.value - 22.0f;
var codeFontSizeSlider = UI.createSlider("_codeFontSize", serializedObject, string.Empty, "Code font size [" + codeFontSize + "]", _minFontSize, _maxFontSize, bottomToolbar);
codeFontSizeSlider.style.width = 80.0f;
codeFontSizeSlider.RegisterValueChangedCallback
((p) =>
{
_codeField.style.fontSize = _codeFontSize;
codeFontSizeSlider.tooltip = "Code font size [" + codeFontSize + "]";
});
VisualElement indent = UI.createHorizontalSpacer(bottomToolbar);
bottomToolbar.Add(indent);
_compileBtn = new Button();
_compileBtn.text = "Compile";
_compileBtn.tooltip = "Compile the selected pattern.";
bottomToolbar.Add(_compileBtn);
_compileBtn.clicked += () =>
{
var selectedPatterns = new List<IntPattern>();
_patternView.getSelectedItemData(selectedPatterns);
if (selectedPatterns.Count == 1)
{
if (selectedPatterns[0].compile(_codeField.text))
EditorUtility.DisplayDialog("Pattern Compilation Status", "Pattern compiled successfully.", "OK");
else EditorUtility.DisplayDialog("Pattern Compilation Status", "Pattern failed to compile. Please check the Console window.", "OK");
}
};
updateCompileButton();
}
private void createNewPattern()
{
var newPattern = IntPatternDb.instance.createPattern(_newPatternNameField.text);
if (newPattern != null)
{
_patternView.setAllItemsSelected(false, false, false);
PluginGuid newPatternId = _patternView.addItem(newPattern, true);
_patternView.setItemSelected(newPatternId, true, false);
_patternView.scheduleScrollToItem(newPatternId);
updateCodeField();
updateCompileButton();
}
}
private void populatePatternView()
{
if (_patternView == null) return;
_patternSearchField.refreshMatchNames();
_patternView.onBeginBuild();
IntPatternDb.instance.getPatterns(_patternBuffer);
foreach (var pattern in _patternBuffer)
_patternView.addItem(pattern, filterPattern(pattern));
_patternView.onEndBuild();
}
private void onSelectedPatternItemsWillBeDeleted(ListView<UIIntPatternItem, IntPattern> listView, List<PluginGuid> itemIds)
{
var patterns = new List<IntPattern>();
_patternView.getItemData(itemIds, patterns);
SegmentsObjectSpawnSettingsProfileDb.instance.onIntPatternsWillBeDeleted(patterns);
ObjectSpawn.instance.tileRuleObjectSpawn.settings.onIntPatternsWillBeDeleted(patterns);
IntPatternDb.instance.deletePatterns(patterns);
updateCodeField();
updateCompileButton();
}
private void onPatternSelectionChanged(ListView<UIIntPatternItem, IntPattern> listView)
{
updateCodeField();
updateCompileButton();
}
private void onPatternSelectionDeleted(ListView<UIIntPatternItem, IntPattern> listView)
{
updateCodeField();
updateCompileButton();
PluginInspectorUI.instance.refresh();
}
private bool onCanDeleteItem(PluginGuid id)
{
return id != IntPatternDb.instance.defaultPattern.guid;
}
private bool filterPattern(IntPattern pattern)
{
if (!_patternSearchField.matchName(pattern.patternName)) return false;
return true;
}
private void updateCodeField()
{
if (_patternView == null || _codeField == null) return;
if (IntPatternDb.instance.numPatterns == 0 ||
_patternView.numSelectedItems > 1 ||
_patternView.numSelectedItems == 0) _codeField.SetEnabled(false);
else
{
_patternView.getSelectedItemData(_patternBuffer);
_codeField.SetValueWithoutNotify(_patternBuffer[0].text);
if (_patternBuffer.Count == 1)
{
if (_patternBuffer[0] == IntPatternDb.instance.defaultPattern)
{
_codeField.SetEnabled(false);
return;
}
}
_codeField.SetEnabled(true);
}
}
private void updateCompileButton()
{
if (_patternView == null || _compileBtn == null) return;
if (IntPatternDb.instance.numPatterns == 0 ||
_patternView.numSelectedItems > 1 ||
_patternView.numSelectedItems == 0) _compileBtn.SetEnabled(false);
else _compileBtn.SetEnabled(true);
}
protected override void onUndoRedo()
{
if (_patternView != null)
populatePatternView();
updateCodeField();
updateCompileButton();
}
protected override void onEnabled()
{
if (_patternViewState == null)
{
_patternViewState = ScriptableObject.CreateInstance<ListViewState>();
_patternViewState.name = GetType().Name + "_PatternViewState";
AssetDbEx.addObjectToAsset(_patternViewState, IntPatternDb.instance);
}
}
protected override void onDestroy()
{
ScriptableObjectEx.destroyImmediate(_patternViewState);
}
}
}
#endif