123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638 |
- using UnityEditor;
- using UnityEngine;
- using System.Collections.Generic;
- using UnityEditor.IMGUI.Controls;
- using System.Linq;
- using System;
- namespace AssetBundleBrowser
- {
- internal class AssetBundleTree : TreeView
- {
- AssetBundleManageTab m_Controller;
- private bool m_ContextOnItem = false;
- List<UnityEngine.Object> m_EmptyObjectList = new List<UnityEngine.Object>();
- internal AssetBundleTree(TreeViewState state, AssetBundleManageTab ctrl) : base(state)
- {
- AssetBundleModel.Model.Rebuild();
- m_Controller = ctrl;
- showBorder = true;
- }
- protected override bool CanMultiSelect(TreeViewItem item)
- {
- return true;
- }
- protected override bool CanRename(TreeViewItem item)
- {
- return item.displayName.Length > 0;
- }
- protected override void RowGUI(RowGUIArgs args)
- {
- var bundleItem = (args.item as AssetBundleModel.BundleTreeItem);
- if (args.item.icon == null)
- extraSpaceBeforeIconAndLabel = 16f;
- else
- extraSpaceBeforeIconAndLabel = 0f;
- Color old = GUI.color;
- if ((bundleItem.bundle as AssetBundleModel.BundleVariantFolderInfo) != null)
- GUI.color = AssetBundleModel.Model.k_LightGrey; //new Color(0.3f, 0.5f, 0.85f);
- base.RowGUI(args);
- GUI.color = old;
- var message = bundleItem.BundleMessage();
- if(message.severity != MessageType.None)
- {
- var size = args.rowRect.height;
- var right = args.rowRect.xMax;
- Rect messageRect = new Rect(right - size, args.rowRect.yMin, size, size);
- GUI.Label(messageRect, new GUIContent(message.icon, message.message ));
- }
- }
- protected override void RenameEnded(RenameEndedArgs args)
- {
- base.RenameEnded(args);
- if (args.newName.Length > 0 && args.newName != args.originalName)
- {
- args.newName = args.newName.ToLower();
- args.acceptedRename = true;
- AssetBundleModel.BundleTreeItem renamedItem = FindItem(args.itemID, rootItem) as AssetBundleModel.BundleTreeItem;
- args.acceptedRename = AssetBundleModel.Model.HandleBundleRename(renamedItem, args.newName);
- ReloadAndSelect(renamedItem.bundle.nameHashCode, false);
- }
- else
- {
- args.acceptedRename = false;
- }
- }
- protected override TreeViewItem BuildRoot()
- {
- AssetBundleModel.Model.Refresh();
- var root = AssetBundleModel.Model.CreateBundleTreeView();
- return root;
- }
- protected override void SelectionChanged(IList<int> selectedIds)
- {
- var selectedBundles = new List<AssetBundleModel.BundleInfo>();
- if (selectedIds != null)
- {
- foreach (var id in selectedIds)
- {
- var item = FindItem(id, rootItem) as AssetBundleModel.BundleTreeItem;
- if(item != null && item.bundle != null)
- {
- item.bundle.RefreshAssetList();
- selectedBundles.Add(item.bundle);
- }
- }
- }
- m_Controller.UpdateSelectedBundles(selectedBundles);
- }
- public override void OnGUI(Rect rect)
- {
- base.OnGUI(rect);
- if(Event.current.type == EventType.MouseDown && Event.current.button == 0 && rect.Contains(Event.current.mousePosition))
- {
- SetSelection(new int[0], TreeViewSelectionOptions.FireSelectionChanged);
- }
- }
- protected override void ContextClicked()
- {
- if (m_ContextOnItem)
- {
- m_ContextOnItem = false;
- return;
- }
- List<AssetBundleModel.BundleTreeItem> selectedNodes = new List<AssetBundleModel.BundleTreeItem>();
- GenericMenu menu = new GenericMenu();
- if (!AssetBundleModel.Model.DataSource.IsReadOnly ()) {
- menu.AddItem(new GUIContent("Add new bundle"), false, CreateNewBundle, selectedNodes);
- menu.AddItem(new GUIContent("Add new folder"), false, CreateFolder, selectedNodes);
- }
- menu.AddItem(new GUIContent("Reload all data"), false, ForceReloadData, selectedNodes);
- menu.ShowAsContext();
- }
- protected override void ContextClickedItem(int id)
- {
- if (AssetBundleModel.Model.DataSource.IsReadOnly ()) {
- return;
- }
- m_ContextOnItem = true;
- List<AssetBundleModel.BundleTreeItem> selectedNodes = new List<AssetBundleModel.BundleTreeItem>();
- foreach (var nodeID in GetSelection())
- {
- selectedNodes.Add(FindItem(nodeID, rootItem) as AssetBundleModel.BundleTreeItem);
- }
-
- GenericMenu menu = new GenericMenu();
-
- if(selectedNodes.Count == 1)
- {
- if ((selectedNodes[0].bundle as AssetBundleModel.BundleFolderConcreteInfo) != null)
- {
- menu.AddItem(new GUIContent("Add Child/New Bundle"), false, CreateNewBundle, selectedNodes);
- menu.AddItem(new GUIContent("Add Child/New Folder"), false, CreateFolder, selectedNodes);
- menu.AddItem(new GUIContent("Add Sibling/New Bundle"), false, CreateNewSiblingBundle, selectedNodes);
- menu.AddItem(new GUIContent("Add Sibling/New Folder"), false, CreateNewSiblingFolder, selectedNodes);
- }
- else if( (selectedNodes[0].bundle as AssetBundleModel.BundleVariantFolderInfo) != null)
- {
- menu.AddItem(new GUIContent("Add Child/New Variant"), false, CreateNewVariant, selectedNodes);
- menu.AddItem(new GUIContent("Add Sibling/New Bundle"), false, CreateNewSiblingBundle, selectedNodes);
- menu.AddItem(new GUIContent("Add Sibling/New Folder"), false, CreateNewSiblingFolder, selectedNodes);
- }
- else
- {
- var variant = selectedNodes[0].bundle as AssetBundleModel.BundleVariantDataInfo;
- if (variant == null)
- {
- menu.AddItem(new GUIContent("Add Sibling/New Bundle"), false, CreateNewSiblingBundle, selectedNodes);
- menu.AddItem(new GUIContent("Add Sibling/New Folder"), false, CreateNewSiblingFolder, selectedNodes);
- menu.AddItem(new GUIContent("Convert to variant"), false, ConvertToVariant, selectedNodes);
- }
- else
- {
- menu.AddItem(new GUIContent("Add Sibling/New Variant"), false, CreateNewSiblingVariant, selectedNodes);
- }
- }
- if(selectedNodes[0].bundle.IsMessageSet(MessageSystem.MessageFlag.AssetsDuplicatedInMultBundles))
- menu.AddItem(new GUIContent("Move duplicates to new bundle"), false, DedupeAllBundles, selectedNodes);
- menu.AddItem(new GUIContent("Rename"), false, RenameBundle, selectedNodes);
- menu.AddItem(new GUIContent("Delete " + selectedNodes[0].displayName), false, DeleteBundles, selectedNodes);
-
- }
- else if (selectedNodes.Count > 1)
- {
- menu.AddItem(new GUIContent("Move duplicates shared by selected"), false, DedupeOverlappedBundles, selectedNodes);
- menu.AddItem(new GUIContent("Move duplicates existing in any selected"), false, DedupeAllBundles, selectedNodes);
- menu.AddItem(new GUIContent("Delete " + selectedNodes.Count + " selected bundles"), false, DeleteBundles, selectedNodes);
- }
- menu.ShowAsContext();
- }
- void ForceReloadData(object context)
- {
- AssetBundleModel.Model.ForceReloadData(this);
- }
- void CreateNewSiblingFolder(object context)
- {
- var selectedNodes = context as List<AssetBundleModel.BundleTreeItem>;
- if (selectedNodes != null && selectedNodes.Count > 0)
- {
- AssetBundleModel.BundleFolderConcreteInfo folder = null;
- folder = selectedNodes[0].bundle.parent as AssetBundleModel.BundleFolderConcreteInfo;
- CreateFolderUnderParent(folder);
- }
- else
- Debug.LogError("could not add 'sibling' with no bundles selected");
- }
- void CreateFolder(object context)
- {
- AssetBundleModel.BundleFolderConcreteInfo folder = null;
- var selectedNodes = context as List<AssetBundleModel.BundleTreeItem>;
- if (selectedNodes != null && selectedNodes.Count > 0)
- {
- folder = selectedNodes[0].bundle as AssetBundleModel.BundleFolderConcreteInfo;
- }
- CreateFolderUnderParent(folder);
- }
- void CreateFolderUnderParent(AssetBundleModel.BundleFolderConcreteInfo folder)
- {
- var newBundle = AssetBundleModel.Model.CreateEmptyBundleFolder(folder);
- ReloadAndSelect(newBundle.nameHashCode, true);
- }
- void RenameBundle(object context)
- {
- var selectedNodes = context as List<AssetBundleModel.BundleTreeItem>;
- if (selectedNodes != null && selectedNodes.Count > 0)
- {
- BeginRename(FindItem(selectedNodes[0].bundle.nameHashCode, rootItem));
- }
- }
- void CreateNewSiblingBundle(object context)
- {
- var selectedNodes = context as List<AssetBundleModel.BundleTreeItem>;
- if (selectedNodes != null && selectedNodes.Count > 0)
- {
- AssetBundleModel.BundleFolderConcreteInfo folder = null;
- folder = selectedNodes[0].bundle.parent as AssetBundleModel.BundleFolderConcreteInfo;
- CreateBundleUnderParent(folder);
- }
- else
- Debug.LogError("could not add 'sibling' with no bundles selected");
- }
- void CreateNewBundle(object context)
- {
- AssetBundleModel.BundleFolderConcreteInfo folder = null;
- var selectedNodes = context as List<AssetBundleModel.BundleTreeItem>;
- if (selectedNodes != null && selectedNodes.Count > 0)
- {
- folder = selectedNodes[0].bundle as AssetBundleModel.BundleFolderConcreteInfo;
- }
- CreateBundleUnderParent(folder);
- }
- void CreateBundleUnderParent(AssetBundleModel.BundleFolderInfo folder)
- {
- var newBundle = AssetBundleModel.Model.CreateEmptyBundle(folder);
- ReloadAndSelect(newBundle.nameHashCode, true);
- }
- void CreateNewSiblingVariant(object context)
- {
- var selectedNodes = context as List<AssetBundleModel.BundleTreeItem>;
- if (selectedNodes != null && selectedNodes.Count > 0)
- {
- AssetBundleModel.BundleVariantFolderInfo folder = null;
- folder = selectedNodes[0].bundle.parent as AssetBundleModel.BundleVariantFolderInfo;
- CreateVariantUnderParent(folder);
- }
- else
- Debug.LogError("could not add 'sibling' with no bundles selected");
- }
- void CreateNewVariant(object context)
- {
- AssetBundleModel.BundleVariantFolderInfo folder = null;
- var selectedNodes = context as List<AssetBundleModel.BundleTreeItem>;
- if (selectedNodes != null && selectedNodes.Count == 1)
- {
- folder = selectedNodes[0].bundle as AssetBundleModel.BundleVariantFolderInfo;
- CreateVariantUnderParent(folder);
- }
- }
- void CreateVariantUnderParent(AssetBundleModel.BundleVariantFolderInfo folder)
- {
- if (folder != null)
- {
- var newBundle = AssetBundleModel.Model.CreateEmptyVariant(folder);
- ReloadAndSelect(newBundle.nameHashCode, true);
- }
- }
- void ConvertToVariant(object context)
- {
- var selectedNodes = context as List<AssetBundleModel.BundleTreeItem>;
- if (selectedNodes.Count == 1)
- {
- var bundle = selectedNodes[0].bundle as AssetBundleModel.BundleDataInfo;
- var newBundle = AssetBundleModel.Model.HandleConvertToVariant(bundle);
- int hash = 0;
- if (newBundle != null)
- hash = newBundle.nameHashCode;
- ReloadAndSelect(hash, true);
- }
- }
- void DedupeOverlappedBundles(object context)
- {
- DedupeBundles(context, true);
- }
- void DedupeAllBundles(object context)
- {
- DedupeBundles(context, false);
- }
- void DedupeBundles(object context, bool onlyOverlappedAssets)
- {
- var selectedNodes = context as List<AssetBundleModel.BundleTreeItem>;
- var newBundle = AssetBundleModel.Model.HandleDedupeBundles(selectedNodes.Select(item => item.bundle), onlyOverlappedAssets);
- if(newBundle != null)
- {
- var selection = new List<int>();
- selection.Add(newBundle.nameHashCode);
- ReloadAndSelect(selection);
- }
- else
- {
- if (onlyOverlappedAssets)
- Debug.LogWarning("There were no duplicated assets that existed across all selected bundles.");
- else
- Debug.LogWarning("No duplicate assets found after refreshing bundle contents.");
- }
- }
- void DeleteBundles(object b)
- {
- var selectedNodes = b as List<AssetBundleModel.BundleTreeItem>;
- AssetBundleModel.Model.HandleBundleDelete(selectedNodes.Select(item => item.bundle));
- ReloadAndSelect(new List<int>());
- }
- protected override void KeyEvent()
- {
- if (Event.current.keyCode == KeyCode.Delete && GetSelection().Count > 0)
- {
- List<AssetBundleModel.BundleTreeItem> selectedNodes = new List<AssetBundleModel.BundleTreeItem>();
- foreach (var nodeID in GetSelection())
- {
- selectedNodes.Add(FindItem(nodeID, rootItem) as AssetBundleModel.BundleTreeItem);
- }
- DeleteBundles(selectedNodes);
- }
- }
- class DragAndDropData
- {
- internal bool hasBundleFolder = false;
- internal bool hasScene = false;
- internal bool hasNonScene = false;
- internal bool hasVariantChild = false;
- internal List<AssetBundleModel.BundleInfo> draggedNodes;
- internal AssetBundleModel.BundleTreeItem targetNode;
- internal DragAndDropArgs args;
- internal string[] paths;
- internal DragAndDropData(DragAndDropArgs a)
- {
- args = a;
- draggedNodes = DragAndDrop.GetGenericData("AssetBundleModel.BundleInfo") as List<AssetBundleModel.BundleInfo>;
- targetNode = args.parentItem as AssetBundleModel.BundleTreeItem;
- paths = DragAndDrop.paths;
- if (draggedNodes != null)
- {
- foreach (var bundle in draggedNodes)
- {
- if ((bundle as AssetBundleModel.BundleFolderInfo) != null)
- {
- hasBundleFolder = true;
- }
- else
- {
- var dataBundle = bundle as AssetBundleModel.BundleDataInfo;
- if (dataBundle != null)
- {
- if (dataBundle.isSceneBundle)
- hasScene = true;
- else
- hasNonScene = true;
- if ( (dataBundle as AssetBundleModel.BundleVariantDataInfo) != null)
- hasVariantChild = true;
- }
- }
- }
- }
- else if (DragAndDrop.paths != null)
- {
- foreach (var assetPath in DragAndDrop.paths)
- {
- if (AssetDatabase.GetMainAssetTypeAtPath(assetPath) == typeof(SceneAsset))
- hasScene = true;
- else
- hasNonScene = true;
- }
- }
- }
- }
- protected override DragAndDropVisualMode HandleDragAndDrop(DragAndDropArgs args)
- {
- DragAndDropVisualMode visualMode = DragAndDropVisualMode.None;
- DragAndDropData data = new DragAndDropData(args);
-
- if (AssetBundleModel.Model.DataSource.IsReadOnly ()) {
- return DragAndDropVisualMode.Rejected;
- }
- if ( (data.hasScene && data.hasNonScene) ||
- (data.hasVariantChild) )
- return DragAndDropVisualMode.Rejected;
-
- switch (args.dragAndDropPosition)
- {
- case DragAndDropPosition.UponItem:
- visualMode = HandleDragDropUpon(data);
- break;
- case DragAndDropPosition.BetweenItems:
- visualMode = HandleDragDropBetween(data);
- break;
- case DragAndDropPosition.OutsideItems:
- if (data.draggedNodes != null)
- {
- visualMode = DragAndDropVisualMode.Copy;
- if (data.args.performDrop)
- {
- AssetBundleModel.Model.HandleBundleReparent(data.draggedNodes, null);
- Reload();
- }
- }
- else if(data.paths != null)
- {
- visualMode = DragAndDropVisualMode.Copy;
- if (data.args.performDrop)
- {
- DragPathsToNewSpace(data.paths, null);
- }
- }
- break;
- }
- return visualMode;
- }
- private DragAndDropVisualMode HandleDragDropUpon(DragAndDropData data)
- {
- DragAndDropVisualMode visualMode = DragAndDropVisualMode.Copy;//Move;
- var targetDataBundle = data.targetNode.bundle as AssetBundleModel.BundleDataInfo;
- if (targetDataBundle != null)
- {
- if (targetDataBundle.isSceneBundle)
- {
- if(data.hasNonScene)
- return DragAndDropVisualMode.Rejected;
- }
- else
- {
- if (data.hasBundleFolder)
- {
- return DragAndDropVisualMode.Rejected;
- }
- else if (data.hasScene && !targetDataBundle.IsEmpty())
- {
- return DragAndDropVisualMode.Rejected;
- }
- }
-
- if (data.args.performDrop)
- {
- if (data.draggedNodes != null)
- {
- AssetBundleModel.Model.HandleBundleMerge(data.draggedNodes, targetDataBundle);
- ReloadAndSelect(targetDataBundle.nameHashCode, false);
- }
- else if (data.paths != null)
- {
- AssetBundleModel.Model.MoveAssetToBundle(data.paths, targetDataBundle.m_Name.bundleName, targetDataBundle.m_Name.variant);
- AssetBundleModel.Model.ExecuteAssetMove();
- ReloadAndSelect(targetDataBundle.nameHashCode, false);
- }
- }
- }
- else
- {
- var folder = data.targetNode.bundle as AssetBundleModel.BundleFolderInfo;
- if (folder != null)
- {
- if (data.args.performDrop)
- {
- if (data.draggedNodes != null)
- {
- AssetBundleModel.Model.HandleBundleReparent(data.draggedNodes, folder);
- Reload();
- }
- else if (data.paths != null)
- {
- DragPathsToNewSpace(data.paths, folder);
- }
- }
- }
- else
- visualMode = DragAndDropVisualMode.Rejected; //must be a variantfolder
-
- }
- return visualMode;
- }
- private DragAndDropVisualMode HandleDragDropBetween(DragAndDropData data)
- {
- DragAndDropVisualMode visualMode = DragAndDropVisualMode.Copy;//Move;
- var parent = (data.args.parentItem as AssetBundleModel.BundleTreeItem);
- if (parent != null)
- {
- var variantFolder = parent.bundle as AssetBundleModel.BundleVariantFolderInfo;
- if (variantFolder != null)
- return DragAndDropVisualMode.Rejected;
- if (data.args.performDrop)
- {
- var folder = parent.bundle as AssetBundleModel.BundleFolderConcreteInfo;
- if (folder != null)
- {
- if (data.draggedNodes != null)
- {
- AssetBundleModel.Model.HandleBundleReparent(data.draggedNodes, folder);
- Reload();
- }
- else if (data.paths != null)
- {
- DragPathsToNewSpace(data.paths, folder);
- }
- }
- }
- }
- return visualMode;
- }
- private string[] dragToNewSpacePaths = null;
- private AssetBundleModel.BundleFolderInfo dragToNewSpaceRoot = null;
- private void DragPathsAsOneBundle()
- {
- var newBundle = AssetBundleModel.Model.CreateEmptyBundle(dragToNewSpaceRoot);
- AssetBundleModel.Model.MoveAssetToBundle(dragToNewSpacePaths, newBundle.m_Name.bundleName, newBundle.m_Name.variant);
- AssetBundleModel.Model.ExecuteAssetMove();
- ReloadAndSelect(newBundle.nameHashCode, true);
- }
- private void DragPathsAsManyBundles()
- {
- List<int> hashCodes = new List<int>();
- foreach (var assetPath in dragToNewSpacePaths)
- {
- var newBundle = AssetBundleModel.Model.CreateEmptyBundle(dragToNewSpaceRoot, System.IO.Path.GetFileNameWithoutExtension(assetPath).ToLower());
- AssetBundleModel.Model.MoveAssetToBundle(assetPath, newBundle.m_Name.bundleName, newBundle.m_Name.variant);
- hashCodes.Add(newBundle.nameHashCode);
- }
- AssetBundleModel.Model.ExecuteAssetMove();
- ReloadAndSelect(hashCodes);
- }
- private void DragPathsToNewSpace(string[] paths, AssetBundleModel.BundleFolderInfo root)
- {
- dragToNewSpacePaths = paths;
- dragToNewSpaceRoot = root;
- if (paths.Length > 1)
- {
- GenericMenu menu = new GenericMenu();
- menu.AddItem(new GUIContent("Create 1 Bundle"), false, DragPathsAsOneBundle);
- var message = "Create ";
- message += paths.Length;
- message += " Bundles";
- menu.AddItem(new GUIContent(message), false, DragPathsAsManyBundles);
- menu.ShowAsContext();
- }
- else
- DragPathsAsManyBundles();
- }
- protected override void SetupDragAndDrop(SetupDragAndDropArgs args)
- {
- DragAndDrop.PrepareStartDrag();
- var selectedBundles = new List<AssetBundleModel.BundleInfo>();
- foreach (var id in args.draggedItemIDs)
- {
- var item = FindItem(id, rootItem) as AssetBundleModel.BundleTreeItem;
- selectedBundles.Add(item.bundle);
- }
- DragAndDrop.paths = null;
- DragAndDrop.objectReferences = m_EmptyObjectList.ToArray();
- DragAndDrop.SetGenericData("AssetBundleModel.BundleInfo", selectedBundles);
- DragAndDrop.visualMode = DragAndDropVisualMode.Copy;//Move;
- DragAndDrop.StartDrag("AssetBundleTree");
- }
- protected override bool CanStartDrag(CanStartDragArgs args)
- {
- return true;
- }
- internal void Refresh()
- {
- var selection = GetSelection();
- Reload();
- SelectionChanged(selection);
- }
- private void ReloadAndSelect(int hashCode, bool rename)
- {
- var selection = new List<int>();
- selection.Add(hashCode);
- ReloadAndSelect(selection);
- if(rename)
- {
- BeginRename(FindItem(hashCode, rootItem), 0.25f);
- }
- }
- private void ReloadAndSelect(IList<int> hashCodes)
- {
- Reload();
- SetSelection(hashCodes, TreeViewSelectionOptions.RevealAndFrame);
- SelectionChanged(hashCodes);
- }
- }
- }
|