mirror of
https://github.com/muskit/H3VR-TNH-Quality-of-Life-Improvements.git
synced 2026-06-03 04:34:26 -07:00
Initial commit
This commit is contained in:
@@ -0,0 +1,265 @@
|
||||
using UnityEditor;
|
||||
using UnityEditor.IMGUI.Controls;
|
||||
using UnityEngine;
|
||||
using System.Collections.Generic;
|
||||
|
||||
|
||||
namespace AssetBundleBrowser
|
||||
{
|
||||
[System.Serializable]
|
||||
internal class AssetBundleManageTab
|
||||
{
|
||||
[SerializeField] private TreeViewState m_BundleTreeState;
|
||||
[SerializeField] private TreeViewState m_AssetListState;
|
||||
[SerializeField] private MultiColumnHeaderState m_AssetListMCHState;
|
||||
[SerializeField] private TreeViewState m_BundleDetailState;
|
||||
|
||||
private Rect m_Position;
|
||||
|
||||
private AssetBundleTree m_BundleTree;
|
||||
private AssetListTree m_AssetList;
|
||||
private MessageList m_MessageList;
|
||||
private BundleDetailList m_DetailsList;
|
||||
private bool m_ResizingHorizontalSplitter = false;
|
||||
private bool m_ResizingVerticalSplitterRight = false;
|
||||
private bool m_ResizingVerticalSplitterLeft = false;
|
||||
private Rect m_HorizontalSplitterRect, m_VerticalSplitterRectRight, m_VerticalSplitterRectLeft;
|
||||
[SerializeField] private float m_HorizontalSplitterPercent;
|
||||
[SerializeField] private float m_VerticalSplitterPercentRight;
|
||||
[SerializeField] private float m_VerticalSplitterPercentLeft;
|
||||
private const float k_SplitterWidth = 3f;
|
||||
private static float s_UpdateDelay = 0f;
|
||||
|
||||
private SearchField m_searchField;
|
||||
|
||||
private 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()
|
||||
{
|
||||
float 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();
|
||||
|
||||
MultiColumnHeaderState 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);
|
||||
GUIStyle 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
|
||||
Rect 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();
|
||||
}
|
||||
}
|
||||
|
||||
private 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);
|
||||
}
|
||||
|
||||
internal void SetAssetListSelection(List<string> assets)
|
||||
{
|
||||
m_AssetList.SetSelection(assets);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user