protected override bool AddElement(IHashedSO obj) { if (obj is T t) { _list.Add(t); } return(obj is T); }
bool IHashedSOCollectionEditor.EditorRequestMember(Object obj, bool forceCorrectPosition = false) { var t = obj as IHashedSO; if (t == null) { return(false); } int hashID = t.HashID; IHashedSO element = (hashID < Count && hashID >= 0) ? GetElementBase(hashID) : null; if (element == null && hashID >= 0) { SetRealPosition(t); Editor_Log.Add($"Request Member:\nOn [{hashID}] set {t.ToStringOrNull()}, was NULL before"); return(false); } if (Contains(t)) { if ((t != element && hashID != element.HashID) || forceCorrectPosition) { Editor_Log.Add($"Request Member:\nOn [{hashID}] removed {element.ToStringOrNull()} and replace with {t.ToStringOrNull()}"); SetRealPosition(t); } return(false); } bool fromDialog = false; if (hashID < 0 || hashID >= Count || element != t) { var assetPath = AssetDatabase.GetAssetPath((Object)t); var assetGuid = UnityEditor.AssetDatabase.AssetPathToGUID(assetPath); bool isDuplicateFromOtherFile = t.GUID != assetGuid; if (!isDuplicateFromOtherFile) { if (!ResolveConflictedFile(t, assetPath)) { return(false); } fromDialog = !EditorCanChangeIDsToOptimizeSpace; } } var newID = Count; Editor_Log.Add($"Request Member:\nOn [{newID}] setted {t.ToStringOrNull()} with new hashID{(fromDialog ? " with dialog permission" : "")}"); AddElement(t); ((IHashedSOEditor)t).SetHashID(newID); UnityEditor.EditorUtility.SetDirty((Object)t); UnityEditor.EditorUtility.SetDirty(this); return(true); }
protected override bool ResolveConflictedFile(IHashedSO t, string assetPath) { if (!UnityEditor.EditorUtility.DisplayDialog("Conflict on PermanentHashedSOCollection", $"{( (Object)t ).NameOrNull()} already has an ID but it's not on the appropriate list ({this.name}). Assign a new ID for it?", "Yes", "No, delete it")) { AssetDatabase.DeleteAsset(assetPath); return(false); } return(true); }
protected override bool SetRealPosition(IHashedSO obj) { var t = obj as T; if (t == null) { return(false); } var id = obj.HashID; if (id < 0) { return(false); } while (id >= _list.Count) { _list.Add(null); } _list[id] = t; UnityEditor.EditorUtility.SetDirty(this); return(true); }
public abstract bool Contains(IHashedSO element);
protected abstract bool SetRealPosition(IHashedSO obj);
protected abstract bool ResolveConflictedFile(IHashedSO t, string assetPath);
protected abstract bool AddElement(IHashedSO obj);
public static int HashIdOrNull(this IHashedSO hso) => (hso != null) ? hso.HashID : -1;
protected override bool ResolveConflictedFile(IHashedSO t, string assetPath) => true;
public override bool Contains(IHashedSO obj) => _list.Contains(obj as T);