using System; using System.Collections.Generic; using AssetBundleBrowser.AssetBundleDataSource; using UnityEditor; using UnityEngine; [assembly: System.Runtime.CompilerServices.InternalsVisibleToAttribute("Unity.AssetBundleBrowser.Editor.Tests")] namespace AssetBundleBrowser { public class AssetBundleBrowserMain : EditorWindow, IHasCustomMenu, ISerializationCallbackReceiver { private static AssetBundleBrowserMain s_instance = null; internal static AssetBundleBrowserMain instance { get { if (s_instance == null) s_instance = GetWindow(); return s_instance; } } internal const float kButtonWidth = 150; private enum Mode { Browser, Builder, Inspect } [SerializeField] private Mode m_Mode; [SerializeField] private int m_DataSourceIndex; [SerializeField] internal AssetBundleManageTab m_ManageTab; [SerializeField] internal AssetBundleBuildTab m_BuildTab; [SerializeField] internal AssetBundleInspectTab m_InspectTab; private Texture2D m_RefreshTexture; private const float k_ToolbarPadding = 15; private const float k_MenubarPadding = 32; [MenuItem("Window/AssetBundle Browser", priority = 2050)] private static void ShowWindow() { s_instance = null; instance.titleContent = new GUIContent("AssetBundles"); instance.Show(); } [SerializeField] internal bool multiDataSource = false; private List m_DataSourceList = null; public virtual void AddItemsToMenu(GenericMenu menu) { if (menu != null) menu.AddItem(new GUIContent("Custom Sources"), multiDataSource, FlipDataSource); } internal void FlipDataSource() { multiDataSource = !multiDataSource; } private void OnEnable() { Rect subPos = GetSubWindowArea(); if (m_ManageTab == null) m_ManageTab = new AssetBundleManageTab(); m_ManageTab.OnEnable(subPos, this); if (m_BuildTab == null) m_BuildTab = new AssetBundleBuildTab(); m_BuildTab.OnEnable(this); if (m_InspectTab == null) m_InspectTab = new AssetBundleInspectTab(); m_InspectTab.OnEnable(subPos); m_RefreshTexture = EditorGUIUtility.FindTexture("Refresh"); InitDataSources(); } private void InitDataSources() { //determine if we are "multi source" or not... multiDataSource = false; m_DataSourceList = new List(); foreach (Type info in AssetBundleDataSource.ABDataSourceProviderUtility.CustomABDataSourceTypes) m_DataSourceList.AddRange(info.GetMethod("CreateDataSources").Invoke(null, null) as List); if (m_DataSourceList.Count > 1) { multiDataSource = true; if (m_DataSourceIndex >= m_DataSourceList.Count) m_DataSourceIndex = 0; AssetBundleModel.Model.DataSource = m_DataSourceList[m_DataSourceIndex]; } } private void OnDisable() { if (m_BuildTab != null) m_BuildTab.OnDisable(); if (m_InspectTab != null) m_InspectTab.OnDisable(); } public void OnBeforeSerialize() { } public void OnAfterDeserialize() { } private Rect GetSubWindowArea() { float padding = k_MenubarPadding; if (multiDataSource) padding += k_MenubarPadding * 0.5f; Rect subPos = new Rect(0, padding, position.width, position.height - padding); return subPos; } private void Update() { switch (m_Mode) { case Mode.Builder: break; case Mode.Inspect: break; case Mode.Browser: default: m_ManageTab.Update(); break; } } private void OnGUI() { ModeToggle(); switch (m_Mode) { case Mode.Builder: m_BuildTab.OnGUI(); break; case Mode.Inspect: m_InspectTab.OnGUI(GetSubWindowArea()); break; case Mode.Browser: default: m_ManageTab.OnGUI(GetSubWindowArea()); break; } } private void ModeToggle() { GUILayout.BeginHorizontal(); GUILayout.Space(k_ToolbarPadding); bool clicked = false; switch (m_Mode) { case Mode.Browser: clicked = GUILayout.Button(m_RefreshTexture); if (clicked) m_ManageTab.ForceReloadData(); break; case Mode.Builder: GUILayout.Space(m_RefreshTexture.width + k_ToolbarPadding); break; case Mode.Inspect: clicked = GUILayout.Button(m_RefreshTexture); if (clicked) m_InspectTab.RefreshBundles(); break; } float toolbarWidth = position.width - k_ToolbarPadding * 4 - m_RefreshTexture.width; //string[] labels = new string[2] { "Configure", "Build"}; string[] labels = new string[3] {"Configure", "Build", "Inspect"}; m_Mode = (Mode) GUILayout.Toolbar((int) m_Mode, labels, "LargeButton", GUILayout.Width(toolbarWidth)); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); if (multiDataSource) { //GUILayout.BeginArea(r); GUILayout.BeginHorizontal(); using (new EditorGUILayout.HorizontalScope(EditorStyles.toolbar)) { GUILayout.Label("Bundle Data Source:"); GUILayout.FlexibleSpace(); GUIContent c = new GUIContent(string.Format("{0} ({1})", AssetBundleModel.Model.DataSource.Name, AssetBundleModel.Model.DataSource.ProviderName), "Select Asset Bundle Set"); if (GUILayout.Button(c, EditorStyles.toolbarPopup)) { GenericMenu menu = new GenericMenu(); for (int index = 0; index < m_DataSourceList.Count; index++) { ABDataSource ds = m_DataSourceList[index]; if (ds == null) continue; if (index > 0) menu.AddSeparator(""); int counter = index; menu.AddItem(new GUIContent(string.Format("{0} ({1})", ds.Name, ds.ProviderName)), false, () => { m_DataSourceIndex = counter; ABDataSource thisDataSource = ds; AssetBundleModel.Model.DataSource = thisDataSource; m_ManageTab.ForceReloadData(); } ); } menu.ShowAsContext(); } GUILayout.FlexibleSpace(); if (AssetBundleModel.Model.DataSource.IsReadOnly()) { GUIStyle tbLabel = new GUIStyle(EditorStyles.toolbar); tbLabel.alignment = TextAnchor.MiddleRight; GUILayout.Label("Read Only", tbLabel); } } GUILayout.EndHorizontal(); //GUILayout.EndArea(); } } } }