Browse Source

Text tool wip, fixed some text vector data stuff

flabbet 6 months ago
parent
commit
21394ded83

+ 1 - 1
src/Drawie

@@ -1 +1 @@
-Subproject commit 049b8297bb5dbbdc0439f5286bc52dcdcdab522a
+Subproject commit 2f3d129a0f1283b9ab34908e965507d689c3c066

+ 24 - 3
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/Shapes/Data/TextVectorData.cs

@@ -10,9 +10,27 @@ public class TextVectorData : ShapeVectorData
 {
 {
     public string Text { get; set; }
     public string Text { get; set; }
     public VecD Position { get; set; }
     public VecD Position { get; set; }
-    public Font Font { get; set; }
+    public Font Font { get; set; } = Font.CreateDefault();
 
 
-    public override RectD GeometryAABB => new RectD(Position.X, Position.Y, Font.MeasureText(Text), Font.Size);
+    public override RectD GeometryAABB
+    {
+        get
+        {
+            PaintStyle style = PaintStyle.StrokeAndFill;
+            if(!Fill && StrokeWidth > 0)
+            {
+                style = PaintStyle.Stroke;
+            }
+            else if(Fill && FillColor.A > 0 && StrokeWidth <= 0)
+            {
+                style = PaintStyle.Fill;
+            }
+            
+            using Paint paint = new Paint() { StrokeWidth = StrokeWidth, Style = style };
+            Font.MeasureText(Text, out RectD bounds, paint);
+            return bounds.Offset(Position);
+        }
+    }
 
 
     public override ShapeCorners TransformationCorners =>
     public override ShapeCorners TransformationCorners =>
         new ShapeCorners(GeometryAABB).WithMatrix(TransformationMatrix);
         new ShapeCorners(GeometryAABB).WithMatrix(TransformationMatrix);
@@ -22,7 +40,10 @@ public class TextVectorData : ShapeVectorData
 
 
     public override VectorPath ToPath()
     public override VectorPath ToPath()
     {
     {
-        return Font.GetTextPath(Text);
+        var path = Font.GetTextPath(Text);
+        path.Offset(Position);
+        
+        return path;
     }
     }
 
 
     public override void RasterizeGeometry(Canvas canvas)
     public override void RasterizeGeometry(Canvas canvas)

+ 6 - 2
src/PixiEditor.UI.Common/Accents/Base.axaml

@@ -56,10 +56,13 @@
             <Color x:Key="IntSocketColor">#4C64B1</Color>
             <Color x:Key="IntSocketColor">#4C64B1</Color>
             <Color x:Key="EllipseDataSocketColor">#a473a5</Color>
             <Color x:Key="EllipseDataSocketColor">#a473a5</Color>
             <Color x:Key="PointsDataSocketColor">#e1d0e1</Color>
             <Color x:Key="PointsDataSocketColor">#e1d0e1</Color>
+            <Color x:Key="TextDataSocketColor">#f2f2f2</Color>
             <GradientStops x:Key="ShapeDataSocketGradient">
             <GradientStops x:Key="ShapeDataSocketGradient">
                 <GradientStop Offset="0" Color="{StaticResource EllipseDataSocketColor}"/>
                 <GradientStop Offset="0" Color="{StaticResource EllipseDataSocketColor}"/>
-                <GradientStop Offset="0.5" Color="{StaticResource EllipseDataSocketColor}"/>
-                <GradientStop Offset="0.5" Color="{StaticResource PointsDataSocketColor}"/>
+                <GradientStop Offset="0.33" Color="{StaticResource EllipseDataSocketColor}"/>
+                <GradientStop Offset="0.33" Color="{StaticResource TextDataSocketColor}"/>
+                <GradientStop Offset="0.66" Color="{StaticResource TextDataSocketColor}"/>
+                <GradientStop Offset="0.66" Color="{StaticResource PointsDataSocketColor}"/>
                 <GradientStop Offset="1" Color="{StaticResource PointsDataSocketColor}"/>
                 <GradientStop Offset="1" Color="{StaticResource PointsDataSocketColor}"/>
             </GradientStops>
             </GradientStops>
             
             
@@ -145,6 +148,7 @@
             <ConicGradientBrush x:Key="ShapeVectorDataSocketBrush" GradientStops="{StaticResource ShapeDataSocketGradient}"/>
             <ConicGradientBrush x:Key="ShapeVectorDataSocketBrush" GradientStops="{StaticResource ShapeDataSocketGradient}"/>
             <SolidColorBrush x:Key="EllipseVectorDataSocketBrush" Color="{StaticResource EllipseDataSocketColor}"/>
             <SolidColorBrush x:Key="EllipseVectorDataSocketBrush" Color="{StaticResource EllipseDataSocketColor}"/>
             <SolidColorBrush x:Key="PointsVectorDataSocketBrush" Color="{StaticResource PointsDataSocketColor}"/>
             <SolidColorBrush x:Key="PointsVectorDataSocketBrush" Color="{StaticResource PointsDataSocketColor}"/>
+            <SolidColorBrush x:Key="TextVectorDataSocketBrush" Color="{StaticResource TextDataSocketColor}"/>
             
             
             <!-- Zones & Frames -->
             <!-- Zones & Frames -->
             <SolidColorBrush x:Key="PixiEditorModifyImageLeftBorderBrush" Color="{StaticResource PixiEditorModifyImageBorderColor}"/>
             <SolidColorBrush x:Key="PixiEditorModifyImageLeftBorderBrush" Color="{StaticResource PixiEditorModifyImageBorderColor}"/>

+ 2 - 1
src/PixiEditor/Data/Configs/ToolSetsConfig.json

@@ -102,7 +102,8 @@
       "VectorPath",
       "VectorPath",
       "VectorLine",
       "VectorLine",
       "VectorEllipse",
       "VectorEllipse",
-      "VectorRectangle"
+      "VectorRectangle",
+      "Text"
     ]
     ]
   }
   }
 ]
 ]

+ 1 - 0
src/PixiEditor/Helpers/ServiceCollectionHelpers.cs

@@ -100,6 +100,7 @@ internal static class ServiceCollectionHelpers
             .AddTool<IVectorRectangleToolHandler, VectorRectangleToolViewModel>()
             .AddTool<IVectorRectangleToolHandler, VectorRectangleToolViewModel>()
             .AddTool<IVectorLineToolHandler, VectorLineToolViewModel>()
             .AddTool<IVectorLineToolHandler, VectorLineToolViewModel>()
             .AddTool<IVectorPathToolHandler, VectorPathToolViewModel>()
             .AddTool<IVectorPathToolHandler, VectorPathToolViewModel>()
+            .AddTool<ITextToolHandler, TextToolViewModel>()
             .AddTool<ZoomToolViewModel>()
             .AddTool<ZoomToolViewModel>()
             // File types
             // File types
             .AddSingleton<IoFileType, PixiFileType>()
             .AddSingleton<IoFileType, PixiFileType>()

+ 3 - 3
src/PixiEditor/Models/Controllers/ShortcutController.cs

@@ -38,14 +38,14 @@ internal class ShortcutController
         _shortcutExecutionBlockers.Clear();
         _shortcutExecutionBlockers.Clear();
     }
     }
 
 
-    public KeyCombination GetToolShortcut<T>()
+    public KeyCombination? GetToolShortcut<T>()
     {
     {
         return GetToolShortcut(typeof(T));
         return GetToolShortcut(typeof(T));
     }
     }
 
 
-    public KeyCombination GetToolShortcut(Type type)
+    public KeyCombination? GetToolShortcut(Type type)
     {
     {
-        return CommandController.Current.Commands.First(x => x is Command.ToolCommand tool && tool.ToolType == type).Shortcut;
+        return CommandController.Current.Commands.FirstOrDefault(x => x is Command.ToolCommand tool && tool.ToolType == type)?.Shortcut;
     }
     }
 
 
     public void KeyPressed(bool isRepeat, Key key, KeyModifiers modifiers)
     public void KeyPressed(bool isRepeat, Key key, KeyModifiers modifiers)

+ 6 - 0
src/PixiEditor/Models/DocumentModels/Public/DocumentToolsModule.cs

@@ -79,4 +79,10 @@ internal class DocumentToolsModule
     public void UseLassoTool() => Internals.ChangeController.TryStartExecutor<LassoToolExecutor>();
     public void UseLassoTool() => Internals.ChangeController.TryStartExecutor<LassoToolExecutor>();
 
 
     public void UseMagicWandTool() => Internals.ChangeController.TryStartExecutor<MagicWandToolExecutor>();
     public void UseMagicWandTool() => Internals.ChangeController.TryStartExecutor<MagicWandToolExecutor>();
+
+    public void UseVectorTextTool()
+    {
+        bool force = Internals.ChangeController.GetCurrentExecutorType() == ExecutorType.ToolLinked;
+        Internals.ChangeController.TryStartExecutor<VectorTextToolExecutor>(force);
+    }
 }
 }

+ 55 - 0
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/VectorTextToolExecutor.cs

@@ -0,0 +1,55 @@
+using Drawie.Numerics;
+using PixiEditor.ChangeableDocument.Actions.Generated;
+using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.Shapes.Data;
+using PixiEditor.Models.Handlers;
+using PixiEditor.Models.Handlers.Toolbars;
+using PixiEditor.Models.Handlers.Tools;
+using PixiEditor.Models.Tools;
+
+namespace PixiEditor.Models.DocumentModels.UpdateableChangeExecutors;
+
+internal class VectorTextToolExecutor : UpdateableChangeExecutor
+{
+    private ITextToolHandler textHandler;
+    private IFillableShapeToolbar toolbar;
+
+    public override ExecutionState Start()
+    {
+        textHandler = GetHandler<ITextToolHandler>();
+        if (textHandler == null)
+        {
+            return ExecutionState.Error;
+        }
+
+        toolbar = textHandler.Toolbar as IFillableShapeToolbar;
+        if (toolbar == null)
+        {
+            return ExecutionState.Error;
+        }
+
+        var selectedMember = document.SelectedStructureMember;
+
+        if (selectedMember is not IVectorLayerHandler layerHandler)
+        {
+            return ExecutionState.Error;
+        }
+
+        var shape = layerHandler.GetShapeData(document.AnimationHandler.ActiveFrameBindable);
+        if (shape != null && shape is not TextVectorData textData)
+        {
+            return ExecutionState.Error;
+        }
+
+        internals.ActionAccumulator.AddFinishedActions(
+            new SetShapeGeometry_Action(selectedMember.Id,
+                new TextVectorData() { Text = "Test", Position = document.SizeBindable / 2f }),
+            new EndSetShapeGeometry_Action());
+        //document.TextHandler.ShowOverlay(textData.Text
+
+        return ExecutionState.Success;
+    }
+
+    public override void ForceStop()
+    {
+    }
+}

+ 6 - 0
src/PixiEditor/Models/Handlers/Tools/ITextToolHandler.cs

@@ -0,0 +1,6 @@
+namespace PixiEditor.Models.Handlers.Tools;
+
+internal interface ITextToolHandler : IToolHandler
+{
+    
+}

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

@@ -146,7 +146,11 @@ internal class ToolsViewModel : SubViewModel<ViewModelMain>, IToolsHandler
         {
         {
             if (tool is ToolViewModel toolVm)
             if (tool is ToolViewModel toolVm)
             {
             {
-                toolVm.Shortcut = Owner.ShortcutController.GetToolShortcut(tool.GetType());
+                var combination = Owner.ShortcutController.GetToolShortcut(tool.GetType());
+                if (combination is not null)
+                {
+                    toolVm.Shortcut = combination.Value;
+                }
             }
             }
         }
         }
     }
     }

+ 23 - 0
src/PixiEditor/ViewModels/Tools/ToolSettings/Toolbars/TextToolbar.cs

@@ -0,0 +1,23 @@
+using Drawie.Backend.Core.Text;
+
+namespace PixiEditor.ViewModels.Tools.ToolSettings.Toolbars;
+
+internal class TextToolbar : FillableShapeToolbar
+{
+    /*public Font Font
+    {
+        get
+        {
+            return GetSetting<FontSettingViewModel>(nameof(Font)).Value;
+        }
+        set
+        {
+            GetSetting<FontSettingViewModel>(nameof(Font)).Value = value;
+        }
+    }
+    
+    public TextToolbar()
+    {
+        AddSetting(new FontSettingViewModel(nameof(Font), "FONT_LABEL"));
+    }*/
+}

+ 39 - 0
src/PixiEditor/ViewModels/Tools/Tools/TextToolViewModel.cs

@@ -0,0 +1,39 @@
+using Avalonia.Input;
+using Drawie.Numerics;
+using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
+using PixiEditor.Extensions.Common.Localization;
+using PixiEditor.Models.Commands.Attributes.Commands;
+using PixiEditor.Models.Handlers.Tools;
+using PixiEditor.ViewModels.Tools.ToolSettings.Toolbars;
+
+namespace PixiEditor.ViewModels.Tools.Tools;
+
+[Command.Tool(Key = Key.T)]
+internal class TextToolViewModel : ToolViewModel, ITextToolHandler
+{
+    public override string ToolNameLocalizationKey => "TEXT_TOOL";
+    public override Type[]? SupportedLayerTypes => [];
+    public override Type LayerTypeToCreateOnEmptyUse => typeof(VectorLayerNode);
+    public override LocalizedString Tooltip => new LocalizedString("TEXT_TOOL_TOOLTIP");
+
+    public override bool IsErasable => false;
+    public override bool StopsLinkedToolOnUse => false;
+
+    public TextToolViewModel()
+    {
+        Toolbar = ToolbarFactory.Create<TextToolViewModel, TextToolbar>(this);
+    }
+
+    public override void UseTool(VecD pos)
+    {
+        ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument?.Tools.UseVectorTextTool();
+    }
+
+    protected override void OnSelected(bool restoring)
+    {
+    }
+
+    protected override void OnDeselecting(bool transient)
+    {
+    }
+}