示例#1
0
 /// <inheritdoc/>
 protected override void OnContentChanged([NotNull] MemberNodeChangeEventArgs args)
 {
     RelinkToOwnerPart((IAssetNode)args.Member, args.NewValue);
     base.OnContentChanged(args);
 }
示例#2
0
 private void BasePrefabChanged(object sender, MemberNodeChangeEventArgs e)
 {
     UpdateSourcePrefab();
 }
示例#3
0
 private void ValueChanged(object sender, MemberNodeChangeEventArgs e)
 {
     UpdateLink();
 }
示例#4
0
 private void ContentChanged(object sender, MemberNodeChangeEventArgs e)
 {
     Changed?.Invoke(sender, e);
 }
示例#5
0
        private void ContentChanged(object sender, MemberNodeChangeEventArgs e)
        {
            // Make sure that we have item ids everywhere we're supposed to.
            AssetCollectionItemIdHelper.GenerateMissingItemIds(e.Member.Retrieve());

            // Clear the cached item identifier collection.
            collectionItemIdentifiers = null;

            var node = (AssetMemberNode)e.Member;

            if (node.IsNonIdentifiableCollectionContent)
            {
                return;
            }

            // Create new ids for collection items
            var baseNode     = (AssetMemberNode)BaseContent;
            var isOverriding = baseNode != null && !PropertyGraph.UpdatingPropertyFromBase;
            var removedId    = ItemId.Empty;

            switch (e.ChangeType)
            {
            case ContentChangeType.ValueChange:
            case ContentChangeType.CollectionUpdate:
                break;

            case ContentChangeType.CollectionAdd:
            {
                var collectionDescriptor = e.Member.Descriptor as CollectionDescriptor;
                var itemIds = CollectionItemIdHelper.GetCollectionItemIds(e.Member.Retrieve());
                // Compute the id we will add for this item
                ItemId itemId;
                if (baseNode != null && PropertyGraph.UpdatingPropertyFromBase)
                {
                    var baseCollection = baseNode.Retrieve();
                    var baseIds        = CollectionItemIdHelper.GetCollectionItemIds(baseCollection);
                    itemId = itemIds.FindMissingId(baseIds);
                }
                else
                {
                    itemId = restoringId != ItemId.Empty ? restoringId : ItemId.New();
                }
                // Add the id to the proper location (insert or add)
                if (collectionDescriptor != null)
                {
                    if (e.Index != Index.Empty)
                    {
                        itemIds.Insert(e.Index.Int, itemId);
                    }
                    else
                    {
                        throw new InvalidOperationException("An item has been added to a collection that does not have a predictable Add. Consider using NonIdentifiableCollectionItemsAttribute on this collection.");
                    }
                }
                else
                {
                    itemIds[e.Index.Value] = itemId;
                }
            }
            break;

            case ContentChangeType.CollectionRemove:
            {
                var collectionDescriptor = e.Member.Descriptor as CollectionDescriptor;
                if (collectionDescriptor != null)
                {
                    var itemIds = CollectionItemIdHelper.GetCollectionItemIds(e.Member.Retrieve());
                    removedId = itemIds.DeleteAndShift(e.Index.Int, isOverriding);
                }
                else
                {
                    var itemIds = CollectionItemIdHelper.GetCollectionItemIds(e.Member.Retrieve());
                    removedId = itemIds.Delete(e.Index.Value, isOverriding);
                }
            }
            break;

            default:
                throw new ArgumentOutOfRangeException();
            }


            // Don't update override if propagation from base is disabled.
            if (PropertyGraph?.Container?.PropagateChangesFromBase == false)
            {
                return;
            }

            // Mark it as New if it does not come from the base
            if (baseNode != null && !PropertyGraph.UpdatingPropertyFromBase && !ResettingOverride)
            {
                if (e.ChangeType != ContentChangeType.CollectionRemove)
                {
                    if (e.Index == Index.Empty)
                    {
                        OverrideContent(!ResettingOverride);
                    }
                    else
                    {
                        OverrideItem(!ResettingOverride, e.Index);
                    }
                }
                else
                {
                    OverrideDeletedItem(true, removedId);
                }
            }
        }