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++;