您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

274 行
11 KiB

using UnityEditor;
using UnityEditor.IMGUI.Controls;
using UnityEngine;
using System.Collections.Generic;
namespace AssetBundleBrowser
{
[System.Serializable]
internal class AssetBundleManageTab
{
[SerializeField]
TreeViewState m_BundleTreeState;
[SerializeField]
TreeViewState m_AssetListState;
[SerializeField]
MultiColumnHeaderState m_AssetListMCHState;
[SerializeField]
TreeViewState m_BundleDetailState;
Rect m_Position;
AssetBundleTree m_BundleTree;
AssetListTree m_AssetList;
MessageList m_MessageList;
BundleDetailList m_DetailsList;
bool m_ResizingHorizontalSplitter = false;
bool m_ResizingVerticalSplitterRight = false;
bool m_ResizingVerticalSplitterLeft = false;
Rect m_HorizontalSplitterRect, m_VerticalSplitterRectRight, m_VerticalSplitterRectLeft;
[SerializeField]
float m_HorizontalSplitterPercent;
[SerializeField]
float m_VerticalSplitterPercentRight;
[SerializeField]
float m_VerticalSplitterPercentLeft;
const float k_SplitterWidth = 3f;
private static float s_UpdateDelay = 0f;
SearchField m_searchField;
EditorWindow m_Parent = null;
internal AssetBundleManageTab()
{
m_HorizontalSplitterPercent = 0.4f;
m_VerticalSplitterPercentRight = 0.7f;
m_VerticalSplitterPercentLeft = 0.85f;
}
internal void OnEnable(Rect pos, EditorWindow parent)
{
m_Parent = parent;
m_Position = pos;
m_HorizontalSplitterRect = new Rect(
(int)(m_Position.x + m_Position.width * m_HorizontalSplitterPercent),
m_Position.y,
k_SplitterWidth,
m_Position.height);
m_VerticalSplitterRectRight = new Rect(
m_HorizontalSplitterRect.x,
(int)(m_Position.y + m_HorizontalSplitterRect.height * m_VerticalSplitterPercentRight),
(m_Position.width - m_HorizontalSplitterRect.width) - k_SplitterWidth,
k_SplitterWidth);
m_VerticalSplitterRectLeft = new Rect(
m_Position.x,
(int)(m_Position.y + m_HorizontalSplitterRect.height * m_VerticalSplitterPercentLeft),
(m_HorizontalSplitterRect.width) - k_SplitterWidth,
k_SplitterWidth);
m_searchField = new SearchField();
}
internal void Update()
{
var t = Time.realtimeSinceStartup;
if (t - s_UpdateDelay > 0.1f ||
s_UpdateDelay > t) //something went strangely wrong if this second check is true.
{
s_UpdateDelay = t - 0.001f;
if(AssetBundleModel.Model.Update())
{
m_Parent.Repaint();
}
if (m_DetailsList != null)
m_DetailsList.Update();
if (m_AssetList != null)
m_AssetList.Update();
}
}
internal void ForceReloadData()
{
UpdateSelectedBundles(new List<AssetBundleModel.BundleInfo>());
SetSelectedItems(new List<AssetBundleModel.AssetInfo>());
m_BundleTree.SetSelection(new int[0]);
AssetBundleModel.Model.ForceReloadData(m_BundleTree);
m_Parent.Repaint();
}
internal void OnGUI(Rect pos)
{
m_Position = pos;
if(m_BundleTree == null)
{
if (m_AssetListState == null)
m_AssetListState = new TreeViewState();
var headerState = AssetListTree.CreateDefaultMultiColumnHeaderState();// multiColumnTreeViewRect.width);
if (MultiColumnHeaderState.CanOverwriteSerializedFields(m_AssetListMCHState, headerState))
MultiColumnHeaderState.OverwriteSerializedFields(m_AssetListMCHState, headerState);
m_AssetListMCHState = headerState;
m_AssetList = new AssetListTree(m_AssetListState, m_AssetListMCHState, this);
m_AssetList.Reload();
m_MessageList = new MessageList();
if (m_BundleDetailState == null)
m_BundleDetailState = new TreeViewState();
m_DetailsList = new BundleDetailList(m_BundleDetailState);
m_DetailsList.Reload();
if (m_BundleTreeState == null)
m_BundleTreeState = new TreeViewState();
m_BundleTree = new AssetBundleTree(m_BundleTreeState, this);
m_BundleTree.Refresh();
m_Parent.Repaint();
}
HandleHorizontalResize();
HandleVerticalResize();
if (AssetBundleModel.Model.BundleListIsEmpty())
{
m_BundleTree.OnGUI(m_Position);
var style = new GUIStyle(GUI.skin.label);
style.alignment = TextAnchor.MiddleCenter;
style.wordWrap = true;
GUI.Label(
new Rect(m_Position.x + 1f, m_Position.y + 1f, m_Position.width - 2f, m_Position.height - 2f),
new GUIContent(AssetBundleModel.Model.GetEmptyMessage()),
style);
}
else
{
//Left half
var bundleTreeRect = new Rect(
m_Position.x,
m_Position.y,
m_HorizontalSplitterRect.x,
m_VerticalSplitterRectLeft.y - m_Position.y);
m_BundleTree.OnGUI(bundleTreeRect);
m_DetailsList.OnGUI(new Rect(
bundleTreeRect.x,
bundleTreeRect.y + bundleTreeRect.height + k_SplitterWidth,
bundleTreeRect.width,
m_Position.height - bundleTreeRect.height - k_SplitterWidth*2));
//Right half.
float panelLeft = m_HorizontalSplitterRect.x + k_SplitterWidth;
float panelWidth = m_VerticalSplitterRectRight.width - k_SplitterWidth * 2;
float searchHeight = 20f;
float panelTop = m_Position.y + searchHeight;
float panelHeight = m_VerticalSplitterRectRight.y - panelTop;
OnGUISearchBar(new Rect(panelLeft, m_Position.y, panelWidth, searchHeight));
m_AssetList.OnGUI(new Rect(
panelLeft,
panelTop,
panelWidth,
panelHeight));
m_MessageList.OnGUI(new Rect(
panelLeft,
panelTop + panelHeight + k_SplitterWidth,
panelWidth,
(m_Position.height - panelHeight) - k_SplitterWidth * 2));
if (m_ResizingHorizontalSplitter || m_ResizingVerticalSplitterRight || m_ResizingVerticalSplitterLeft)
m_Parent.Repaint();
}
}
void OnGUISearchBar(Rect rect)
{
m_BundleTree.searchString = m_searchField.OnGUI(rect, m_BundleTree.searchString);
m_AssetList.searchString = m_BundleTree.searchString;
}
public bool hasSearch
{
get { return m_BundleTree.hasSearch; }
}
private void HandleHorizontalResize()
{
m_HorizontalSplitterRect.x = (int)(m_Position.width * m_HorizontalSplitterPercent);
m_HorizontalSplitterRect.height = m_Position.height;
EditorGUIUtility.AddCursorRect(m_HorizontalSplitterRect, MouseCursor.ResizeHorizontal);
if (Event.current.type == EventType.MouseDown && m_HorizontalSplitterRect.Contains(Event.current.mousePosition))
m_ResizingHorizontalSplitter = true;
if (m_ResizingHorizontalSplitter)
{
m_HorizontalSplitterPercent = Mathf.Clamp(Event.current.mousePosition.x / m_Position.width, 0.1f, 0.9f);
m_HorizontalSplitterRect.x = (int)(m_Position.width * m_HorizontalSplitterPercent);
}
if (Event.current.type == EventType.MouseUp)
m_ResizingHorizontalSplitter = false;
}
private void HandleVerticalResize()
{
m_VerticalSplitterRectRight.x = m_HorizontalSplitterRect.x;
m_VerticalSplitterRectRight.y = (int)(m_HorizontalSplitterRect.height * m_VerticalSplitterPercentRight);
m_VerticalSplitterRectRight.width = m_Position.width - m_HorizontalSplitterRect.x;
m_VerticalSplitterRectLeft.y = (int)(m_HorizontalSplitterRect.height * m_VerticalSplitterPercentLeft);
m_VerticalSplitterRectLeft.width = m_VerticalSplitterRectRight.width;
EditorGUIUtility.AddCursorRect(m_VerticalSplitterRectRight, MouseCursor.ResizeVertical);
if (Event.current.type == EventType.MouseDown && m_VerticalSplitterRectRight.Contains(Event.current.mousePosition))
m_ResizingVerticalSplitterRight = true;
EditorGUIUtility.AddCursorRect(m_VerticalSplitterRectLeft, MouseCursor.ResizeVertical);
if (Event.current.type == EventType.MouseDown && m_VerticalSplitterRectLeft.Contains(Event.current.mousePosition))
m_ResizingVerticalSplitterLeft = true;
if (m_ResizingVerticalSplitterRight)
{
m_VerticalSplitterPercentRight = Mathf.Clamp(Event.current.mousePosition.y / m_HorizontalSplitterRect.height, 0.2f, 0.98f);
m_VerticalSplitterRectRight.y = (int)(m_HorizontalSplitterRect.height * m_VerticalSplitterPercentRight);
}
else if (m_ResizingVerticalSplitterLeft)
{
m_VerticalSplitterPercentLeft = Mathf.Clamp(Event.current.mousePosition.y / m_HorizontalSplitterRect.height, 0.25f, 0.98f);
m_VerticalSplitterRectLeft.y = (int)(m_HorizontalSplitterRect.height * m_VerticalSplitterPercentLeft);
}
if (Event.current.type == EventType.MouseUp)
{
m_ResizingVerticalSplitterRight = false;
m_ResizingVerticalSplitterLeft = false;
}
}
internal void UpdateSelectedBundles(IEnumerable<AssetBundleModel.BundleInfo> bundles)
{
AssetBundleModel.Model.AddBundlesToUpdate(bundles);
m_AssetList.SetSelectedBundles(bundles);
m_DetailsList.SetItems(bundles);
m_MessageList.SetItems(null);
}
internal void SetSelectedItems(IEnumerable<AssetBundleModel.AssetInfo> items)
{
m_MessageList.SetItems(items);
}
}
}