Prechádzať zdrojové kódy

Added tool set icon customization

flabbet 10 mesiacov pred
rodič
commit
ff307db3db
27 zmenil súbory, kde vykonal 49 pridanie a 26 odobranie
  1. 6 3
      src/PixiEditor/Data/Configs/ToolSetsConfig.json
  2. 1 1
      src/PixiEditor/Models/Commands/CommandController.cs
  3. 1 0
      src/PixiEditor/Models/Config/ToolSetConfig.cs
  4. 1 1
      src/PixiEditor/Models/Handlers/IToolHandler.cs
  5. 1 0
      src/PixiEditor/Models/Handlers/IToolSetHandler.cs
  6. 3 0
      src/PixiEditor/ViewModels/SubViewModels/ToolSetViewModel.cs
  7. 6 1
      src/PixiEditor/ViewModels/SubViewModels/ToolsViewModel.cs
  8. 11 1
      src/PixiEditor/ViewModels/Tools/ToolViewModel.cs
  9. 1 1
      src/PixiEditor/ViewModels/Tools/Tools/BrightnessToolViewModel.cs
  10. 1 1
      src/PixiEditor/ViewModels/Tools/Tools/ColorPickerToolViewModel.cs
  11. 1 1
      src/PixiEditor/ViewModels/Tools/Tools/EraserToolViewModel.cs
  12. 1 1
      src/PixiEditor/ViewModels/Tools/Tools/FloodFillToolViewModel.cs
  13. 1 1
      src/PixiEditor/ViewModels/Tools/Tools/LassoToolViewModel.cs
  14. 1 1
      src/PixiEditor/ViewModels/Tools/Tools/MagicWandToolViewModel.cs
  15. 1 1
      src/PixiEditor/ViewModels/Tools/Tools/MoveToolViewModel.cs
  16. 1 1
      src/PixiEditor/ViewModels/Tools/Tools/MoveViewportToolViewModel.cs
  17. 1 1
      src/PixiEditor/ViewModels/Tools/Tools/PenToolViewModel.cs
  18. 1 1
      src/PixiEditor/ViewModels/Tools/Tools/RasterEllipseToolViewModel.cs
  19. 1 1
      src/PixiEditor/ViewModels/Tools/Tools/RasterLineToolViewModel.cs
  20. 1 1
      src/PixiEditor/ViewModels/Tools/Tools/RasterRectangleToolViewModel.cs
  21. 1 1
      src/PixiEditor/ViewModels/Tools/Tools/RotateViewportToolViewModel.cs
  22. 1 1
      src/PixiEditor/ViewModels/Tools/Tools/SelectToolViewModel.cs
  23. 1 1
      src/PixiEditor/ViewModels/Tools/Tools/VectorEllipseToolViewModel.cs
  24. 1 1
      src/PixiEditor/ViewModels/Tools/Tools/VectorLineToolViewModel.cs
  25. 1 1
      src/PixiEditor/ViewModels/Tools/Tools/VectorRectangleToolViewModel.cs
  26. 1 1
      src/PixiEditor/ViewModels/Tools/Tools/ZoomToolViewModel.cs
  27. 1 1
      src/PixiEditor/Views/Main/Tools/ToolPickerButton.axaml

+ 6 - 3
src/PixiEditor/Data/Configs/ToolSetsConfig.json

@@ -62,19 +62,22 @@
         "ToolName": "RasterLine",
         "Settings": {
           "AntiAliasing": true
-        }
+        },
+        "Icon": "\ue93a"
       },
       {
         "ToolName": "RasterEllipse",
         "Settings": {
           "AntiAliasing": true
-        }
+        },
+        "Icon": "\ue910"
       },
       {
         "ToolName": "RasterRectangle",
         "Settings": {
           "AntiAliasing": true
-        }
+        },
+        "Icon": "\uE953" 
       },
       {
         "ToolName": "Eraser",

+ 1 - 1
src/PixiEditor/Models/Commands/CommandController.cs

@@ -203,7 +203,7 @@ internal class CommandController
                 InternalName = internalName,
                 DisplayName = displayName,
                 Description = displayName,
-                Icon = toolInstance.Icon,
+                Icon = toolInstance.DefaultIcon,
                 IconEvaluator = IconEvaluator.Default,
                 TransientKey = toolAttr.Transient,
                 DefaultShortcut = toolAttr.GetShortcut(),

+ 1 - 0
src/PixiEditor/Models/Config/ToolSetConfig.cs

@@ -20,6 +20,7 @@ public class ToolConfig
     public string ToolName { get; set; }
     public Dictionary<string, object>? Settings { get; set; }
     public bool IsSimpleTool => Settings == null || Settings.Count == 0;
+    public string? Icon { get; set; }
 }
 
 public class ToolConverter : JsonConverter

+ 1 - 1
src/PixiEditor/Models/Handlers/IToolHandler.cs

@@ -12,7 +12,7 @@ internal interface IToolHandler : IHandler
     public LocalizedString DisplayName => new LocalizedString(ToolNameLocalizationKey);
     public string ToolName => GetType().Name.Replace("Tool", string.Empty).Replace("ViewModel", string.Empty);
     public string ToolNameLocalizationKey { get; }
-    public string Icon => $"icon-{ToolName.ToLower()}";
+    public string DefaultIcon => $"icon-{ToolName.ToLower()}";
     public Type[]? SupportedLayerTypes { get; }
 
     public bool HideHighlight { get; }

+ 1 - 0
src/PixiEditor/Models/Handlers/IToolSetHandler.cs

@@ -5,4 +5,5 @@ internal interface IToolSetHandler : IHandler
     public string Name { get; }
     public ICollection<IToolHandler> Tools { get; }
     public void ApplyToolSetSettings();
+    public IReadOnlyDictionary<IToolHandler, string> IconOverwrites { get; }
 }

+ 3 - 0
src/PixiEditor/ViewModels/SubViewModels/ToolSetViewModel.cs

@@ -9,8 +9,10 @@ internal class ToolSetViewModel : PixiObservableObject, IToolSetHandler
 {
     public string Name { get; }
     ICollection<IToolHandler> IToolSetHandler.Tools => Tools;
+    IReadOnlyDictionary<IToolHandler, string> IToolSetHandler.IconOverwrites => IconOverwrites;
 
     public ObservableCollection<IToolHandler> Tools { get; } = new();
+    public Dictionary<IToolHandler, string> IconOverwrites { get; set; } = new Dictionary<IToolHandler, string>();
 
     public ToolSetViewModel(string setName)
     {
@@ -29,4 +31,5 @@ internal class ToolSetViewModel : PixiObservableObject, IToolSetHandler
             tool.ApplyToolSetSettings(this);
         }
     }
+
 }

+ 6 - 1
src/PixiEditor/ViewModels/SubViewModels/ToolsViewModel.cs

@@ -428,11 +428,16 @@ internal class ToolsViewModel : SubViewModel<ViewModelMain>, IToolsHandler
         foreach (ToolSetConfig toolSet in toolSetConfig)
         {
             var toolSetViewModel = new ToolSetViewModel(toolSet.Name);
-    
+            
             foreach (var toolFromToolset in toolSet.Tools)
             {
                 IToolHandler? tool = allTools.FirstOrDefault(tool => tool.ToolName == toolFromToolset.ToolName);
                 tool.SetToolSetSettings(toolSetViewModel, toolFromToolset.Settings);
+
+                if (!string.IsNullOrEmpty(toolFromToolset.Icon))
+                {
+                    toolSetViewModel.IconOverwrites[tool] = toolFromToolset.Icon;
+                }
                 
                 if (tool is null)
                 {

+ 11 - 1
src/PixiEditor/ViewModels/Tools/ToolViewModel.cs

@@ -26,7 +26,7 @@ internal abstract class ToolViewModel : ObservableObject, IToolHandler
     public abstract string ToolNameLocalizationKey { get; }
     public virtual LocalizedString DisplayName => new LocalizedString(ToolNameLocalizationKey);
 
-    public virtual string Icon => $"\u25a1";
+    public virtual string DefaultIcon => $"\u25a1";
 
     public virtual BrushShape BrushShape => BrushShape.Square;
 
@@ -77,6 +77,10 @@ internal abstract class ToolViewModel : ObservableObject, IToolHandler
             OnPropertyChanged(nameof(ActionDisplay));
         }
     }
+    
+    public string IconOverwrite { get; set; }
+    
+    public string IconToUse => IconOverwrite ?? DefaultIcon;
 
     private bool isActive;
 
@@ -175,10 +179,16 @@ internal abstract class ToolViewModel : ObservableObject, IToolHandler
 
     public void ApplyToolSetSettings(IToolSetHandler toolset)
     {
+        IconOverwrite = null;
         foreach (var toolbarSetting in Toolbar.Settings)
         {
             toolbarSetting.ResetOverwrite();
         }
+        
+        if(toolset.IconOverwrites.TryGetValue(this, out var icon))
+        {
+            IconOverwrite = icon;
+        }
 
         if (!ToolSetSettings.TryGetValue(toolset, out var settings))
         {

+ 1 - 1
src/PixiEditor/ViewModels/Tools/Tools/BrightnessToolViewModel.cs

@@ -31,7 +31,7 @@ internal class BrightnessToolViewModel : ToolViewModel, IBrightnessToolHandler
 
     public override BrushShape BrushShape => BrushShape.Circle;
 
-    public override string Icon => PixiPerfectIcons.Sun;
+    public override string DefaultIcon => PixiPerfectIcons.Sun;
 
     public override Type[]? SupportedLayerTypes { get; } =
     {

+ 1 - 1
src/PixiEditor/ViewModels/Tools/Tools/ColorPickerToolViewModel.cs

@@ -30,7 +30,7 @@ internal class ColorPickerToolViewModel : ToolViewModel, IColorPickerHandler
     public override string ToolNameLocalizationKey => "COLOR_PICKER_TOOL";
     public override BrushShape BrushShape => BrushShape.Pixel;
 
-    public override string Icon => PixiPerfectIcons.Picker;
+    public override string DefaultIcon => PixiPerfectIcons.Picker;
 
     public override Type[]? SupportedLayerTypes { get; } = null;  // all layer types are supported
 

+ 1 - 1
src/PixiEditor/ViewModels/Tools/Tools/EraserToolViewModel.cs

@@ -33,7 +33,7 @@ internal class EraserToolViewModel : ToolViewModel, IEraserToolHandler
         typeof(IRasterLayerHandler)
     };
 
-    public override string Icon => PixiPerfectIcons.Eraser;
+    public override string DefaultIcon => PixiPerfectIcons.Eraser;
 
     public override LocalizedString Tooltip => new LocalizedString("ERASER_TOOL_TOOLTIP", Shortcut);
 

+ 1 - 1
src/PixiEditor/ViewModels/Tools/Tools/FloodFillToolViewModel.cs

@@ -32,7 +32,7 @@ internal class FloodFillToolViewModel : ToolViewModel, IFloodFillToolHandler
     [Settings.Percent("TOLERANCE_LABEL", ExposedByDefault = false)]
     public float Tolerance => GetValue<float>();
 
-    public override string Icon => PixiPerfectIcons.Bucket;
+    public override string DefaultIcon => PixiPerfectIcons.Bucket;
 
     public FloodFillToolViewModel()
     {

+ 1 - 1
src/PixiEditor/ViewModels/Tools/Tools/LassoToolViewModel.cs

@@ -49,7 +49,7 @@ internal class LassoToolViewModel : ToolViewModel, ILassoToolHandler
     public override LocalizedString Tooltip => new LocalizedString("LASSO_TOOL_TOOLTIP", Shortcut);
 
     public override string ToolNameLocalizationKey => "LASSO_TOOL";
-    public string Icon => PixiPerfectIcons.Lasso;
+    public override string DefaultIcon => PixiPerfectIcons.Lasso;
     public override BrushShape BrushShape => BrushShape.Pixel;
     
     public override Type[]? SupportedLayerTypes { get; } = null; // all layer types are supported

+ 1 - 1
src/PixiEditor/ViewModels/Tools/Tools/MagicWandToolViewModel.cs

@@ -31,7 +31,7 @@ internal class MagicWandToolViewModel : ToolViewModel, IMagicWandToolHandler
     [Settings.Percent("TOLERANCE_LABEL", ExposedByDefault = false)]
     public float Tolerance => GetValue<float>();
 
-    public override string Icon => PixiPerfectIcons.MagicWand;
+    public override string DefaultIcon => PixiPerfectIcons.MagicWand;
 
     public MagicWandToolViewModel()
     {

+ 1 - 1
src/PixiEditor/ViewModels/Tools/Tools/MoveToolViewModel.cs

@@ -24,7 +24,7 @@ internal class MoveToolViewModel : ToolViewModel, IMoveToolHandler
     private bool transformingSelectedArea = false;
     public bool MoveAllLayers { get; set; }
 
-    public override string Icon => PixiPerfectIcons.MousePointer;
+    public override string DefaultIcon => PixiPerfectIcons.MousePointer;
 
     public MoveToolViewModel()
     {

+ 1 - 1
src/PixiEditor/ViewModels/Tools/Tools/MoveViewportToolViewModel.cs

@@ -16,7 +16,7 @@ internal class MoveViewportToolViewModel : ToolViewModel
     public override bool HideHighlight => true;
     public override LocalizedString Tooltip => new LocalizedString("MOVE_VIEWPORT_TOOLTIP", Shortcut);
 
-    public override string Icon => PixiPerfectIcons.MoveView;
+    public override string DefaultIcon => PixiPerfectIcons.MoveView;
 
     public override bool StopsLinkedToolOnUse => false;
 

+ 1 - 1
src/PixiEditor/ViewModels/Tools/Tools/PenToolViewModel.cs

@@ -40,7 +40,7 @@ namespace PixiEditor.ViewModels.Tools.Tools
         [Settings.Bool("PIXEL_PERFECT_SETTING", Notify = nameof(PixelPerfectChanged), ExposedByDefault = false)]
         public bool PixelPerfectEnabled => GetValue<bool>();
 
-        public override string Icon => PixiPerfectIcons.Pen;
+        public override string DefaultIcon => PixiPerfectIcons.Pen;
 
         public override Type LayerTypeToCreateOnEmptyUse { get; } = typeof(ImageLayerNode);
 

+ 1 - 1
src/PixiEditor/ViewModels/Tools/Tools/RasterEllipseToolViewModel.cs

@@ -25,7 +25,7 @@ internal class RasterEllipseToolViewModel : ShapeTool, IRasterEllipseToolHandler
     public override LocalizedString Tooltip => new LocalizedString("ELLIPSE_TOOL_TOOLTIP", Shortcut);
     public bool DrawCircle { get; private set; }
 
-    public override string Icon => PixiPerfectIcons.LowResCircle;
+    public override string DefaultIcon => PixiPerfectIcons.LowResCircle;
 
     public override Type LayerTypeToCreateOnEmptyUse { get; } = typeof(ImageLayerNode);
 

+ 1 - 1
src/PixiEditor/ViewModels/Tools/Tools/RasterLineToolViewModel.cs

@@ -27,7 +27,7 @@ internal class RasterLineToolViewModel : ShapeTool, ILineToolHandler
     public override LocalizedString Tooltip => new LocalizedString("LINE_TOOL_TOOLTIP", Shortcut);
 
     public override Type[]? SupportedLayerTypes { get; } = { typeof(IRasterLayerHandler) };
-    public override string Icon => PixiPerfectIcons.LowResLine;
+    public override string DefaultIcon => PixiPerfectIcons.LowResLine;
 
     [Settings.Inherited] public int ToolSize => GetValue<int>();
 

+ 1 - 1
src/PixiEditor/ViewModels/Tools/Tools/RasterRectangleToolViewModel.cs

@@ -26,7 +26,7 @@ internal class RasterRectangleToolViewModel : ShapeTool, IRasterRectangleToolHan
     public bool Filled { get; set; } = false;
     public bool DrawSquare { get; private set; } = false;
 
-    public override string Icon => PixiPerfectIcons.LowResSquare;
+    public override string DefaultIcon => PixiPerfectIcons.LowResSquare;
 
     public override Type LayerTypeToCreateOnEmptyUse { get; } = typeof(ImageLayerNode);
 

+ 1 - 1
src/PixiEditor/ViewModels/Tools/Tools/RotateViewportToolViewModel.cs

@@ -17,7 +17,7 @@ internal class RotateViewportToolViewModel : ToolViewModel
     public override bool StopsLinkedToolOnUse => false;
     public override LocalizedString Tooltip => new LocalizedString("ROTATE_VIEWPORT_TOOLTIP", Shortcut);
 
-    public override string Icon => PixiPerfectIcons.RotateView;
+    public override string DefaultIcon => PixiPerfectIcons.RotateView;
 
     public RotateViewportToolViewModel()
     {

+ 1 - 1
src/PixiEditor/ViewModels/Tools/Tools/SelectToolViewModel.cs

@@ -18,7 +18,7 @@ internal class SelectToolViewModel : ToolViewModel, ISelectToolHandler
     private string defaultActionDisplay = "SELECT_TOOL_ACTION_DISPLAY_DEFAULT";
     public override string ToolNameLocalizationKey => "SELECT_TOOL_NAME";
 
-    public override string Icon => PixiPerfectIcons.RectangleSelection;
+    public override string DefaultIcon => PixiPerfectIcons.RectangleSelection;
 
     public SelectToolViewModel()
     {

+ 1 - 1
src/PixiEditor/ViewModels/Tools/Tools/VectorEllipseToolViewModel.cs

@@ -28,7 +28,7 @@ internal class VectorEllipseToolViewModel : ShapeTool, IVectorEllipseToolHandler
     public override LocalizedString Tooltip => new LocalizedString("ELLIPSE_TOOL_TOOLTIP", Shortcut);
     public bool DrawCircle { get; private set; }
 
-    public override string Icon => PixiPerfectIcons.Circle;
+    public override string DefaultIcon => PixiPerfectIcons.Circle;
 
     public override Type LayerTypeToCreateOnEmptyUse { get; } = typeof(VectorLayerNode);
 

+ 1 - 1
src/PixiEditor/ViewModels/Tools/Tools/VectorLineToolViewModel.cs

@@ -30,7 +30,7 @@ internal class VectorLineToolViewModel : ShapeTool, IVectorLineToolHandler
     public override string ToolNameLocalizationKey => "LINE_TOOL";
     public override LocalizedString Tooltip => new LocalizedString("LINE_TOOL_TOOLTIP", Shortcut);
 
-    public override string Icon => PixiPerfectIcons.Line;
+    public override string DefaultIcon => PixiPerfectIcons.Line;
     public override Type[]? SupportedLayerTypes { get; } = [];
     public string? DefaultNewLayerName { get; } = new LocalizedString("NEW_LINE_LAYER_NAME");
 

+ 1 - 1
src/PixiEditor/ViewModels/Tools/Tools/VectorRectangleToolViewModel.cs

@@ -27,7 +27,7 @@ internal class VectorRectangleToolViewModel : ShapeTool, IVectorRectangleToolHan
     public override LocalizedString Tooltip => new LocalizedString("RECTANGLE_TOOL_TOOLTIP", Shortcut);
     public bool DrawSquare { get; private set; }
 
-    public override string Icon => PixiPerfectIcons.Square;
+    public override string DefaultIcon => PixiPerfectIcons.Square;
 
     public override Type LayerTypeToCreateOnEmptyUse { get; } = typeof(VectorLayerNode);
     public string? DefaultNewLayerName { get; } = new LocalizedString("NEW_RECTANGLE_LAYER_NAME");

+ 1 - 1
src/PixiEditor/ViewModels/Tools/Tools/ZoomToolViewModel.cs

@@ -24,7 +24,7 @@ internal class ZoomToolViewModel : ToolViewModel
 
     public override bool StopsLinkedToolOnUse => false;
 
-    public override string Icon => PixiPerfectIcons.ZoomIn;
+    public override string DefaultIcon => PixiPerfectIcons.ZoomIn;
 
     public ZoomToolViewModel()
     {

+ 1 - 1
src/PixiEditor/Views/Main/Tools/ToolPickerButton.axaml

@@ -30,7 +30,7 @@
         <Button.Content>
             <Grid>
                 <TextBlock Classes="pixi-icon" FontSize="24" HorizontalAlignment="Center" VerticalAlignment="Center"
-                           Text="{Binding Path=Icon}" />
+                           Text="{Binding Path=IconToUse}" />
                 <TextBlock Background="{DynamicResource ThemeBorderLowBrush}"
                            IsVisible="{Binding !CanBeUsedOnActiveLayer}"
                            Classes="pixi-icon" FontSize="12" Text="{DynamicResource icon-plus-square}"