port from perforce
This commit is contained in:
103
intromat/Intromat/ViewModels/EndpointPropertyDescriptor.cs
Normal file
103
intromat/Intromat/ViewModels/EndpointPropertyDescriptor.cs
Normal file
@@ -0,0 +1,103 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Windows;
|
||||
using NodeNetwork.Toolkit.ValueNode;
|
||||
using NodeNetwork.ViewModels;
|
||||
using ReactiveUI;
|
||||
using Xceed.Wpf.Toolkit.PropertyGrid;
|
||||
using Xceed.Wpf.Toolkit.PropertyGrid.Attributes;
|
||||
using Xceed.Wpf.Toolkit.PropertyGrid.Editors;
|
||||
|
||||
namespace Intromat.ViewModels
|
||||
{
|
||||
public class EndpointEditor : ITypeEditor
|
||||
{
|
||||
public FrameworkElement ResolveEditor(PropertyItem propertyItem)
|
||||
{
|
||||
var editor = ((EndpointPropertyDescriptor)propertyItem.PropertyDescriptor).Endpoint.Editor;
|
||||
return new ViewModelViewHost { ViewModel = editor, HorizontalContentAlignment = HorizontalAlignment.Stretch, VerticalContentAlignment = VerticalAlignment.Stretch };
|
||||
}
|
||||
}
|
||||
|
||||
public class EndpointPropertyDescriptor : PropertyDescriptor
|
||||
{
|
||||
public EndpointPropertyDescriptor(CodeGenNodeViewModel node, Endpoint endpoint, Attribute[] attrs)
|
||||
: base(endpoint.Name, attrs)
|
||||
{
|
||||
Node = node;
|
||||
Endpoint = endpoint;
|
||||
ComponentType = typeof(CodeGenNodeViewModel);
|
||||
PropertyType = endpoint.Editor.GetType();
|
||||
IsReadOnly = false;
|
||||
}
|
||||
|
||||
public static EndpointPropertyDescriptor Create(CodeGenNodeViewModel node, Endpoint endpoint, int index)
|
||||
{
|
||||
var attributes = new List<Attribute>();
|
||||
if (endpoint.Group != null)
|
||||
{
|
||||
attributes.Add(new CategoryAttribute(endpoint.Group.Name));
|
||||
}
|
||||
else
|
||||
{
|
||||
attributes.Add(new CategoryAttribute(node.Name));
|
||||
}
|
||||
|
||||
attributes.Add(new PropertyOrderAttribute(index));
|
||||
attributes.Add(new EditorAttribute(typeof(EndpointEditor), typeof(EndpointEditor)));
|
||||
return new EndpointPropertyDescriptor(node, endpoint, attributes.ToArray());
|
||||
}
|
||||
|
||||
public override bool CanResetValue(object component)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public override object GetValue(object? component)
|
||||
{
|
||||
return GetEditorValue((dynamic)Endpoint.Editor);
|
||||
}
|
||||
|
||||
public override void ResetValue(object component)
|
||||
{
|
||||
ResetEditorValue((dynamic)Endpoint.Editor);
|
||||
}
|
||||
|
||||
public override void SetValue(object? component, object? value)
|
||||
{
|
||||
SetEditorValue((dynamic)Endpoint.Editor, (dynamic?)value);
|
||||
}
|
||||
|
||||
private void SetEditorValue<T>(ValueEditorViewModel<T> editor, T value)
|
||||
{
|
||||
editor.Value = value;
|
||||
Node.RaisePropertyChanged(Name);
|
||||
}
|
||||
|
||||
private void ResetEditorValue<T>(ValueEditorViewModel<T> editor)
|
||||
{
|
||||
SetEditorValue(editor!, default!);
|
||||
}
|
||||
|
||||
private static T GetEditorValue<T>(ValueEditorViewModel<T> editor)
|
||||
{
|
||||
return editor.Value;
|
||||
}
|
||||
|
||||
public override bool ShouldSerializeValue(object component)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public override Type ComponentType { get; }
|
||||
|
||||
public override bool IsReadOnly { get; }
|
||||
|
||||
public override Type PropertyType { get; }
|
||||
|
||||
public CodeGenNodeViewModel Node { get; }
|
||||
|
||||
public Endpoint Endpoint { get; }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user