Browse Source

Use localized node name in node picker

CPKreuz 1 year ago
parent
commit
1612ff18fc

+ 2 - 0
src/PixiEditor.ChangeableDocument/Changeables/Graph/NodeInfoAttribute.cs

@@ -6,6 +6,8 @@ public class NodeInfoAttribute : Attribute
     public string UniqueName { get; }
     
     public string DisplayName { get; }
+    
+    public string? PickerName { get; set; }
 
     public NodeInfoAttribute(string uniqueName, string displayName)
     {

+ 28 - 0
src/PixiEditor/Models/Nodes/NodeTypeInfo.cs

@@ -0,0 +1,28 @@
+using System.Reflection;
+using PixiEditor.ChangeableDocument.Changeables.Graph;
+
+namespace PixiEditor.Models.Nodes;
+
+public class NodeTypeInfo
+{
+    public string UniqueName { get; }
+    
+    public string DisplayName { get; }
+    
+    public string? PickerName { get; }
+
+    public string FinalPickerName => PickerName ?? DisplayName;
+    
+    public Type NodeType { get; }
+
+    public NodeTypeInfo(Type type)
+    {
+        NodeType = type;
+
+        var attribute = type.GetCustomAttribute<NodeInfoAttribute>();
+
+        UniqueName = attribute.UniqueName;
+        DisplayName = attribute.DisplayName;
+        PickerName = attribute.PickerName;
+    }
+}

+ 1 - 1
src/PixiEditor/Styles/Templates/NodeGraphView.axaml

@@ -10,7 +10,7 @@
                     <Grid.ContextFlyout>
                         <Flyout>
                             <nodes:NodePicker
-                                AllNodeTypes="{Binding AllNodeTypes, RelativeSource={RelativeSource TemplatedParent}}"
+                                AllNodeTypeInfos="{Binding AllNodeTypeInfos, RelativeSource={RelativeSource TemplatedParent}}"
                                 SearchQuery="{Binding SearchQuery, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
                                 SelectNodeCommand="{Binding CreateNodeFromContextCommand, RelativeSource={RelativeSource TemplatedParent}}"
                                 />

+ 8 - 4
src/PixiEditor/Styles/Templates/NodePicker.axaml

@@ -2,7 +2,9 @@
                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                     xmlns:nodes="clr-namespace:PixiEditor.Views.Nodes"
                     xmlns:visuals="clr-namespace:PixiEditor.Views.Visuals"
-                    xmlns:input="clr-namespace:PixiEditor.Views.Input">
+                    xmlns:ui="clr-namespace:PixiEditor.Extensions.UI;assembly=PixiEditor.Extensions"
+                    xmlns:input="clr-namespace:PixiEditor.Views.Input"
+                    xmlns:nodeModels="clr-namespace:PixiEditor.Models.Nodes">
     <ControlTheme TargetType="nodes:NodePicker" x:Key="{x:Type nodes:NodePicker}">
         <Setter Property="Template">
             <ControlTemplate>
@@ -14,12 +16,14 @@
 
                     <input:InputBox
                         Text="{Binding SearchQuery, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" />
-                    <ItemsControl MinHeight="200" Grid.Row="1" ItemsSource="{TemplateBinding FilteredNodeTypes}">
+                    <ItemsControl MinHeight="200" Grid.Row="1" ItemsSource="{TemplateBinding FilteredNodeTypeInfos}">
                         <ItemsControl.ItemTemplate>
-                            <DataTemplate>
+                            <DataTemplate DataType="nodeModels:NodeTypeInfo">
                                 <Button Command="{Binding SelectNodeCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=nodes:NodePicker}}"
                                         CommandParameter="{Binding}"
-                                        Content="{Binding Name}" />
+                                        Margin="0,1"
+                                        IsVisible="{Binding FinalPickerName, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"
+                                        ui:Translator.Key="{Binding FinalPickerName}" />
                             </DataTemplate>
                         </ItemsControl.ItemTemplate>
                     </ItemsControl>

+ 17 - 4
src/PixiEditor/Views/Nodes/NodeGraphView.cs

@@ -14,6 +14,7 @@ using PixiEditor.ViewModels.Document;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
 using PixiEditor.ChangeableDocument.Changes.NodeGraph;
 using PixiEditor.Models.Handlers;
+using PixiEditor.Models.Nodes;
 using PixiEditor.Numerics;
 using PixiEditor.ViewModels.Nodes;
 using PixiEditor.Views.Nodes.Properties;
@@ -59,6 +60,10 @@ internal class NodeGraphView : Zoombox.Zoombox
         AvaloniaProperty.Register<NodeGraphView, ObservableCollection<Type>>(
             nameof(AllNodeTypes));
 
+    public static readonly StyledProperty<ObservableCollection<NodeTypeInfo>> AllNodeTypeInfosProperty =
+        AvaloniaProperty.Register<NodeGraphView, ObservableCollection<NodeTypeInfo>>(
+            nameof(AllNodeTypeInfos));
+
     public static readonly StyledProperty<ICommand> SocketDropCommandProperty =
         AvaloniaProperty.Register<NodeGraphView, ICommand>(
             nameof(SocketDropCommand));
@@ -90,6 +95,12 @@ internal class NodeGraphView : Zoombox.Zoombox
         get => GetValue(AllNodeTypesProperty);
         set => SetValue(AllNodeTypesProperty, value);
     }
+    
+    public ObservableCollection<NodeTypeInfo> AllNodeTypeInfos
+    {
+        get => GetValue(AllNodeTypeInfosProperty);
+        set => SetValue(AllNodeTypeInfosProperty, value);
+    }
 
     public string SearchQuery
     {
@@ -180,16 +191,18 @@ internal class NodeGraphView : Zoombox.Zoombox
         DraggedCommand = new RelayCommand<PointerEventArgs>(Dragged);
         EndDragCommand = new RelayCommand<PointerCaptureLostEventArgs>(EndDrag);
         SocketDropCommand = new RelayCommand<NodeSocket>(SocketDrop);
-        CreateNodeFromContextCommand = new RelayCommand<Type>(CreateNodeType);
+        CreateNodeFromContextCommand = new RelayCommand<NodeTypeInfo>(CreateNodeType);
 
         AllNodeTypes = new ObservableCollection<Type>(GatherAssemblyTypes<Node>());
+        AllNodeTypeInfos = new ObservableCollection<NodeTypeInfo>(AllNodeTypes.Select(x => new NodeTypeInfo(x)));
     }
     
-    private void CreateNodeType(Type nodeType)
+    private void CreateNodeType(NodeTypeInfo nodeType)
     {
-        if (CreateNodeCommand != null && CreateNodeCommand.CanExecute(nodeType))
+        var type = nodeType.NodeType;
+        if (CreateNodeCommand != null && CreateNodeCommand.CanExecute(type))
         {
-            CreateNodeCommand.Execute((nodeType, _lastMouseClickPos));
+            CreateNodeCommand.Execute((type, _lastMouseClickPos));
             ((Control)this.GetVisualDescendants().FirstOrDefault()).ContextFlyout.Hide();
         }
     }

+ 15 - 14
src/PixiEditor/Views/Nodes/NodePicker.cs

@@ -6,6 +6,7 @@ using Avalonia.Controls.Primitives;
 using Avalonia.Interactivity;
 using Avalonia.Markup.Xaml;
 using CommunityToolkit.Mvvm.Input;
+using PixiEditor.Models.Nodes;
 using PixiEditor.Numerics;
 
 namespace PixiEditor.Views.Nodes;
@@ -21,23 +22,23 @@ public partial class NodePicker : TemplatedControl
         set => SetValue(SearchQueryProperty, value);
     }
 
-    public static readonly StyledProperty<ObservableCollection<Type>> AllNodeTypesProperty =
-        AvaloniaProperty.Register<NodePicker, ObservableCollection<Type>>(
+    public static readonly StyledProperty<ObservableCollection<NodeTypeInfo>> AllNodeTypeInfosProperty =
+        AvaloniaProperty.Register<NodePicker, ObservableCollection<NodeTypeInfo>>(
             "AllNodeTypes");
 
-    public static readonly StyledProperty<ObservableCollection<Type>> FilteredNodeTypesProperty =
-        AvaloniaProperty.Register<NodePicker, ObservableCollection<Type>>(nameof(FilteredNodeTypes));
+    public static readonly StyledProperty<ObservableCollection<NodeTypeInfo>> FilteredNodeTypeInfosProperty =
+        AvaloniaProperty.Register<NodePicker, ObservableCollection<NodeTypeInfo>>(nameof(FilteredNodeTypeInfos));
 
-    public ObservableCollection<Type> AllNodeTypes
+    public ObservableCollection<NodeTypeInfo> AllNodeTypeInfos
     {
-        get => GetValue(AllNodeTypesProperty);
-        set => SetValue(AllNodeTypesProperty, value);
+        get => GetValue(AllNodeTypeInfosProperty);
+        set => SetValue(AllNodeTypeInfosProperty, value);
     }
 
-    public ObservableCollection<Type> FilteredNodeTypes
+    public ObservableCollection<NodeTypeInfo> FilteredNodeTypeInfos
     {
-        get { return (ObservableCollection<Type>)GetValue(FilteredNodeTypesProperty); }
-        set { SetValue(FilteredNodeTypesProperty, value); }
+        get => GetValue(FilteredNodeTypeInfosProperty);
+        set => SetValue(FilteredNodeTypeInfosProperty, value);
     }
 
     public static readonly StyledProperty<ICommand> SelectNodeCommandProperty = AvaloniaProperty.Register<NodePicker, ICommand>(
@@ -52,15 +53,15 @@ public partial class NodePicker : TemplatedControl
     static NodePicker()
     {
         SearchQueryProperty.Changed.Subscribe(OnSearchQueryChanged);
-        AllNodeTypesProperty.Changed.Subscribe(OnAllNodeTypesChanged);
+        AllNodeTypeInfosProperty.Changed.Subscribe(OnAllNodeTypesChanged);
     }
 
     private static void OnSearchQueryChanged(AvaloniaPropertyChangedEventArgs e)
     {
         if (e.Sender is NodePicker nodePicker)
         {
-            nodePicker.FilteredNodeTypes = new ObservableCollection<Type>(nodePicker.AllNodeTypes
-                .Where(x => x.Name.ToLower().Contains(nodePicker.SearchQuery.ToLower())));
+            // nodePicker.FilteredNodeTypes = new ObservableCollection<NodeTypeInfo>(nodePicker.AllNodeTypes
+            //     .Where(x => x.Name.ToLower().Contains(nodePicker.SearchQuery.ToLower())));
         }
     }
     
@@ -68,7 +69,7 @@ public partial class NodePicker : TemplatedControl
     {
         if (e.Sender is NodePicker nodePicker)
         {
-            nodePicker.FilteredNodeTypes = new ObservableCollection<Type>(nodePicker.AllNodeTypes);
+            nodePicker.FilteredNodeTypeInfos = new ObservableCollection<NodeTypeInfo>(nodePicker.AllNodeTypeInfos);
         }
     }
 }