WuhuIslandTesting/Library/PackageCache/com.unity.addressables@1.21.12/Editor/GUI/AddressableAssetsSettingsLabelMaskPopup.cs
2025-01-07 02:06:59 +01:00

291 lines
12 KiB
C#

using System;
using System.Collections.Generic;
using UnityEditor.AddressableAssets.Settings;
using UnityEditor.IMGUI.Controls;
using UnityEngine;
using UnityEngine.AddressableAssets;
namespace UnityEditor.AddressableAssets.GUI
{
class LabelMaskPopupContent : PopupWindowContent
{
AddressableAssetSettings m_Settings;
List<AddressableAssetEntry> m_Entries;
Dictionary<string, int> m_LabelCount;
List<string> m_Labels;
GUIStyle m_ToggleMixed;
GUIContent m_ManageLabelsButtonContent = EditorGUIUtility.TrIconContent("_Popup@2x", "Manage Labels");
GUIContent m_ManageLabelsMenuContent = new GUIContent("Manage Labels", "Opens the Labels window for managing adding and removing labels");
GUIContent m_RemoveUnusedLabelsMenuContent = new GUIContent("Remove Unused Labels", "Removes all unused labels from the Addressables settings");
readonly GUIStyle m_ToolbarButtonStyle = "RL FooterButton";
private GUIStyle m_HintLabelStyle;
const string k_HintIdle = "Type to filter or add new label";
const string k_HintCreateNewLabel = "<b>Return</b> to add '{0}'";
const string k_HintSearchFoundIsEnabled = "<b>Return</b> to disable '{0}'";
const string k_HintSearchFoundIsDisabled = "<b>Return</b> to enable '{0}'";
SearchField m_SearchField;
string m_SearchValue;
List<GUIStyle> m_SearchStyles;
Rect m_ActivatorRect;
float m_LabelToggleControlRectHeight;
float m_LabelToggleControlRectWidth;
string m_ControlToFocus = null;
int m_LastItemCount = -1;
Vector2 m_Rect;
public LabelMaskPopupContent(Rect activatorRect, AddressableAssetSettings settings, List<AddressableAssetEntry> e, Dictionary<string, int> count)
{
m_Settings = settings;
m_Entries = e;
m_LabelCount = count;
m_SearchField = new SearchField();
m_ActivatorRect = activatorRect;
m_SearchStyles = new List<GUIStyle>();
m_SearchStyles.Add(AddressablesGUIUtility.GetStyle("ToolbarSeachTextField"));
m_SearchStyles.Add(AddressablesGUIUtility.GetStyle("ToolbarSeachCancelButton"));
m_SearchStyles.Add(AddressablesGUIUtility.GetStyle("ToolbarSeachCancelButtonEmpty"));
m_HintLabelStyle = new GUIStyle(UnityEngine.GUI.skin.label);
m_HintLabelStyle.fontSize = 10;
m_HintLabelStyle.fontStyle = FontStyle.Italic;
m_HintLabelStyle.richText = true;
}
public override Vector2 GetWindowSize()
{
if (m_Labels == null)
m_Labels = GetLabelNamesOrderedSelectedFirst();
if (m_LastItemCount != m_Labels.Count)
{
int maxLen = 0;
string maxStr = "";
for (int i = 0; i < m_Labels.Count; i++)
{
var len = m_Labels[i].Length;
if (len > maxLen)
{
maxLen = len;
maxStr = m_Labels[i];
}
}
var content = new GUIContent(maxStr);
var size = UnityEngine.GUI.skin.toggle.CalcSize(content);
m_LabelToggleControlRectHeight = Mathf.Ceil(size.y + UnityEngine.GUI.skin.toggle.margin.top);
m_LabelToggleControlRectWidth = size.x + 16;
float width = Mathf.Clamp(Mathf.Max(size.x, m_ActivatorRect.width), 170, 500);
float labelAreaHeight = m_Labels.Count * (m_LabelToggleControlRectHeight + UnityEngine.GUI.skin.toggle.margin.bottom);
float toolbarAreaHeight = 30 + m_HintLabelStyle.CalcHeight(new GUIContent(maxStr), width);
float paddingHeight = 6;
float height = labelAreaHeight + toolbarAreaHeight + paddingHeight;
height = Mathf.Clamp(height, 50, 300);
m_Rect = new Vector2(width, height);
m_LastItemCount = m_Labels.Count;
}
return m_Rect;
}
void SetLabelForEntries(string label, bool value)
{
m_Settings.SetLabelValueForEntries(m_Entries, label, value);
m_LabelCount[label] = value ? m_Entries.Count : 0;
}
List<string> GetLabelNamesOrderedSelectedFirst()
{
if (m_Entries == null || m_Entries.Count == 0)
return new List<string>();
int count;
var labels = new List<string>(m_Settings.labelTable.labelNames.Count);
List<string> disabledLabels = new List<string>();
for (int i = 0; i < m_Settings.labelTable.labelNames.Count; ++i)
{
if (m_LabelCount != null)
m_LabelCount.TryGetValue(m_Settings.labelTable.labelNames[i], out count);
else
count = m_Entries[0].labels.Contains(m_Settings.labelTable.labelNames[i]) ? m_Entries.Count : 0;
if (count > 0)
labels.Add(m_Settings.labelTable.labelNames[i]);
else
disabledLabels.Add(m_Settings.labelTable.labelNames[i]);
}
// find any labels that are not in settings
if (m_LabelCount != null)
{
foreach (string key in m_LabelCount.Keys)
{
if (!m_Settings.labelTable.labelNames.Contains(key))
labels.Add(key);
}
}
else
{
foreach (string key in m_Entries[0].labels)
{
if (!m_Settings.labelTable.labelNames.Contains(key))
labels.Add(key);
}
}
labels.AddRange(disabledLabels);
return labels;
}
Vector2 m_ScrollPosition;
public override void OnGUI(Rect fullRect)
{
if (m_Entries.Count == 0)
return;
int count = -1;
if (m_Labels == null)
m_Labels = 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 barRect = EditorGUILayout.GetControlRect();
var marginDown = GUILayoutUtility.GetRect(areaRect.width, 1);
Rect plusRect = barRect;
plusRect.width = plusRect.height;
plusRect.x = (barRect.width - plusRect.width) + 4;
if (UnityEngine.GUI.Button(plusRect, m_ManageLabelsButtonContent, m_ToolbarButtonStyle))
{
GenericMenu menu = new GenericMenu();
menu.AddItem(m_ManageLabelsMenuContent, false, () =>
{
EditorWindow.GetWindow<LabelWindow>(true).Intialize(m_Settings);
editorWindow.Close();
});
menu.AddItem(m_RemoveUnusedLabelsMenuContent, false, () =>
{
m_Settings.RemoveUnusedLabels();
});
menu.DropDown(plusRect);
}
Rect searchRect = barRect;
float plusOffset = plusRect.width + 2;
searchRect.width = searchRect.width - plusOffset;
m_SearchValue = m_SearchField.OnGUI(searchRect, m_SearchValue, m_SearchStyles[0], m_SearchStyles[1], m_SearchStyles[2]);
EditorGUI.BeginDisabledGroup(true);
string labelText;
int searchLabelIndex = m_Labels.IndexOf(m_SearchValue);
if (searchLabelIndex >= 0)
{
if (m_LabelCount == null)
count = m_Entries[0].labels.Contains(m_SearchValue) ? m_Entries.Count : 0;
else
m_LabelCount.TryGetValue(m_SearchValue, out count);
labelText = string.Format(count == m_Entries.Count ? k_HintSearchFoundIsEnabled : k_HintSearchFoundIsDisabled, m_SearchValue);
}
else
labelText = !string.IsNullOrEmpty(m_SearchValue) ? string.Format(k_HintCreateNewLabel, m_SearchValue) : k_HintIdle;
Rect hintRect = EditorGUILayout.GetControlRect(true, m_HintLabelStyle.CalcHeight(new GUIContent(labelText), fullRect.width), m_HintLabelStyle);
hintRect.x -= 3;
hintRect.width += 6;
hintRect.y -= 3;
EditorGUI.LabelField(hintRect, new GUIContent(labelText), m_HintLabelStyle);
EditorGUI.EndDisabledGroup();
if (Event.current.isKey && (Event.current.keyCode == KeyCode.Return || Event.current.keyCode == KeyCode.KeypadEnter) && m_SearchField.HasFocus())
{
if (!string.IsNullOrEmpty(m_SearchValue))
{
if (searchLabelIndex >= 0)
{
if (count != m_Entries.Count)
SetLabelForEntries(m_SearchValue, true);
else
SetLabelForEntries(m_SearchValue, false);
}
else
{
m_Settings.AddLabel(m_SearchValue);
AddressableAssetUtility.OpenAssetIfUsingVCIntegration(m_Settings);
SetLabelForEntries(m_SearchValue, true);
m_Labels.Insert(0, m_SearchValue);
}
m_ControlToFocus = m_SearchValue;
UnityEngine.GUI.ScrollTo(new Rect(0, searchLabelIndex * 19, 0, 0));
m_SearchValue = "";
m_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 < m_Labels.Count; ++i)
{
var labelName = m_Labels[i];
if (!string.IsNullOrEmpty(m_SearchValue))
{
if (labelName.IndexOf(m_SearchValue, StringComparison.OrdinalIgnoreCase) < 0)
continue;
}
var toggleRect = EditorGUILayout.GetControlRect(GUILayout.Width(m_LabelToggleControlRectWidth), GUILayout.Height(m_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;
bool newState;
if (m_LabelCount == null)
count = m_Entries[0].labels.Contains(labelName) ? m_Entries.Count : 0;
else
m_LabelCount.TryGetValue(labelName, out count);
bool oldState = count == m_Entries.Count;
if (!(count == 0 || count == m_Entries.Count))
EditorGUI.showMixedValue = true;
UnityEngine.GUI.SetNextControlName(labelName);
bool labelIsInSettings = m_Settings.labelTable.labelNames.Contains(labelName);
string label = labelIsInSettings ? labelName : AddressablesGUIUtility.ConvertTextToStrikethrough(labelName);
newState = EditorGUI.ToggleLeft(toggleRect, new GUIContent(label), oldState);
EditorGUI.showMixedValue = false;
if (oldState != newState)
SetLabelForEntries(labelName, newState);
}
EditorGUILayout.EndScrollView();
GUILayout.EndArea();
if (Event.current.type == EventType.Repaint &&
m_Labels != null && m_ControlToFocus != null)
{
UnityEngine.GUI.FocusControl(m_ControlToFocus);
m_ControlToFocus = null;
}
}
}
}