123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011 |
- using System;
- using UnityEngine;
- using UnityEditor;
- using System.Collections.Generic;
- using System.Linq;
- using UnityEditor.IMGUI.Controls;
- namespace AssetBundleBrowser.AssetBundleModel
- {
- internal sealed class BundleTreeItem : TreeViewItem
- {
- private BundleInfo m_Bundle;
- internal BundleInfo bundle
- {
- get { return m_Bundle; }
- }
- internal BundleTreeItem(BundleInfo b, int depth, Texture2D iconTexture) : base(b.nameHashCode, depth, b.displayName)
- {
- m_Bundle = b;
- icon = iconTexture;
- children = new List<TreeViewItem>();
- }
- internal MessageSystem.Message BundleMessage()
- {
- return m_Bundle.HighestMessage();
- }
- public override string displayName
- {
- get
- {
- return AssetBundleBrowserMain.instance.m_ManageTab.hasSearch ? m_Bundle.m_Name.fullNativeName : m_Bundle.displayName;
- }
- }
- }
- internal class BundleNameData
- {
- private List<string> m_PathTokens;
- private string m_FullBundleName;
- private string m_ShortName;
- private string m_VariantName;
- private string m_FullNativeName;
- //input (received from native) is a string of format:
- // /folder0/.../folderN/name.variant
- //it's broken into:
- // /m_pathTokens[0]/.../m_pathTokens[n]/m_shortName.m_variantName
- // and...
- // m_fullBundleName = /m_pathTokens[0]/.../m_pathTokens[n]/m_shortName
- // and...
- // m_fullNativeName = m_fullBundleName.m_variantName which is the same as the initial input.
- internal BundleNameData(string name) { SetName(name); }
- internal BundleNameData(string path, string name)
- {
- string finalName = System.String.IsNullOrEmpty(path) ? "" : path + '/';
- finalName += name;
- SetName(finalName);
- }
- public override int GetHashCode()
- {
- return fullNativeName.GetHashCode();
- }
- internal string fullNativeName
- { get { return m_FullNativeName; } }
- internal void SetBundleName(string bundleName, string variantName)
- {
- string name = bundleName;
- name += System.String.IsNullOrEmpty(variantName) ? "" : "." + variantName;
- SetName(name);
- }
- internal string bundleName
- {
- get { return m_FullBundleName; }
- //set { SetName(value); }
- }
- internal string shortName
- {
- get { return m_ShortName; }
- }
- internal string variant
- {
- get { return m_VariantName; }
- set
- {
- m_VariantName = value;
- m_FullNativeName = m_FullBundleName;
- m_FullNativeName += System.String.IsNullOrEmpty(m_VariantName) ? "" : "." + m_VariantName;
- }
- }
- internal List<string> pathTokens
- {
- get { return m_PathTokens; }
- set
- {
- m_PathTokens = value.GetRange(0, value.Count-1);
- SetShortName(value.Last());
- GenerateFullName();
- }
- }
- private void SetName(string name)
- {
- if(m_PathTokens == null)
- m_PathTokens = new List<string>();
- else
- m_PathTokens.Clear();
- int indexOfSlash = name.IndexOf('/');
- int previousIndex = 0;
- while(indexOfSlash != -1)
- {
- m_PathTokens.Add(name.Substring(previousIndex, (indexOfSlash - previousIndex)));
- previousIndex = indexOfSlash + 1;
- indexOfSlash = name.IndexOf('/', previousIndex);
- }
- SetShortName(name.Substring(previousIndex));
- GenerateFullName();
- }
- private void SetShortName(string inputName)
- {
- m_ShortName = inputName;
- int indexOfDot = m_ShortName.LastIndexOf('.');
- if (indexOfDot > -1)
- {
- m_VariantName = m_ShortName.Substring(indexOfDot + 1);
- m_ShortName = m_ShortName.Substring(0, indexOfDot);
- }
- else
- m_VariantName = string.Empty;
- }
- internal void PartialNameChange(string newToken, int indexFromBack)
- {
- if(indexFromBack == 0)
- {
- SetShortName(newToken);
- }
- else if(indexFromBack-1 < m_PathTokens.Count)
- {
- m_PathTokens[m_PathTokens.Count - indexFromBack] = newToken;
- }
- GenerateFullName();
- }
- private void GenerateFullName()
- {
- m_FullBundleName = string.Empty;
- for(int i = 0; i < m_PathTokens.Count; i++)
- {
- m_FullBundleName += m_PathTokens[i];
- m_FullBundleName += '/';
- }
- m_FullBundleName += m_ShortName;
- m_FullNativeName = m_FullBundleName;
- m_FullNativeName += System.String.IsNullOrEmpty(m_VariantName) ? "" : "." + m_VariantName;
- }
- }
- internal abstract class BundleInfo
- {
- protected BundleFolderInfo m_Parent;
- protected bool m_DoneUpdating;
- protected bool m_Dirty;
- internal BundleNameData m_Name;
- protected MessageSystem.MessageState m_BundleMessages = new MessageSystem.MessageState();
- protected MessageSystem.Message m_CachedHighMessage = null;
- internal BundleInfo(string name, BundleFolderInfo parent)
- {
- m_Name = new BundleNameData(name);
- m_Parent = parent;
- }
- internal BundleFolderInfo parent
- { get { return m_Parent; } }
- internal virtual string displayName
- {
- get { return m_Name.shortName; }
- }
- internal virtual int nameHashCode
- {
- get { return m_Name.GetHashCode(); }
- }
- internal abstract BundleTreeItem CreateTreeView(int depth);
- protected virtual void RefreshMessages()
- {
- RefreshEmptyStatus();
- RefreshDupeAssetWarning();
- var flag = m_BundleMessages.HighestMessageFlag();
- m_CachedHighMessage = MessageSystem.GetMessage(flag);
- }
- internal abstract bool RefreshEmptyStatus();
- internal abstract bool RefreshDupeAssetWarning();
- internal virtual MessageSystem.Message HighestMessage()
- {
- if (m_CachedHighMessage == null)
- RefreshMessages();
- return m_CachedHighMessage;
- }
- internal bool IsMessageSet(MessageSystem.MessageFlag flag)
- {
- return m_BundleMessages.IsSet(flag);
- }
- internal void SetMessageFlag(MessageSystem.MessageFlag flag, bool on)
- {
- m_BundleMessages.SetFlag(flag, on);
- }
- internal List<MessageSystem.Message> GetMessages()
- {
- return m_BundleMessages.GetMessages();
- }
- internal bool HasMessages()
- {
- return m_BundleMessages.HasMessages();
- }
- internal virtual bool HandleRename(string newName, int reverseDepth)
- {
- if (reverseDepth == 0)
- {
- if (!m_Parent.HandleChildRename(m_Name.shortName, newName))
- return false;
- }
- m_Name.PartialNameChange(newName, reverseDepth);
- return true;
- }
- internal virtual void HandleDelete(bool isRootOfDelete, string forcedNewName="", string forcedNewVariant = "")
- {
- if(isRootOfDelete)
- {
- m_Parent.HandleChildRename(m_Name.shortName, string.Empty);
- }
- }
- abstract internal void RefreshAssetList();
- abstract internal void AddAssetsToNode(AssetTreeItem node);
- abstract internal void Update();
- internal virtual bool doneUpdating
- { get { return m_DoneUpdating; } }
- internal virtual bool dirty
- { get { return m_Dirty; } }
- internal void ForceNeedUpdate()
- {
- m_DoneUpdating = false;
- m_Dirty = true;
- }
- abstract internal void HandleReparent(string parentName, BundleFolderInfo newParent = null);
- abstract internal List<AssetInfo> GetDependencies();
- abstract internal bool DoesItemMatchSearch(string search);
- }
- internal class BundleDataInfo : BundleInfo
- {
- protected List<AssetInfo> m_ConcreteAssets;
- protected List<AssetInfo> m_DependentAssets;
- protected HashSet<string> m_BundleDependencies;
- protected int m_ConcreteCounter;
- protected int m_DependentCounter;
- protected bool m_IsSceneBundle;
- protected long m_TotalSize;
- internal BundleDataInfo(string name, BundleFolderInfo parent) : base(name, parent)
- {
- m_ConcreteAssets = new List<AssetInfo>();
- m_DependentAssets = new List<AssetInfo>();
- m_BundleDependencies = new HashSet<string>();
- m_ConcreteCounter = 0;
- m_DependentCounter = 0;
- }
- ~BundleDataInfo()
- {
- foreach (var asset in m_DependentAssets)
- {
- AssetBundleModel.Model.UnRegisterAsset(asset, m_Name.fullNativeName);
- }
- }
- internal override bool HandleRename(string newName, int reverseDepth)
- {
- RefreshAssetList();
- if (!base.HandleRename(newName, reverseDepth))
- return false;
- Model.MoveAssetToBundle(m_ConcreteAssets, m_Name.bundleName, m_Name.variant);
- return true;
- }
- internal override void HandleDelete(bool isRootOfDelete, string forcedNewName="", string forcedNewVariant="")
- {
- RefreshAssetList();
- base.HandleDelete(isRootOfDelete);
- Model.MoveAssetToBundle(m_ConcreteAssets, forcedNewName, forcedNewVariant);
- }
- internal string TotalSize()
- {
- if (m_TotalSize == 0)
- return "--";
- return EditorUtility.FormatBytes(m_TotalSize);
- }
- internal override void RefreshAssetList()
- {
- m_BundleMessages.SetFlag(MessageSystem.MessageFlag.AssetsDuplicatedInMultBundles, false);
- m_BundleMessages.SetFlag(MessageSystem.MessageFlag.SceneBundleConflict, false);
- m_BundleMessages.SetFlag(MessageSystem.MessageFlag.DependencySceneConflict, false);
- m_ConcreteAssets.Clear();
- m_TotalSize = 0;
- m_IsSceneBundle = false;
- foreach (var asset in m_DependentAssets)
- {
- AssetBundleModel.Model.UnRegisterAsset(asset, m_Name.fullNativeName);
- }
- m_DependentAssets.Clear();
- m_BundleDependencies.Clear();
-
- bool assetInBundle = false;
- bool sceneError = false;
- var assets = AssetBundleModel.Model.DataSource.GetAssetPathsFromAssetBundle(m_Name.fullNativeName);
- foreach(var assetName in assets)
- {
- if (AssetDatabase.GetMainAssetTypeAtPath(assetName) == typeof(SceneAsset))
- {
- m_IsSceneBundle = true;
- if(assetInBundle)
- sceneError = true;
- }
- else
- {
- assetInBundle = true;
- if (m_IsSceneBundle)
- sceneError = true;
- }
- var bundleName = Model.GetBundleName(assetName);
- if (System.String.IsNullOrEmpty(bundleName))
- {
- ///we get here if the current asset is only added due to being in an explicitly added folder
-
- var partialPath = assetName;
- while(
- !System.String.IsNullOrEmpty(partialPath) &&
- partialPath != "Assets" &&
- System.String.IsNullOrEmpty(bundleName))
- {
- partialPath = partialPath.Substring(0, partialPath.LastIndexOf('/'));
- bundleName = Model.GetBundleName(partialPath);
- }
- if(!System.String.IsNullOrEmpty(bundleName))
- {
- var folderAsset = Model.CreateAsset(partialPath, bundleName);
- folderAsset.isFolder = true;
- if (m_ConcreteAssets.FindIndex(a => a.displayName == folderAsset.displayName) == -1)
- {
- m_ConcreteAssets.Add(folderAsset);
- }
-
- m_DependentAssets.Add(Model.CreateAsset(assetName, folderAsset));
- if (m_DependentAssets != null && m_DependentAssets.Count > 0)
- {
- var last = m_DependentAssets.Last();
- if (last != null)
- m_TotalSize += last.fileSize;
- }
- }
- }
- else
- {
- var newAsset = Model.CreateAsset (assetName, m_Name.fullNativeName);
- if (newAsset != null)
- {
- m_ConcreteAssets.Add(newAsset);
- m_TotalSize += m_ConcreteAssets.Last().fileSize;
- if (AssetDatabase.GetMainAssetTypeAtPath(assetName) == typeof(SceneAsset))
- {
- m_IsSceneBundle = true;
- m_ConcreteAssets.Last().isScene = true;
- }
- }
- }
- }
-
- if(sceneError)
- {
- foreach (var asset in m_ConcreteAssets)
- {
- if (asset.isFolder)
- {
- asset.SetMessageFlag(MessageSystem.MessageFlag.DependencySceneConflict, true);
- m_BundleMessages.SetFlag(MessageSystem.MessageFlag.DependencySceneConflict, true);
- }
- else
- {
- asset.SetMessageFlag(MessageSystem.MessageFlag.SceneBundleConflict, true);
- m_BundleMessages.SetFlag(MessageSystem.MessageFlag.SceneBundleConflict, true);
- }
- }
- }
- m_ConcreteCounter = 0;
- m_DependentCounter = 0;
- m_Dirty = true;
- }
- internal override void AddAssetsToNode(AssetTreeItem node)
- {
- foreach (var asset in m_ConcreteAssets)
- node.AddChild(new AssetTreeItem(asset));
- foreach (var asset in m_DependentAssets)
- {
- if(!node.ContainsChild(asset))
- node.AddChild(new AssetTreeItem(asset));
- }
- m_Dirty = false;
- }
- internal HashSet<string> GetBundleDependencies()
- {
- return m_BundleDependencies;
- }
- internal override void Update()
- {
- int dependents = m_DependentAssets.Count;
- int bundleDep = m_BundleDependencies.Count;
- if(m_ConcreteCounter < m_ConcreteAssets.Count)
- {
- GatherDependencies(m_ConcreteAssets[m_ConcreteCounter]);
- m_ConcreteCounter++;
- m_DoneUpdating = false;
- }
- else if (m_DependentCounter < m_DependentAssets.Count)
- {
- GatherDependencies(m_DependentAssets[m_DependentCounter], m_Name.fullNativeName);
- m_DependentCounter++;
- m_DoneUpdating = false;
- }
- else
- {
- m_DoneUpdating = true;
- }
- m_Dirty = (dependents != m_DependentAssets.Count) || (bundleDep != m_BundleDependencies.Count);
- if (m_Dirty || m_DoneUpdating)
- RefreshMessages();
- }
- private void GatherDependencies(AssetInfo asset, string parentBundle = "")
- {
- if (System.String.IsNullOrEmpty(parentBundle))
- parentBundle = asset.bundleName;
- if (asset == null)
- return;
- var deps = asset.GetDependencies();
- if (deps == null)
- return;
- foreach (var ai in deps)
- {
- if (ai == asset || m_ConcreteAssets.Contains(ai) || m_DependentAssets.Contains(ai))
- continue;
- var bundleName = AssetBundleModel.Model.DataSource.GetImplicitAssetBundleName(ai.fullAssetName);
- if (string.IsNullOrEmpty(bundleName))
- {
- m_DependentAssets.Add(ai);
- m_TotalSize += ai.fileSize;
- if (Model.RegisterAsset(ai, parentBundle) > 1)
- {
- SetDuplicateWarning();
- }
- }
- else if(bundleName != m_Name.fullNativeName)
- {
- m_BundleDependencies.Add(bundleName);
- }
- }
- }
- internal override bool RefreshDupeAssetWarning()
- {
- foreach(var asset in m_DependentAssets)
- {
- if (asset != null && asset.IsMessageSet(MessageSystem.MessageFlag.AssetsDuplicatedInMultBundles))
- {
- SetDuplicateWarning();
- return true;
- }
- }
- return false;
- }
- internal bool IsEmpty()
- {
- return (m_ConcreteAssets.Count == 0);
- }
- internal override bool RefreshEmptyStatus()
- {
- bool empty = IsEmpty();
- m_BundleMessages.SetFlag(MessageSystem.MessageFlag.EmptyBundle, empty);
- return empty;
- }
- protected void SetDuplicateWarning()
- {
- m_BundleMessages.SetFlag(MessageSystem.MessageFlag.AssetsDuplicatedInMultBundles, true);
- m_Dirty = true;
- }
- internal bool isSceneBundle
- { get { return m_IsSceneBundle; } }
- internal override BundleTreeItem CreateTreeView(int depth)
- {
- RefreshAssetList();
- RefreshMessages();
- if (isSceneBundle)
- return new BundleTreeItem(this, depth, Model.GetSceneIcon());
- else
- return new BundleTreeItem(this, depth, Model.GetBundleIcon());
- }
- internal override void HandleReparent(string parentName, BundleFolderInfo newParent = null)
- {
- RefreshAssetList();
- string newName = System.String.IsNullOrEmpty(parentName) ? "" : parentName + '/';
- newName += m_Name.shortName;
- if (newName == m_Name.bundleName)
- return;
- if (newParent != null && newParent.GetChild(newName) != null)
- {
- Model.LogWarning("An item named '" + newName + "' already exists at this level in hierarchy. If your desire is to merge bundles, drag one on top of the other.");
- return;
- }
-
- foreach (var asset in m_ConcreteAssets)
- {
- Model.MoveAssetToBundle(asset, newName, m_Name.variant);
- }
- if (newParent != null)
- {
- m_Parent.HandleChildRename(m_Name.shortName, string.Empty);
- m_Parent = newParent;
- m_Parent.AddChild(this);
- }
- m_Name.SetBundleName(newName, m_Name.variant);
- }
- internal override List<AssetInfo> GetDependencies()
- {
- return m_DependentAssets;
- }
- internal override bool DoesItemMatchSearch(string search)
- {
- foreach(var asset in m_ConcreteAssets)
- {
- if (asset.displayName.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0)
- return true;
- }
- foreach (var asset in m_DependentAssets)
- {
- if (asset.displayName.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0)
- return true;
- }
- return false;
- }
- }
- internal class BundleVariantDataInfo : BundleDataInfo
- {
- protected List<AssetInfo> m_FolderIncludeAssets = new List<AssetInfo>();
- internal BundleVariantDataInfo(string name, BundleFolderInfo parent) : base(name, parent)
- {
- }
- internal override string displayName
- {
- get { return m_Name.variant; }
- }
- internal override void Update()
- {
- base.Update();
- (m_Parent as BundleVariantFolderInfo).ValidateVariants();
- }
- internal override void RefreshAssetList()
- {
- m_FolderIncludeAssets.Clear();
- base.RefreshAssetList();
- if(m_DependentAssets.Count > 0)
- m_FolderIncludeAssets = new List<AssetInfo>(m_DependentAssets);
- }
- internal bool IsSceneVariant()
- {
- RefreshAssetList();
- return isSceneBundle;
- }
- internal override bool HandleRename(string newName, int reverseDepth)
- {
- if (reverseDepth == 0)
- {
- RefreshAssetList();
- if (!m_Parent.HandleChildRename(m_Name.variant, newName))
- return false;
- m_Name.variant = newName;
- Model.MoveAssetToBundle(m_ConcreteAssets, m_Name.bundleName, m_Name.variant);
- }
- else if (reverseDepth == 1)
- {
- RefreshAssetList();
- m_Name.PartialNameChange(newName + "." + m_Name.variant, 0);
- Model.MoveAssetToBundle(m_ConcreteAssets, m_Name.bundleName, m_Name.variant);
- }
- else
- {
- return base.HandleRename(newName, reverseDepth-1);
- }
- return true;
- }
- internal override void HandleDelete(bool isRootOfDelete, string forcedNewName = "", string forcedNewVariant = "")
- {
- RefreshAssetList();
- if (isRootOfDelete)
- {
- m_Parent.HandleChildRename(m_Name.variant, string.Empty);
- }
- Model.MoveAssetToBundle(m_ConcreteAssets, forcedNewName, forcedNewVariant);
- }
- internal bool FindContentMismatch(BundleVariantDataInfo other)
- {
- bool result = false;
- if (m_FolderIncludeAssets.Count != 0 || other.m_FolderIncludeAssets.Count != 0)
- {
- var myUniqueAssets = new HashSet<string>();
- var otherUniqueAssets = new HashSet<string>(other.m_FolderIncludeAssets.Select(x => x.displayName));
- foreach (var asset in m_FolderIncludeAssets)
- {
- if (!otherUniqueAssets.Remove(asset.displayName))
- {
- myUniqueAssets.Add(asset.displayName);
- }
- }
- if (myUniqueAssets.Count > 0)
- {
- m_BundleMessages.SetFlag(MessageSystem.MessageFlag.VariantBundleMismatch, true);
- result = true;
- }
- if (otherUniqueAssets.Count > 0)
- {
- other.m_BundleMessages.SetFlag(MessageSystem.MessageFlag.VariantBundleMismatch, true);
- result = true;
- }
- }
- else //this doesn't cover the super weird case of including a folder and some explicit assets. TODO - fix that.
- {
- var myUniqueAssets = new HashSet<string>();
- var otherUniqueAssets = new HashSet<string>(other.m_ConcreteAssets.Select(x => x.displayName));
- foreach (var asset in m_ConcreteAssets)
- {
- if (!otherUniqueAssets.Remove(asset.displayName))
- {
- myUniqueAssets.Add(asset.displayName);
- }
- }
- if (myUniqueAssets.Count > 0)
- {
- m_BundleMessages.SetFlag(MessageSystem.MessageFlag.VariantBundleMismatch, true);
- result = true;
- }
- if (otherUniqueAssets.Count > 0)
- {
- other.m_BundleMessages.SetFlag(MessageSystem.MessageFlag.VariantBundleMismatch, true);
- result = true;
- }
- }
- return result;
- }
- }
- internal abstract class BundleFolderInfo : BundleInfo
- {
- protected Dictionary<string, BundleInfo> m_Children;
- internal BundleFolderInfo(string name, BundleFolderInfo parent) : base(name, parent)
- {
- m_Children = new Dictionary<string, BundleInfo>();
- }
-
- internal BundleFolderInfo(List<string> path, int depth, BundleFolderInfo parent) : base("", parent)
- {
- m_Children = new Dictionary<string, BundleInfo>();
- m_Name = new BundleNameData("");
- m_Name.pathTokens = path.GetRange(0, depth);
- }
- internal BundleInfo GetChild(string name)
- {
- if (name == null)
- return null;
- BundleInfo info = null;
- if (m_Children.TryGetValue(name, out info))
- return info;
- return null;
- }
- internal Dictionary<string, BundleInfo>.ValueCollection GetChildList()
- {
- return m_Children.Values;
- }
- internal abstract void AddChild(BundleInfo info);
- internal override bool HandleRename(string newName, int reverseDepth)
- {
- if (!base.HandleRename(newName, reverseDepth))
- return false;
- foreach (var child in m_Children)
- {
- child.Value.HandleRename(newName, reverseDepth + 1);
- }
- return true;
- }
- internal override void HandleDelete(bool isRootOfDelete, string forcedNewName="", string forcedNewVariant = "")
- {
- base.HandleDelete(isRootOfDelete);
- foreach (var child in m_Children)
- {
- child.Value.HandleDelete(false, forcedNewName, forcedNewVariant);
- }
- m_Children.Clear();
- }
- internal override bool DoesItemMatchSearch(string search)
- {
- return false; //folders don't ever match.
- }
- protected override void RefreshMessages()
- {
- m_BundleMessages.SetFlag(MessageSystem.MessageFlag.ErrorInChildren, false);
- foreach(var child in m_Children)
- {
- if (child.Value.IsMessageSet(MessageSystem.MessageFlag.Error))
- {
- m_BundleMessages.SetFlag(MessageSystem.MessageFlag.ErrorInChildren, true);
- break;
- }
- }
- base.RefreshMessages();
- }
- internal override bool RefreshEmptyStatus()
- {
- bool empty = m_Children.Count == 0;
- foreach (var child in m_Children)
- {
- empty |= child.Value.RefreshEmptyStatus();
- }
- m_BundleMessages.SetFlag(MessageSystem.MessageFlag.EmptyFolder, empty);
- return empty;
- }
- internal override void RefreshAssetList()
- {
- foreach (var child in m_Children)
- {
- child.Value.RefreshAssetList();
- }
- }
- internal override bool RefreshDupeAssetWarning()
- {
- bool dupeWarning = false;
- foreach (var child in m_Children)
- {
- dupeWarning |= child.Value.RefreshDupeAssetWarning();
- }
- m_BundleMessages.SetFlag(MessageSystem.MessageFlag.WarningInChildren, dupeWarning);
- return dupeWarning;
- }
- internal override void AddAssetsToNode(AssetTreeItem node)
- {
- foreach (var child in m_Children)
- {
- child.Value.AddAssetsToNode(node);
- }
- m_Dirty = false;
- }
- internal virtual bool HandleChildRename(string oldName, string newName)
- {
- if (!System.String.IsNullOrEmpty(newName) && m_Children.ContainsKey(newName))
- {
- Model.LogWarning("Attempting to name an item '" + newName + "' which matches existing name at this level in hierarchy. If your desire is to merge bundles, drag one on top of the other.");
- return false;
- }
- BundleInfo info = null;
- if (m_Children.TryGetValue(oldName, out info))
- {
- m_Children.Remove(oldName);
- if (!System.String.IsNullOrEmpty(newName))
- m_Children.Add(newName, info);
- }
- return true;
- }
- internal override void Update()
- {
- m_Dirty = false;
- m_DoneUpdating = true;
- foreach (var child in m_Children)
- {
- child.Value.Update();
- m_Dirty |= child.Value.dirty;
- m_DoneUpdating &= child.Value.doneUpdating;
- }
- if (m_Dirty || m_DoneUpdating)
- RefreshMessages();
- }
- internal override bool doneUpdating
- {
- get
- {
- foreach (var child in m_Children)
- {
- m_DoneUpdating &= child.Value.doneUpdating;
- }
- return base.doneUpdating;
- }
- }
- internal override List<AssetInfo> GetDependencies()
- {
- List<AssetInfo> assets = new List<AssetInfo>();
- foreach (var child in m_Children)
- {
- assets.AddRange(child.Value.GetDependencies());
- }
- return assets;
- }
- }
- internal class BundleFolderConcreteInfo : BundleFolderInfo
- {
- internal BundleFolderConcreteInfo(string name, BundleFolderInfo parent) : base(name, parent)
- {
- }
- internal BundleFolderConcreteInfo(List<string> path, int depth, BundleFolderInfo parent) : base(path, depth, parent)
- {
- }
- internal override void AddChild(BundleInfo info)
- {
- m_Children.Add(info.displayName, info);
- }
- internal override BundleTreeItem CreateTreeView(int depth)
- {
- RefreshMessages();
- var result = new BundleTreeItem(this, depth, Model.GetFolderIcon());
- foreach (var child in m_Children)
- {
- result.AddChild(child.Value.CreateTreeView(depth + 1));
- }
- return result;
- }
- internal override void HandleReparent(string parentName, BundleFolderInfo newParent = null)
- {
- string newName = System.String.IsNullOrEmpty(parentName) ? "" : parentName + '/';
- newName += displayName;
- if (newName == m_Name.bundleName)
- return;
- if (newParent != null && newParent.GetChild(newName) != null)
- {
- Model.LogWarning("An item named '" + newName + "' already exists at this level in hierarchy. If your desire is to merge bundles, drag one on top of the other.");
- return;
- }
- foreach (var child in m_Children)
- {
- child.Value.HandleReparent(newName);
- }
- if (newParent != null)
- {
- m_Parent.HandleChildRename(m_Name.shortName, string.Empty);
- m_Parent = newParent;
- m_Parent.AddChild(this);
- }
- m_Name.SetBundleName(newName, m_Name.variant);
- }
- }
- internal class BundleVariantFolderInfo : BundleFolderInfo
- {
- internal BundleVariantFolderInfo(string name, BundleFolderInfo parent) : base(name, parent)
- {
- }
- internal override void AddChild(BundleInfo info)
- {
- m_Children.Add(info.m_Name.variant, info);
- }
- private bool m_validated;
- internal override void Update()
- {
- m_validated = false;
- base.Update();
- if(!m_validated)
- ValidateVariants();
- }
- internal void ValidateVariants()
- {
- m_validated = true;
- bool childMismatch = false;
- if(m_Children.Count > 1)
- {
- BundleVariantDataInfo goldChild = null;
- foreach(var c in m_Children)
- {
- var child = c.Value as BundleVariantDataInfo;
- child.SetMessageFlag(MessageSystem.MessageFlag.VariantBundleMismatch, false);
- if (goldChild == null)
- {
- goldChild = child;
- continue;
- }
- childMismatch |= goldChild.FindContentMismatch(child);
- }
- }
- m_BundleMessages.SetFlag(MessageSystem.MessageFlag.VariantBundleMismatch, childMismatch);
- }
- internal override BundleTreeItem CreateTreeView(int depth)
- {
- RefreshMessages();
- Texture2D icon = null;
- if ((m_Children.Count > 0) &&
- ((m_Children.First().Value as BundleVariantDataInfo).IsSceneVariant()))
- {
- icon = Model.GetSceneIcon();
- }
- else
- icon = Model.GetBundleIcon();
- var result = new BundleTreeItem(this, depth, icon);
- foreach (var child in m_Children)
- {
- result.AddChild(child.Value.CreateTreeView(depth + 1));
- }
- return result;
- }
- internal override void HandleReparent(string parentName, BundleFolderInfo newParent = null)
- {
- string newName = System.String.IsNullOrEmpty(parentName) ? "" : parentName + '/';
- newName += displayName;
- if (newName == m_Name.bundleName)
- return;
- if (newParent != null && newParent.GetChild(newName) != null)
- {
- Model.LogWarning("An item named '" + newName + "' already exists at this level in hierarchy. If your desire is to merge bundles, drag one on top of the other.");
- return;
- }
- foreach (var child in m_Children)
- {
- child.Value.HandleReparent(parentName);
- }
- if (newParent != null)
- {
- m_Parent.HandleChildRename(m_Name.shortName, string.Empty);
- m_Parent = newParent;
- m_Parent.AddChild(this);
- }
- m_Name.SetBundleName(newName, string.Empty) ;
- }
- internal override bool HandleChildRename(string oldName, string newName)
- {
- var result = base.HandleChildRename(oldName, newName);
- if (m_Children.Count == 0)
- HandleDelete(true);
- return result;
- }
- }
- }
|