diff --git a/Torch/Torch.csproj b/Torch/Torch.csproj
index 54e62a0..e9791ac 100644
--- a/Torch/Torch.csproj
+++ b/Torch/Torch.csproj
@@ -271,6 +271,7 @@
DictionaryEditor.xaml
+
ObjectCollectionEditor.xaml
diff --git a/Torch/Views/DisplayAttribute.cs b/Torch/Views/DisplayAttribute.cs
new file mode 100644
index 0000000..db75289
--- /dev/null
+++ b/Torch/Views/DisplayAttribute.cs
@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Torch.Views
+{
+ public class DisplayAttribute : Attribute
+ {
+ public string Name;
+ public string Description;
+ public string ToolTip;
+ public string GroupName;
+ public int? Order;
+ public bool? Enabled;
+ public bool? Visible;
+ public bool? ReadOnly;
+
+ public DisplayAttribute()
+ { }
+
+ public static implicit operator DisplayAttribute(System.ComponentModel.DataAnnotations.DisplayAttribute da)
+ {
+ return new DisplayAttribute()
+ {
+ Name = da.GetName(),
+ Description = da.GetDescription(),
+ GroupName = da.GetGroupName(),
+ Order = da.GetOrder()
+ };
+ }
+ }
+}
diff --git a/Torch/Views/PropertyGrid.xaml.cs b/Torch/Views/PropertyGrid.xaml.cs
index 23e2ef6..3168bd7 100644
--- a/Torch/Views/PropertyGrid.xaml.cs
+++ b/Torch/Views/PropertyGrid.xaml.cs
@@ -73,9 +73,13 @@ namespace Torch.Views
foreach (var property in properties)
{
+ //Attempt to load our custom DisplayAttribute
var a = property.GetCustomAttribute();
- if (IgnoreDisplay)
- a = null;
+ //If not found and IgnoreDisplay is not set, fall back to system DisplayAttribute
+ if (a == null && !IgnoreDisplay)
+ a = property.GetCustomAttribute();
+ if (a?.Visible == false)
+ continue;
descriptors[property] = a;
string category = a?.GroupName ?? "Misc";
@@ -104,7 +108,13 @@ namespace Torch.Views
grid.Children.Add(cl);
curRow++;
- c.Value.Sort((a,b)=> string.Compare((descriptors[a]?.Name ?? a.Name), descriptors[b]?.Name ?? b.Name, StringComparison.Ordinal));
+ c.Value.Sort((a, b) =>
+ {
+ var c1 = descriptors[a]?.Order?.CompareTo(descriptors[b]?.Order);
+ if (c1.HasValue && c1.Value != 0)
+ return c1.Value;
+ return string.Compare((descriptors[a]?.Name ?? a.Name), descriptors[b]?.Name ?? b.Name, StringComparison.Ordinal);
+ });
foreach (var property in c.Value)
{
@@ -120,7 +130,7 @@ namespace Torch.Views
var text = new TextBlock
{
Text = displayName ?? property.Name,
- ToolTip = displayName,
+ ToolTip = descriptor?.ToolTip ?? displayName,
VerticalAlignment = VerticalAlignment.Center
};
text.SetValue(Grid.ColumnProperty, 0);
@@ -128,10 +138,12 @@ namespace Torch.Views
text.Margin = new Thickness(3);
text.Tag = $"{text.Text}: {descriptor?.Description}";
text.IsMouseDirectlyOverChanged += Text_IsMouseDirectlyOverChanged;
+ if (descriptor?.Enabled == false)
+ text.IsEnabled = false;
grid.Children.Add(text);
FrameworkElement valueControl;
- if (property.GetSetMethod() == null)
+ if (property.GetSetMethod() == null || descriptor?.ReadOnly == true)
{
valueControl = new TextBlock();
var binding = new Binding(property.Name)
@@ -218,6 +230,8 @@ namespace Torch.Views
valueControl.SetValue(Grid.ColumnProperty, 1);
valueControl.SetValue(Grid.RowProperty, curRow);
valueControl.IsMouseDirectlyOverChanged += Text_IsMouseDirectlyOverChanged;
+ if (descriptor?.Enabled == false)
+ valueControl.IsEnabled = false;
grid.Children.Add(valueControl);
curRow++;