Data model visualization - Simplified and improved VMs

Layer conditions - Added left side property selection
This commit is contained in:
SpoinkyNL committed 2020-07-05 15:34:16 +02:00
1 parent f9d26a8ba3
commit c0f2cf08de
38 files changed
+908 -359

No files matched your search

@@ -1,7 +1,8 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System;
using System.Collections;
using System.Reflection;
using Artemis.Core.Extensions;
using Artemis.Core.Plugins.Abstract.DataModels;
using Artemis.Core.Plugins.Abstract.DataModels.Attributes;
using Artemis.UI.Shared.Services;
using Stylet;
@@ -10,25 +11,12 @@ namespace Artemis.UI.Shared.DataModelVisualization.Shared
{
public class DataModelListViewModel : DataModelVisualizationViewModel
{
private readonly IDataModelVisualizationService _dataModelVisualizationService;
private BindableCollection<DataModelVisualizationViewModel> _children;
private string _count;
private IList _list;
internal DataModelListViewModel(PropertyInfo propertyInfo, DataModelPropertyAttribute propertyDescription, DataModelVisualizationViewModel parent,
IDataModelVisualizationService dataModelVisualizationService)
internal DataModelListViewModel(DataModel dataModel, DataModelVisualizationViewModel parent, PropertyInfo propertyInfo) : base(dataModel, parent, propertyInfo)
{
_dataModelVisualizationService = dataModelVisualizationService;
PropertyInfo = propertyInfo;
Parent = parent;
PropertyDescription = propertyDescription;
Children = new BindableCollection<DataModelVisualizationViewModel>();
}
public BindableCollection<DataModelVisualizationViewModel> Children
{
get => _children;
set => SetAndNotify(ref _children, value);
ListChildren = new BindableCollection<DataModelVisualizationViewModel>();
}
public IList List
@@ -37,43 +25,67 @@ namespace Artemis.UI.Shared.DataModelVisualization.Shared
set => SetAndNotify(ref _list, value);
}
public BindableCollection<DataModelVisualizationViewModel> ListChildren { get; set; }
public string Count
{
get => _count;
set => SetAndNotify(ref _count, value);
}
public override void Update()
public override void Update(IDataModelVisualizationService dataModelVisualizationService)
{
if (PropertyInfo != null && Parent?.Model != null && PropertyInfo.GetValue(Parent.Model) is IList listValue)
{
Model = new List<object>(listValue.Cast<object>());
List = (IList) Model;
}
List = GetCurrentValue() as IList;
if (List == null)
return;
var index = 0;
foreach (var item in List)
{
DataModelVisualizationViewModel child;
if (Children.Count <= index)
if (ListChildren.Count <= index)
{
child = CreateChild(_dataModelVisualizationService, item);
Children.Add(child);
child = CreateListChild(dataModelVisualizationService, item.GetType());
ListChildren.Add(child);
}
else
child = ListChildren[index];
if (child is DataModelListPropertiesViewModel dataModelListClassViewModel)
{
child = Children[index];
child.Model = item;
dataModelListClassViewModel.DisplayValue = item;
dataModelListClassViewModel.Index = index;
}
else if (child is DataModelListPropertyViewModel dataModelListPropertyViewModel)
{
dataModelListPropertyViewModel.DisplayValue = item;
dataModelListPropertyViewModel.Index = index;
}
child.Update();
child.Update(dataModelVisualizationService);
index++;
}
while (Children.Count > List.Count)
Children.RemoveAt(Children.Count - 1);
while (ListChildren.Count > List.Count)
ListChildren.RemoveAt(ListChildren.Count - 1);
Count = $"{Children.Count} {(Children.Count == 1 ? "item" : "items")}";
Count = $"{ListChildren.Count} {(ListChildren.Count == 1 ? "item" : "items")}";
}
protected DataModelVisualizationViewModel CreateListChild(IDataModelVisualizationService dataModelVisualizationService, Type listType)
{
// If a display VM was found, prefer to use that in any case
var typeViewModel = dataModelVisualizationService.GetDataModelDisplayViewModel(listType);
if (typeViewModel != null)
return new DataModelListPropertyViewModel(DataModel, this, PropertyInfo) {DisplayViewModel = typeViewModel};
// For primitives, create a property view model, it may be null that is fine
if (listType.IsPrimitive || listType == typeof(string))
return new DataModelListPropertyViewModel(DataModel, this, PropertyInfo);
// For other value types create a child view model
if (listType.IsClass || listType.IsStruct())
return new DataModelListPropertiesViewModel(DataModel, this, PropertyInfo);
return null;
}
}
}