mirror of
https://github.com/Artemis-RGB/Artemis
synced 2026-11-12 11:56:30 +00:00
Display conditions - Updated predicate VM to move logic to the model
This commit is contained in:
1 parent
a4d3fb9949
commit
0dc77c0b6e
12 files changed
+270
-172
No files matched your search
@@ -1,18 +1,17 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Input;
|
||||
using Artemis.Core.Plugins.Abstract.DataModels.Attributes;
|
||||
using Artemis.UI.Shared.Exceptions;
|
||||
using Stylet;
|
||||
|
||||
namespace Artemis.UI.Shared.DataModelVisualization
|
||||
{
|
||||
public abstract class DataModelInputViewModel<T> : DataModelInputViewModel
|
||||
{
|
||||
private bool _closed;
|
||||
private T _inputValue;
|
||||
|
||||
protected DataModelInputViewModel(DataModelPropertyAttribute description, T initialValue)
|
||||
@@ -33,6 +32,10 @@ namespace Artemis.UI.Shared.DataModelVisualization
|
||||
/// <inheritdoc />
|
||||
public sealed override void Submit()
|
||||
{
|
||||
if (_closed)
|
||||
return;
|
||||
_closed = true;
|
||||
|
||||
foreach (var sourceUpdatingBinding in BindingOperations.GetSourceUpdatingBindings(View))
|
||||
sourceUpdatingBinding.UpdateSource();
|
||||
|
||||
@@ -43,6 +46,10 @@ namespace Artemis.UI.Shared.DataModelVisualization
|
||||
/// <inheritdoc />
|
||||
public sealed override void Cancel()
|
||||
{
|
||||
if (_closed)
|
||||
return;
|
||||
_closed = true;
|
||||
|
||||
OnCancel();
|
||||
UpdateCallback(InputValue, false);
|
||||
}
|
||||
@@ -62,7 +69,8 @@ namespace Artemis.UI.Shared.DataModelVisualization
|
||||
internal Action<object, bool> UpdateCallback { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the types this input view model can support through type conversion. This list is defined when registering the view model.
|
||||
/// Gets the types this input view model can support through type conversion. This list is defined when registering the
|
||||
/// view model.
|
||||
/// </summary>
|
||||
internal IReadOnlyCollection<Type> CompatibleConversionTypes { get; set; }
|
||||
|
||||
@@ -84,12 +92,14 @@ namespace Artemis.UI.Shared.DataModelVisualization
|
||||
public UIElement View { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Submits the input value and removes this view model
|
||||
/// Submits the input value and removes this view model.
|
||||
/// <para>This is called automatically when the user presses enter or clicks outside the view</para>
|
||||
/// </summary>
|
||||
public abstract void Submit();
|
||||
|
||||
/// <summary>
|
||||
/// Discards changes to the input value and removes this view model
|
||||
/// Discards changes to the input value and removes this view model.
|
||||
/// <para>This is called automatically when the user presses escape</para>
|
||||
/// </summary>
|
||||
public abstract void Cancel();
|
||||
|
||||
|
||||
+57
-15
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using Artemis.Core.Extensions;
|
||||
@@ -18,10 +17,10 @@ namespace Artemis.UI.Shared.DataModelVisualization.Shared
|
||||
{
|
||||
private BindableCollection<DataModelVisualizationViewModel> _children;
|
||||
private DataModel _dataModel;
|
||||
private bool _isMatchingFilteredTypes;
|
||||
private DataModelVisualizationViewModel _parent;
|
||||
private DataModelPropertyAttribute _propertyDescription;
|
||||
private PropertyInfo _propertyInfo;
|
||||
private bool _isMatchingFilteredTypes;
|
||||
|
||||
internal DataModelVisualizationViewModel(DataModel dataModel, DataModelVisualizationViewModel parent, PropertyInfo propertyInfo)
|
||||
{
|
||||
@@ -75,6 +74,36 @@ namespace Artemis.UI.Shared.DataModelVisualization.Shared
|
||||
set => SetAndNotify(ref _isMatchingFilteredTypes, value);
|
||||
}
|
||||
|
||||
public string PropertyPath
|
||||
{
|
||||
get
|
||||
{
|
||||
if (Parent == null)
|
||||
return PropertyInfo?.Name;
|
||||
|
||||
if (PropertyInfo == null)
|
||||
return Parent.PropertyPath;
|
||||
|
||||
var parentPath = Parent.PropertyPath;
|
||||
return parentPath != null ? $"{parentPath}.{PropertyInfo.Name}" : PropertyInfo.Name;
|
||||
}
|
||||
}
|
||||
|
||||
public string DisplayPropertyPath
|
||||
{
|
||||
get
|
||||
{
|
||||
if (Parent == null)
|
||||
return PropertyDescription?.Name;
|
||||
|
||||
if (PropertyDescription == null)
|
||||
return Parent.DisplayPropertyPath;
|
||||
|
||||
var parentPath = Parent.DisplayPropertyPath;
|
||||
return parentPath != null ? $"{parentPath} › {PropertyDescription.Name}" : PropertyDescription.Name;
|
||||
}
|
||||
}
|
||||
|
||||
public abstract void Update(IDataModelVisualizationService dataModelVisualizationService);
|
||||
|
||||
public virtual object GetCurrentValue()
|
||||
@@ -84,6 +113,14 @@ namespace Artemis.UI.Shared.DataModelVisualization.Shared
|
||||
|
||||
public void ApplyTypeFilter(bool looseMatch, params Type[] filteredTypes)
|
||||
{
|
||||
if (filteredTypes != null)
|
||||
{
|
||||
if (filteredTypes.All(t => t == null))
|
||||
filteredTypes = null;
|
||||
else
|
||||
filteredTypes = filteredTypes.Where(t => t != null).ToArray();
|
||||
}
|
||||
|
||||
// If the VM has children, its own type is not relevant
|
||||
if (Children.Any())
|
||||
{
|
||||
@@ -114,9 +151,18 @@ namespace Artemis.UI.Shared.DataModelVisualization.Shared
|
||||
IsMatchingFilteredTypes = filteredTypes.Any(t => t == PropertyInfo.PropertyType);
|
||||
}
|
||||
|
||||
public DataModelVisualizationViewModel GetChildForCondition(DisplayConditionPredicate predicate)
|
||||
public DataModelVisualizationViewModel GetChildForCondition(DisplayConditionPredicate predicate, DisplayConditionSide side)
|
||||
{
|
||||
if (side == DisplayConditionSide.Left)
|
||||
{
|
||||
if (predicate.LeftDataModel == null || predicate.LeftPropertyPath == null)
|
||||
return null;
|
||||
return GetChildByPath(predicate.LeftDataModel.PluginInfo.Guid, predicate.LeftPropertyPath);
|
||||
}
|
||||
|
||||
if (predicate.RightDataModel == null || predicate.RightPropertyPath == null)
|
||||
return null;
|
||||
return GetChildByPath(predicate.RightDataModel.PluginInfo.Guid, predicate.RightPropertyPath);
|
||||
}
|
||||
|
||||
public DataModelVisualizationViewModel GetChildByPath(Guid dataModelGuid, string propertyPath)
|
||||
@@ -141,18 +187,6 @@ namespace Artemis.UI.Shared.DataModelVisualization.Shared
|
||||
}
|
||||
}
|
||||
|
||||
public string GetCurrentPath()
|
||||
{
|
||||
if (Parent == null)
|
||||
return PropertyInfo?.Name;
|
||||
|
||||
if (PropertyInfo == null)
|
||||
return Parent.GetCurrentPath();
|
||||
|
||||
var parentPath = Parent.GetCurrentPath();
|
||||
return parentPath != null ? $"{parentPath}.{PropertyInfo.Name}" : PropertyInfo.Name;
|
||||
}
|
||||
|
||||
protected DataModelVisualizationViewModel CreateChild(IDataModelVisualizationService dataModelVisualizationService, PropertyInfo propertyInfo)
|
||||
{
|
||||
// Skip properties decorated with DataModelIgnore
|
||||
@@ -182,8 +216,10 @@ namespace Artemis.UI.Shared.DataModelVisualization.Shared
|
||||
PropertyDescription = DataModel?.DataModelDescription;
|
||||
// Rely on property info for the description
|
||||
else if (PropertyInfo != null)
|
||||
{
|
||||
PropertyDescription = (DataModelPropertyAttribute) Attribute.GetCustomAttribute(PropertyInfo, typeof(DataModelPropertyAttribute)) ??
|
||||
new DataModelPropertyAttribute {Name = PropertyInfo.Name.Humanize()};
|
||||
}
|
||||
else
|
||||
throw new ArtemisSharedUIException("Failed to get property description because plugin info is null but the parent has a datamodel");
|
||||
|
||||
@@ -192,4 +228,10 @@ namespace Artemis.UI.Shared.DataModelVisualization.Shared
|
||||
PropertyDescription.Name = PropertyInfo.Name.Humanize();
|
||||
}
|
||||
}
|
||||
|
||||
public enum DisplayConditionSide
|
||||
{
|
||||
Left,
|
||||
Right
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user