Core - Streamlined public parts of profile creation

UI - Started adjusting the VMs for the layer refactor
This commit is contained in:
Robert authored and SpoinkyNL committed 2020-09-10 19:56:39 +02:00
1 parent 1de6fefc2a
commit c07ea09c9d
58 files changed
+694 -1196

No files matched your search

@@ -27,7 +27,7 @@
</StackPanel>
<TreeView Grid.Row="1"
ItemsSource="{Binding RootFolder.Children}"
ItemsSource="{Binding ActiveItem.Items}"
HorizontalContentAlignment="Stretch"
dd:DragDrop.IsDragSource="True"
dd:DragDrop.IsDropTarget="True"
@@ -36,11 +36,11 @@
<behaviors:TreeViewSelectionBehavior ExpandSelected="True" SelectedItem="{Binding SelectedTreeItem}" />
</b:Interaction.Behaviors>
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type treeItem1:FolderViewModel}" ItemsSource="{Binding Children}">
<HierarchicalDataTemplate DataType="{x:Type treeItem1:FolderViewModel}" ItemsSource="{Binding Items}">
<ContentControl s:View.Model="{Binding}" />
</HierarchicalDataTemplate>
<!-- TODO: Ensure this item source is required -->
<HierarchicalDataTemplate DataType="{x:Type treeItem1:LayerViewModel}" ItemsSource="{Binding Children}">
<HierarchicalDataTemplate DataType="{x:Type treeItem1:LayerViewModel}" ItemsSource="{Binding Items}">
<ContentControl s:View.Model="{Binding}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
@@ -11,24 +11,17 @@ using Stylet;
namespace Artemis.UI.Screens.ProfileEditor.ProfileTree
{
public class ProfileTreeViewModel : ProfileEditorPanelViewModel, IDropTarget
public class ProfileTreeViewModel : Conductor<FolderViewModel>, IProfileEditorPanelViewModel, IDropTarget
{
private readonly IFolderVmFactory _folderVmFactory;
private readonly IProfileTreeVmFactory _profileTreeVmFactory;
private readonly IProfileEditorService _profileEditorService;
private FolderViewModel _rootFolder;
private TreeItemViewModel _selectedTreeItem;
private bool _updatingTree;
public ProfileTreeViewModel(IProfileEditorService profileEditorService, IFolderVmFactory folderVmFactory)
public ProfileTreeViewModel(IProfileEditorService profileEditorService, IProfileTreeVmFactory profileTreeVmFactory)
{
_profileEditorService = profileEditorService;
_folderVmFactory = folderVmFactory;
}
public FolderViewModel RootFolder
{
get => _rootFolder;
set => SetAndNotify(ref _rootFolder, value);
_profileTreeVmFactory = profileTreeVmFactory;
}
public TreeItemViewModel SelectedTreeItem
@@ -73,7 +66,7 @@ namespace Artemis.UI.Screens.ProfileEditor.ProfileTree
switch (dragDropType)
{
case DragDropType.Add:
source.Parent.RemoveExistingElement(source);
((TreeItemViewModel) source.Parent).RemoveExistingElement(source);
target.AddExistingElement(source);
break;
case DragDropType.InsertBefore:
@@ -92,27 +85,25 @@ namespace Artemis.UI.Screens.ProfileEditor.ProfileTree
// ReSharper disable once UnusedMember.Global - Called from view
public void AddFolder()
{
RootFolder?.AddFolder();
ActiveItem?.AddFolder();
}
// ReSharper disable once UnusedMember.Global - Called from view
public void AddLayer()
{
RootFolder?.AddLayer();
ActiveItem?.AddLayer();
}
protected override void OnInitialActivate()
{
Subscribe();
CreateRootFolderViewModel();
base.OnInitialActivate();
}
protected override void OnClose()
{
Unsubscribe();
RootFolder?.Dispose();
RootFolder = null;
base.OnClose();
}
@@ -122,12 +113,11 @@ namespace Artemis.UI.Screens.ProfileEditor.ProfileTree
var firstChild = _profileEditorService.SelectedProfile?.Children?.FirstOrDefault();
if (!(firstChild is Folder folder))
{
RootFolder = null;
ActivateItem(null);
return;
}
RootFolder?.Dispose();
RootFolder = _folderVmFactory.Create(folder);
ActivateItem(_profileTreeVmFactory.FolderViewModel(folder));
_updatingTree = false;
// Auto-select the first layer
@@ -150,7 +140,7 @@ namespace Artemis.UI.Screens.ProfileEditor.ProfileTree
{
if (parent == source)
return DragDropType.None;
parent = parent.Parent;
parent = (TreeItemViewModel) parent.Parent;
}
switch (dropInfo.InsertPosition)
@@ -186,20 +176,20 @@ namespace Artemis.UI.Screens.ProfileEditor.ProfileTree
if (e.RenderProfileElement == SelectedTreeItem?.ProfileElement)
return;
if (RootFolder == null)
if (ActiveItem == null)
{
CreateRootFolderViewModel();
return;
}
_updatingTree = true;
RootFolder.UpdateProfileElements();
ActiveItem.UpdateProfileElements();
_updatingTree = false;
if (e.RenderProfileElement == null)
SelectedTreeItem = null;
else
{
var match = RootFolder.GetAllChildren().FirstOrDefault(vm => vm.ProfileElement == e.RenderProfileElement);
var match = ActiveItem.GetAllChildren().FirstOrDefault(vm => vm.ProfileElement == e.RenderProfileElement);
if (match != null)
SelectedTreeItem = match;
}
@@ -1,5 +1,4 @@
using Artemis.Core;
using Artemis.Core.Services;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Shared.Services;
@@ -11,36 +10,11 @@ namespace Artemis.UI.Screens.ProfileEditor.ProfileTree.TreeItem
public FolderViewModel(ProfileElement folder,
IProfileEditorService profileEditorService,
IDialogService dialogService,
IRenderElementService renderElementService,
IFolderVmFactory folderVmFactory,
ILayerVmFactory layerVmFactory) :
base(null, folder, profileEditorService, dialogService, renderElementService, folderVmFactory, layerVmFactory)
{
}
public FolderViewModel(TreeItemViewModel parent,
ProfileElement folder,
IProfileEditorService profileEditorService,
IDialogService dialogService,
IRenderElementService renderElementService,
IFolderVmFactory folderVmFactory,
ILayerVmFactory layerVmFactory) :
base(parent, folder, profileEditorService, dialogService, renderElementService, folderVmFactory, layerVmFactory)
IProfileTreeVmFactory profileTreeVmFactory) :
base(folder, profileEditorService, dialogService, profileTreeVmFactory)
{
}
public override bool SupportsChildren => true;
protected override void Dispose(bool disposing)
{
if (disposing)
{
foreach (var treeItemViewModel in Children)
treeItemViewModel.Dispose();
Children.Clear();
}
base.Dispose(disposing);
}
}
}
@@ -1,5 +1,4 @@
using Artemis.Core;
using Artemis.Core.Services;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Shared.Services;
@@ -7,14 +6,11 @@ namespace Artemis.UI.Screens.ProfileEditor.ProfileTree.TreeItem
{
public class LayerViewModel : TreeItemViewModel
{
public LayerViewModel(TreeItemViewModel parent,
ProfileElement folder,
public LayerViewModel(ProfileElement layer,
IProfileEditorService profileEditorService,
IDialogService dialogService,
IRenderElementService renderElementService,
IFolderVmFactory folderVmFactory,
ILayerVmFactory layerVmFactory) :
base(parent, folder, profileEditorService, dialogService, renderElementService, folderVmFactory, layerVmFactory)
IProfileTreeVmFactory profileTreeVmFactory) :
base(layer, profileEditorService, dialogService, profileTreeVmFactory)
{
}
@@ -3,7 +3,6 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Artemis.Core;
using Artemis.Core.Services;
using Artemis.UI.Exceptions;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Screens.ProfileEditor.Dialogs;
@@ -12,66 +11,45 @@ using Stylet;
namespace Artemis.UI.Screens.ProfileEditor.ProfileTree.TreeItem
{
public abstract class TreeItemViewModel : PropertyChangedBase, IDisposable
public abstract class TreeItemViewModel : Conductor<TreeItemViewModel>.Collection.AllActive, IDisposable
{
private readonly IDialogService _dialogService;
private readonly IFolderVmFactory _folderVmFactory;
private readonly ILayerVmFactory _layerVmFactory;
private readonly IProfileEditorService _profileEditorService;
private readonly IRenderElementService _renderElementService;
private TreeItemViewModel _parent;
private readonly IProfileTreeVmFactory _profileTreeVmFactory;
private ProfileElement _profileElement;
protected TreeItemViewModel(TreeItemViewModel parent,
ProfileElement profileElement,
protected TreeItemViewModel(ProfileElement profileElement,
IProfileEditorService profileEditorService,
IDialogService dialogService,
IRenderElementService renderElementService,
IFolderVmFactory folderVmFactory,
ILayerVmFactory layerVmFactory)
IProfileTreeVmFactory profileTreeVmFactory)
{
_profileEditorService = profileEditorService;
_dialogService = dialogService;
_renderElementService = renderElementService;
_folderVmFactory = folderVmFactory;
_layerVmFactory = layerVmFactory;
_profileTreeVmFactory = profileTreeVmFactory;
Parent = parent;
ProfileElement = profileElement;
Children = new BindableCollection<TreeItemViewModel>();
Subscribe();
UpdateProfileElements();
}
public TreeItemViewModel Parent
{
get => _parent;
set => SetAndNotify(ref _parent, value);
}
public ProfileElement ProfileElement
{
get => _profileElement;
set => SetAndNotify(ref _profileElement, value);
}
public BindableCollection<TreeItemViewModel> Children { get; }
public abstract bool SupportsChildren { get; }
public void Dispose()
{
Unsubscribe();
Dispose(true);
GC.SuppressFinalize(this);
}
public List<TreeItemViewModel> GetAllChildren()
{
var children = new List<TreeItemViewModel>();
foreach (var childFolder in Children)
foreach (var childFolder in Items)
{
// Add all children in this element
children.Add(childFolder);
@@ -84,34 +62,38 @@ namespace Artemis.UI.Screens.ProfileEditor.ProfileTree.TreeItem
public void SetElementInFront(TreeItemViewModel source)
{
var sourceParent = (TreeItemViewModel) source.Parent;
var parent = (TreeItemViewModel) Parent;
if (source.Parent != Parent)
{
source.Parent.RemoveExistingElement(source);
Parent.AddExistingElement(source);
sourceParent.RemoveExistingElement(source);
parent.AddExistingElement(source);
}
Parent.Unsubscribe();
Parent.ProfileElement.RemoveChild(source.ProfileElement);
Parent.ProfileElement.AddChild(source.ProfileElement, ProfileElement.Order);
Parent.Subscribe();
parent.Unsubscribe();
parent.ProfileElement.RemoveChild(source.ProfileElement);
parent.ProfileElement.AddChild(source.ProfileElement, ProfileElement.Order);
parent.Subscribe();
Parent.UpdateProfileElements();
parent.UpdateProfileElements();
}
public void SetElementBehind(TreeItemViewModel source)
{
var sourceParent = (TreeItemViewModel) source.Parent;
var parent = (TreeItemViewModel) Parent;
if (source.Parent != Parent)
{
source.Parent.RemoveExistingElement(source);
Parent.AddExistingElement(source);
sourceParent.RemoveExistingElement(source);
parent.AddExistingElement(source);
}
Parent.Unsubscribe();
Parent.ProfileElement.RemoveChild(source.ProfileElement);
Parent.ProfileElement.AddChild(source.ProfileElement, ProfileElement.Order + 1);
Parent.Subscribe();
parent.Unsubscribe();
parent.ProfileElement.RemoveChild(source.ProfileElement);
parent.ProfileElement.AddChild(source.ProfileElement, ProfileElement.Order + 1);
parent.Subscribe();
Parent.UpdateProfileElements();
parent.UpdateProfileElements();
}
public void RemoveExistingElement(TreeItemViewModel treeItem)
@@ -138,7 +120,7 @@ namespace Artemis.UI.Screens.ProfileEditor.ProfileTree.TreeItem
if (!SupportsChildren)
throw new ArtemisUIException("Cannot add a folder to a profile element of type " + ProfileElement.GetType().Name);
ProfileElement.AddChild(new Folder(ProfileElement.Profile, ProfileElement, "New folder"));
var _ = new Folder(ProfileElement, "New folder");
_profileEditorService.UpdateSelectedProfile();
}
@@ -147,7 +129,7 @@ namespace Artemis.UI.Screens.ProfileEditor.ProfileTree.TreeItem
if (!SupportsChildren)
throw new ArtemisUIException("Cannot add a layer to a profile element of type " + ProfileElement.GetType().Name);
_renderElementService.CreateLayer(ProfileElement.Profile, ProfileElement, "New layer");
var _ = new Layer(ProfileElement, "New layer");
_profileEditorService.UpdateSelectedProfile();
}
@@ -180,7 +162,7 @@ namespace Artemis.UI.Screens.ProfileEditor.ProfileTree.TreeItem
return;
// Farewell, cruel world
var parent = Parent;
var parent = (TreeItemViewModel) Parent;
ProfileElement.Parent?.RemoveChild(ProfileElement);
parent.RemoveExistingElement(this);
@@ -190,17 +172,17 @@ namespace Artemis.UI.Screens.ProfileEditor.ProfileTree.TreeItem
public void UpdateProfileElements()
{
// Remove VMs that are no longer a child
var toRemove = Children.Where(c => c.ProfileElement.Parent != ProfileElement).ToList();
var toRemove = Items.Where(c => c.ProfileElement.Parent != ProfileElement).ToList();
foreach (var treeItemViewModel in toRemove)
Children.Remove(treeItemViewModel);
DeactivateItem(treeItemViewModel);
// Order the children
var vmsList = Children.OrderBy(v => v.ProfileElement.Order).ToList();
var vmsList = Items.OrderBy(v => v.ProfileElement.Order).ToList();
for (var index = 0; index < vmsList.Count; index++)
{
var profileElementViewModel = vmsList[index];
if (Children.IndexOf(profileElementViewModel) != index)
Children.Move(Children.IndexOf(profileElementViewModel), index);
if (Items.IndexOf(profileElementViewModel) != index)
((BindableCollection<TreeItemViewModel>) Items).Move(Items.IndexOf(profileElementViewModel), index);
}
// Ensure every child element has an up-to-date VM
@@ -212,13 +194,13 @@ namespace Artemis.UI.Screens.ProfileEditor.ProfileTree.TreeItem
{
if (profileElement is Folder folder)
{
if (Children.FirstOrDefault(p => p is FolderViewModel vm && vm.ProfileElement == folder) == null)
newChildren.Add(_folderVmFactory.Create((FolderViewModel) this, folder));
if (Items.FirstOrDefault(p => p is FolderViewModel vm && vm.ProfileElement == folder) == null)
newChildren.Add(_profileTreeVmFactory.FolderViewModel(folder));
}
else if (profileElement is Layer layer)
{
if (Children.FirstOrDefault(p => p is LayerViewModel vm && vm.ProfileElement == layer) == null)
newChildren.Add(_layerVmFactory.Create((FolderViewModel) this, layer));
if (Items.FirstOrDefault(p => p is LayerViewModel vm && vm.ProfileElement == layer) == null)
newChildren.Add(_profileTreeVmFactory.LayerViewModel(layer));
}
}
@@ -229,7 +211,7 @@ namespace Artemis.UI.Screens.ProfileEditor.ProfileTree.TreeItem
foreach (var treeItemViewModel in newChildren)
{
treeItemViewModel.UpdateProfileElements();
Children.Add(treeItemViewModel);
ActivateItem(treeItemViewModel);
}
}
@@ -238,13 +220,6 @@ namespace Artemis.UI.Screens.ProfileEditor.ProfileTree.TreeItem
_profileEditorService.UpdateSelectedProfile();
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
}
}
private void Subscribe()
{
ProfileElement.ChildAdded += ProfileElementOnChildAdded;