Esempio n. 1
0
        /// <inheritdoc />
        public override Task RemovePart([NotNull] EntityHierarchyElementViewModel parent, Entity assetSidePart)
        {
            EnsureAssetAccess();

            return(InvokeAsync(() =>
            {
                Logger.Debug($"Removing entity {assetSidePart.Id} from game-side scene");
                var partId = new AbsoluteId(AssetId.Empty, assetSidePart.Id);
                var part = (Entity)FindPart(partId);
                if (part == null)
                {
                    throw new InvalidOperationException($"The given {nameof(assetSidePart.Id)} does not correspond to any existing part.");
                }

                if (parent is PrefabRootViewModel)
                {
                    Game.UnloadEntity(part);
                }
                else
                {
                    var parentEntity = (Entity)FindPart(parent.Id);
                    if (parentEntity == null)
                    {
                        throw new InvalidOperationException($"The given {nameof(parent.Id)} does not correspond to any existing part.");
                    }

                    var i = parentEntity.Transform.Children.IndexOf(part.Transform);
                    GameSideNodeContainer.GetNode(parentEntity.Transform.Children).Remove(part.Transform, new NodeIndex(i));
                }
            }));
        }
Esempio n. 2
0
        /// <inheritdoc />
        public override Task AddPart([NotNull] EntityHierarchyElementViewModel parent, Entity assetSidePart)
        {
            EnsureAssetAccess();

            var gameSidePart = ClonePartForGameSide(parent.Asset.Asset, assetSidePart);

            return(InvokeAsync(() =>
            {
                Logger.Debug($"Adding entity {assetSidePart.Id} to game-side scene");
                if (parent is PrefabRootViewModel)
                {
                    Game.LoadEntity(gameSidePart);
                }
                else
                {
                    var parentEntity = (Entity)FindPart(parent.Id);
                    if (parentEntity == null)
                    {
                        throw new InvalidOperationException($"The given {nameof(parent.Id)} does not correspond to any existing part.");
                    }

                    GameSideNodeContainer.GetNode(parentEntity.Transform.Children).Add(gameSidePart.Transform);
                }
            }));
        }
Esempio n. 3
0
        /// <inheritdoc />
        public override Task RemovePart([NotNull] UIHierarchyItemViewModel parent, UIElement assetSidePart)
        {
            EnsureAssetAccess();

            return(InvokeAsync(() =>
            {
                Logger.Debug($"Removing element {assetSidePart.Id} from game-side scene");
                var partId = new AbsoluteId(AssetId.Empty, assetSidePart.Id);
                var part = (UIElement)FindPart(partId);
                if (part == null)
                {
                    throw new InvalidOperationException($"The given {nameof(assetSidePart.Id)} does not correspond to any existing part.");
                }

                var parentId = (parent as UIElementViewModel)?.Id;
                if (parentId == null)
                {
                    RootElements.Remove(assetSidePart.Id);
                }
                else
                {
                    var parentElement = (UIElement)FindPart(parentId.Value);
                    if (parentElement == null)
                    {
                        throw new InvalidOperationException($"The given {nameof(parentId)} does not correspond to any existing part.");
                    }

                    var panel = parentElement as Panel;
                    var contentControl = parentElement as ContentControl;
                    if (panel != null)
                    {
                        var i = panel.Children.IndexOf(part);
                        GameSideNodeContainer.GetNode(panel.Children).Remove(part, new NodeIndex(i));
                    }
                    else if (contentControl != null)
                    {
                        if (contentControl.Content != null)
                        {
                            throw new InvalidOperationException($"The control corresponding to the given {nameof(parentId)} is a ContentControl that already has a Content.");
                        }
                        GameSideNodeContainer.GetNode(contentControl)[nameof(contentControl.Content)].Update(null);
                    }
                }
            }));
        }
Esempio n. 4
0
        /// <inheritdoc />
        public override Task AddPart([NotNull] UIHierarchyItemViewModel parent, UIElement assetSidePart)
        {
            EnsureAssetAccess();

            var gameSidePart = ClonePartForGameSide(parent.Asset.Asset, assetSidePart);

            return(InvokeAsync(() =>
            {
                Logger.Debug($"Adding element {assetSidePart.Id} to game-side scene");

                var parentId = (parent as UIElementViewModel)?.Id;
                if (parentId == null)
                {
                    RootElements[assetSidePart.Id] = gameSidePart;
                }
                else
                {
                    var parentElement = (UIElement)FindPart(parentId.Value);
                    if (parentElement == null)
                    {
                        throw new InvalidOperationException($"The given {nameof(parentId)} does not correspond to any existing part.");
                    }

                    var panel = parentElement as Panel;
                    var contentControl = parentElement as ContentControl;
                    if (panel != null)
                    {
                        GameSideNodeContainer.GetNode(panel.Children).Add(gameSidePart);
                    }
                    else if (contentControl != null)
                    {
                        if (contentControl.Content != null)
                        {
                            throw new InvalidOperationException($"The control corresponding to the given {nameof(parentId)} is a ContentControl that already has a Content.");
                        }
                        GameSideNodeContainer.GetNode(contentControl)[nameof(contentControl.Content)].Update(gameSidePart);
                    }
                }
            }));
        }