Files
Fishing2NetTest/Assets/Scripts/NBC/Asset/Editor/GUI/Label/LabelMaskPopupContent.cs
2026-03-05 18:07:55 +08:00

244 lines
8.8 KiB
C#

using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEditor.IMGUI.Controls;
using UnityEngine;
namespace NBC.Asset.Editor
{
public class LabelMaskPopupContent : PopupWindowContent
{
private GUIStyle _toggleMixed;
// private readonly GUIContent _manageLabelsButtonContent =
// EditorGUIUtility.TrIconContent("_Popup@2x", "Manage Labels");
private readonly GUIStyle _toolbarButtonStyle = "RL FooterButton";
private readonly GUIStyle _hintLabelStyle;
private readonly SearchField _searchField;
private string _searchValue;
private readonly List<GUIStyle> _searchStyles;
private Rect _activatorRect;
private float _labelToggleControlRectHeight;
private float _labelToggleControlRectWidth;
private string _controlToFocus;
private int _lastItemCount = -1;
private Vector2 _rect;
private List<string> _labelsAll;
private readonly List<string> _labels;
private ISelectTag _selectTag;
public LabelMaskPopupContent(Rect activatorRect, ISelectTag selectTag)
{
_selectTag = selectTag;
_labels = new List<string>();
if (!string.IsNullOrEmpty(selectTag.ShowTags))
{
_labels.AddRange(selectTag.ShowTags.Split(","));
}
_labels.Remove(string.Empty);
_searchField = new SearchField();
_activatorRect = activatorRect;
_searchStyles = new List<GUIStyle>
{
GUITools.GetStyle("ToolbarSeachTextField"),
GUITools.GetStyle("ToolbarSeachCancelButton"),
GUITools.GetStyle("ToolbarSeachCancelButtonEmpty")
};
_hintLabelStyle = new GUIStyle(GUI.skin.label)
{
fontSize = 10,
fontStyle = FontStyle.Italic,
richText = true
};
}
public override Vector2 GetWindowSize()
{
if (_labelsAll == null)
_labelsAll = GetLabelNamesOrderedSelectedFirst();
if (_lastItemCount != _labelsAll.Count)
{
int maxLen = 0;
string maxStr = "";
for (int i = 0; i < _labelsAll.Count; i++)
{
var len = _labelsAll[i].Length;
if (len > maxLen)
{
maxLen = len;
maxStr = _labelsAll[i];
}
}
var content = new GUIContent(maxStr);
var size = GUI.skin.toggle.CalcSize(content);
_labelToggleControlRectHeight = Mathf.Ceil(size.y + GUI.skin.toggle.margin.top);
_labelToggleControlRectWidth = size.x + 16;
float width = Mathf.Clamp(Mathf.Max(size.x, _activatorRect.width), 170, 500);
float labelAreaHeight = _labelsAll.Count *
(_labelToggleControlRectHeight + GUI.skin.toggle.margin.bottom);
float toolbarAreaHeight = 30 + _hintLabelStyle.CalcHeight(new GUIContent(maxStr), width);
float paddingHeight = 6;
float height = labelAreaHeight + toolbarAreaHeight + paddingHeight;
height = Mathf.Clamp(height, 50, 300);
_rect = new Vector2(width, height);
_lastItemCount = _labelsAll.Count;
}
return _rect;
}
void SetLabelForEntries(string label, bool value)
{
if (string.IsNullOrEmpty(label)) return;
if (value)
{
if (!_labels.Contains(label))
{
_labels.Add(label);
}
}
else
{
_labels.Remove(label);
}
_selectTag.ShowTags = string.Join(",", _labels);
}
List<string> GetLabelNamesOrderedSelectedFirst()
{
var labels = new List<string>(Defs.UserTags.Count);
labels.AddRange(Defs.UserTags);
return labels;
}
Vector2 m_ScrollPosition;
public override void OnGUI(Rect fullRect)
{
int count = -1;
if (_labelsAll == null)
_labelsAll = GetLabelNamesOrderedSelectedFirst();
var areaRect = new Rect(fullRect.xMin + 3, fullRect.yMin + 3, fullRect.width - 6, fullRect.height - 6);
GUILayout.BeginArea(areaRect);
GUILayoutUtility.GetRect(areaRect.width, 1);
Rect searchRect = EditorGUILayout.GetControlRect();
_searchValue = _searchField.OnGUI(searchRect, _searchValue, _searchStyles[0], _searchStyles[1],
_searchStyles[2]);
EditorGUI.BeginDisabledGroup(true);
string labelText;
int searchLabelIndex = _labelsAll.IndexOf(_searchValue);
if (searchLabelIndex >= 0)
{
count = _labels.Contains(_searchValue) ? 1 : 0;
labelText = string.Format(
count > 0 ? Language.LabelHintSearchFoundIsDisabled : Language.LabelHintSearchFoundIsEnabled,
_searchValue);
}
else
{
labelText = !string.IsNullOrEmpty(_searchValue)
? string.Format(Language.LabelHintSearchFoundIsEnabled, _searchValue)
: Language.LabelHintIdle;
}
Rect hintRect = EditorGUILayout.GetControlRect(true,
_hintLabelStyle.CalcHeight(new GUIContent(labelText), fullRect.width), _hintLabelStyle);
hintRect.x -= 3;
hintRect.width += 6;
hintRect.y -= 3;
EditorGUI.LabelField(hintRect, new GUIContent(labelText), _hintLabelStyle);
EditorGUI.EndDisabledGroup();
if (Event.current.isKey &&
(Event.current.keyCode == KeyCode.Return || Event.current.keyCode == KeyCode.KeypadEnter) &&
_searchField.HasFocus())
{
if (!string.IsNullOrEmpty(_searchValue))
{
if (searchLabelIndex >= 0)
{
SetLabelForEntries(_searchValue, count <= 0);
}
else
{
Defs.AddTag(_searchValue);
SetLabelForEntries(_searchValue, true);
_labelsAll.Insert(0, _searchValue);
}
_controlToFocus = _searchValue;
GUI.ScrollTo(new Rect(0, searchLabelIndex * 19, 0, 0));
_searchValue = "";
_lastItemCount = -1;
Event.current.Use();
GUIUtility.ExitGUI();
editorWindow.Repaint();
}
}
var scrollViewHeight = areaRect.height - (hintRect.y + hintRect.height + 2);
m_ScrollPosition = EditorGUILayout.BeginScrollView(m_ScrollPosition, false, false);
Vector2 yPositionDrawRange = new Vector2(m_ScrollPosition.y - 19, m_ScrollPosition.y + scrollViewHeight);
for (int i = 0; i < _labelsAll.Count; i++)
{
var labelName = _labelsAll[i];
if (!string.IsNullOrEmpty(_searchValue))
{
if (labelName.IndexOf(_searchValue, StringComparison.OrdinalIgnoreCase) < 0)
continue;
}
var toggleRect = EditorGUILayout.GetControlRect(GUILayout.Width(_labelToggleControlRectWidth),
GUILayout.Height(_labelToggleControlRectHeight));
if (toggleRect.height > 1)
{
// only draw toggles if they are in view
if (toggleRect.y < yPositionDrawRange.x || toggleRect.y > yPositionDrawRange.y)
continue;
}
else
{
continue;
}
var oldState = _labels.Contains(labelName);
GUI.SetNextControlName(labelName);
var newState = EditorGUI.ToggleLeft(toggleRect, new GUIContent(labelName), oldState);
EditorGUI.showMixedValue = false;
if (oldState != newState)
{
SetLabelForEntries(labelName, newState);
}
}
EditorGUILayout.EndScrollView();
GUILayout.EndArea();
if (Event.current.type == EventType.Repaint &&
_labelsAll != null && _controlToFocus != null)
{
GUI.FocusControl(_controlToFocus);
_controlToFocus = null;
}
}
}
}