Browse Source

Fixed tooltip and better font resource management

flabbet 7 tháng trước cách đây
mục cha
commit
5bf02ca13f

+ 1 - 1
src/Drawie

@@ -1 +1 @@
-Subproject commit caab060fde13ac34ea13f85bf6e6ed63b5162d63
+Subproject commit 660dca615ac67c1c2e5b3c312753b4039044fc86

+ 1 - 7
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/Shapes/Data/TextVectorData.cs

@@ -8,7 +8,7 @@ using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces.Shapes;
 
 namespace PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.Shapes.Data;
 
-public class TextVectorData : ShapeVectorData, IReadOnlyTextData, IDisposable
+public class TextVectorData : ShapeVectorData, IReadOnlyTextData
 {
     private string text;
     private Font font = Font.CreateDefault();
@@ -163,10 +163,4 @@ public class TextVectorData : ShapeVectorData, IReadOnlyTextData, IDisposable
     {
         return GetCacheHash();
     }
-
-    public void Dispose()
-    {
-        Font.Dispose();
-        Path?.Dispose();
-    }
 }

+ 0 - 6
src/PixiEditor.ChangeableDocument/Changes/Vectors/SetShapeGeometry_UpdateableChange.cs

@@ -42,14 +42,8 @@ internal class SetShapeGeometry_UpdateableChange : InterruptableUpdateableChange
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> ApplyTemporarily(Document target)
     {
         var node = target.FindNode<VectorLayerNode>(TargetId);
-        IDisposable? toDispose = null;
-        if (node.ShapeData is IDisposable disposable)
-        {
-            toDispose = disposable;
-        }
 
         node.ShapeData = Data;
-        toDispose?.Dispose();
         
         RectD aabb = node.ShapeData.TransformedAABB.RoundOutwards();
         aabb = aabb with { Size = new VecD(Math.Max(1, aabb.Size.X), Math.Max(1, aabb.Size.Y)) };

+ 36 - 4
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/VectorTextToolExecutor.cs

@@ -1,4 +1,5 @@
 using Avalonia.Input;
+using Avalonia.Threading;
 using Drawie.Backend.Core.ColorsImpl;
 using Drawie.Backend.Core.Numerics;
 using Drawie.Backend.Core.Text;
@@ -23,6 +24,7 @@ internal class VectorTextToolExecutor : UpdateableChangeExecutor, ITextOverlayEv
     private string lastText = "";
     private VecD position;
     private Matrix3X3 lastMatrix = Matrix3X3.Identity;
+    private Font? cachedFont;
 
     public override ExecutorType Type => ExecutorType.ToolLinked;
 
@@ -92,9 +94,26 @@ internal class VectorTextToolExecutor : UpdateableChangeExecutor, ITextOverlayEv
 
     public override void OnSettingsChanged(string name, object value)
     {
-        if (name is nameof(ITextToolbar.FontSize) or nameof(ITextToolbar.FontFamily))
+        if (name == nameof(ITextToolbar.FontFamily))
         {
-            document.TextOverlayHandler.Font = toolbar.ConstructFont();
+            Font toDispose = cachedFont;
+            Dispatcher.UIThread.Post(() =>
+            {
+                toDispose?.Dispose();
+            });
+
+            cachedFont = toolbar.ConstructFont();
+            document.TextOverlayHandler.Font = cachedFont;
+        }
+        else if (name is nameof(ITextToolbar.FontSize))
+        {
+            if(cachedFont == null)
+            {
+                cachedFont = toolbar.ConstructFont();
+            }
+            
+            document.TextOverlayHandler.Font.Size = toolbar.FontSize;
+            cachedFont.Size = toolbar.FontSize;
         }
 
         var constructedText = ConstructTextData(lastText);
@@ -119,7 +138,20 @@ internal class VectorTextToolExecutor : UpdateableChangeExecutor, ITextOverlayEv
 
     private TextVectorData ConstructTextData(string text)
     {
-        Font font = toolbar.ConstructFont();
+        if (cachedFont == null || cachedFont.Family.Name != toolbar.FontFamily.Name)
+        {
+            Font toDispose = cachedFont;
+            Dispatcher.UIThread.Post(() =>
+            {
+                toDispose?.Dispose();
+            });
+            cachedFont = toolbar.ConstructFont();
+        }
+        else
+        {
+            cachedFont.Size = toolbar.FontSize;
+        }
+
         return new TextVectorData()
         {
             Text = text,
@@ -129,7 +161,7 @@ internal class VectorTextToolExecutor : UpdateableChangeExecutor, ITextOverlayEv
             StrokeWidth = (float)toolbar.ToolSize,
             StrokeColor = toolbar.StrokeColor.ToColor(),
             TransformationMatrix = lastMatrix,
-            Font = font,
+            Font = cachedFont,
             Spacing = toolbar.Spacing,
             AntiAlias = toolbar.AntiAliasing,
             // TODO: MaxWidth = toolbar.MaxWidth

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

@@ -15,7 +15,7 @@ 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 LocalizedString Tooltip => new LocalizedString("TEXT_TOOL_TOOLTIP", Shortcut);
 
     public override bool IsErasable => false;
     public override bool StopsLinkedToolOnUse => false;