/// <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)); } })); }
/// <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); } })); }
/// <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); } } })); }
/// <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); } } })); }