| using System.Collections.Generic; | 
| using UnityEditor; | 
| using UnityEditor.IMGUI.Controls; | 
|   | 
| namespace UnityEngine.AssetBundles | 
| { | 
|   | 
|     public class AssetBundleBrowserMain : EditorWindow, IHasCustomMenu | 
|     { | 
|   | 
|         public const float kButtonWidth = 150; | 
|   | 
|         enum Mode | 
|         { | 
|             Browser, | 
|             Builder, | 
|             Inspect, | 
|         } | 
|         [SerializeField] | 
|         Mode m_Mode; | 
|   | 
|         [SerializeField] | 
|         public AssetBundleManageTab m_ManageTab; | 
|   | 
|         [SerializeField] | 
|         public AssetBundleBuildTab m_BuildTab; | 
|   | 
|         [SerializeField] | 
|         public AssetBundleInspectTab m_InspectTab; | 
|   | 
|         private Texture2D m_RefreshTexture; | 
|   | 
|         const float k_ToolbarPadding = 15; | 
|         const float k_MenubarPadding = 32; | 
|   | 
|         [MenuItem("Tools/AssetBundle Browser", priority = 2050)] | 
|         static void ShowWindow() | 
|         { | 
|             var window = GetWindow<AssetBundleBrowserMain>(); | 
|             window.titleContent = new GUIContent("AssetBundles"); | 
|             window.Show(); | 
|         } | 
|   | 
|         [SerializeField] | 
|         public bool multiDataSource = false; | 
|         public virtual void AddItemsToMenu(GenericMenu menu) | 
|         { | 
|             //menu.AddSeparator(string.Empty); | 
|             menu.AddItem(new GUIContent("Custom Sources"), multiDataSource, FlipDataSource); | 
|         } | 
|         public 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(subPos, this); | 
|             if (m_InspectTab == null) | 
|                 m_InspectTab = new AssetBundleInspectTab(); | 
|             m_InspectTab.OnEnable(subPos, this); | 
|   | 
|             m_RefreshTexture = EditorGUIUtility.FindTexture("Refresh"); | 
|   | 
|   | 
|             //determine if we are "multi source" or not... | 
|             multiDataSource = false; | 
|             List<System.Type> types = AssetBundleDataSource.ABDataSourceProviderUtility.CustomABDataSourceTypes; | 
|             if (types.Count > 1) | 
|                 multiDataSource = true; | 
|         } | 
|         private void OnDisable() | 
|         { | 
|             if (m_BuildTab != null) | 
|                 m_BuildTab.OnDisable(); | 
|             if (m_InspectTab != null) | 
|                 m_InspectTab.OnDisable(); | 
|         } | 
|   | 
|         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(GetSubWindowArea()); | 
|                     break; | 
|                 case Mode.Inspect: | 
|                     m_InspectTab.OnGUI(GetSubWindowArea()); | 
|                     break; | 
|                 case Mode.Browser: | 
|                 default: | 
|                     m_ManageTab.OnGUI(GetSubWindowArea()); | 
|                     break; | 
|             } | 
|         } | 
|   | 
|         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(); | 
|                     var 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(); | 
|                         bool firstItem = true; | 
|   | 
|                         foreach (var info in AssetBundleDataSource.ABDataSourceProviderUtility.CustomABDataSourceTypes) | 
|                         { | 
|                             List<AssetBundleDataSource.ABDataSource> dataSourceList = null; | 
|                             dataSourceList = info.GetMethod("CreateDataSources").Invoke(null, null) as List<AssetBundleDataSource.ABDataSource>; | 
|                          | 
|   | 
|                             if (dataSourceList == null) | 
|                                 continue; | 
|   | 
|                             if (!firstItem) | 
|                             { | 
|                                 menu.AddSeparator(""); | 
|                             } | 
|   | 
|                             foreach (var ds in dataSourceList) | 
|                             { | 
|                                 menu.AddItem(new GUIContent(string.Format("{0} ({1})", ds.Name, ds.ProviderName)), false, | 
|                                     () => | 
|                                     { | 
|                                         var thisDataSource = ds; | 
|                                         AssetBundleModel.Model.DataSource = thisDataSource; | 
|                                         m_ManageTab.ForceReloadData(); | 
|                                     } | 
|                                 ); | 
|                             } | 
|   | 
|                             firstItem = false; | 
|                         } | 
|   | 
|                         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(); | 
|             } | 
|         } | 
|   | 
|   | 
|     } | 
| } |