Browse Source

Exract characters

Krzysztof Krysiński 2 months ago
parent
commit
9abd3f2169

+ 18 - 5
src/PixiEditor.ChangeableDocument/Changes/Text/ExtractSelectedText_Change.cs

@@ -15,6 +15,7 @@ internal class ExtractSelectedText_Change : Change
 {
 {
     private readonly Guid memberId;
     private readonly Guid memberId;
     private Guid[] newLayerIds;
     private Guid[] newLayerIds;
+    private bool extractEachCharacter = false;
     private int selectionStart;
     private int selectionStart;
     private int selectionEnd;
     private int selectionEnd;
     private string? originalText = null;
     private string? originalText = null;
@@ -23,11 +24,12 @@ internal class ExtractSelectedText_Change : Change
 
 
 
 
     [GenerateMakeChangeAction]
     [GenerateMakeChangeAction]
-    public ExtractSelectedText_Change(Guid memberId, int selectionStart, int selectionEnd)
+    public ExtractSelectedText_Change(Guid memberId, int selectionStart, int selectionEnd, bool extractEachCharacter)
     {
     {
         this.memberId = memberId;
         this.memberId = memberId;
         this.selectionStart = selectionStart;
         this.selectionStart = selectionStart;
         this.selectionEnd = selectionEnd;
         this.selectionEnd = selectionEnd;
+        this.extractEachCharacter = extractEachCharacter;
     }
     }
 
 
     public override bool InitializeAndValidate(Document target)
     public override bool InitializeAndValidate(Document target)
@@ -46,7 +48,7 @@ internal class ExtractSelectedText_Change : Change
 
 
         originalText = textData.Text;
         originalText = textData.Text;
 
 
-        subdividions = GetSubdivisions(selectionStart, selectionEnd, textData.Text);
+        subdividions = GetSubdivisions(selectionStart, selectionEnd, textData.Text, extractEachCharacter);
 
 
         subdividions?.RemoveAll(x => x.text == "\n");
         subdividions?.RemoveAll(x => x.text == "\n");
 
 
@@ -193,15 +195,16 @@ internal class ExtractSelectedText_Change : Change
         return new VecD(position.X, (1 / RichText.PtToPx) * lineOffset.Y);
         return new VecD(position.X, (1 / RichText.PtToPx) * lineOffset.Y);
     }
     }
 
 
-    private List<(int start, int end, string text)>? GetSubdivisions(int start, int end, string text)
+    private List<(int start, int end, string text)>? GetSubdivisions(int start, int end, string text, bool extractEachCharacter)
     {
     {
-        if (start == 0 && end == text.Length)
+        if (start == 0 && end == text.Length && !extractEachCharacter)
             return null;
             return null;
 
 
         if (end - start == 1 && start < text.Length && text[start] == '\n')
         if (end - start == 1 && start < text.Length && text[start] == '\n')
             return null;
             return null;
 
 
         var result = new List<(int start, int end, string text)>();
         var result = new List<(int start, int end, string text)>();
+
         var richText = new RichText(text);
         var richText = new RichText(text);
 
 
         richText.IndexOnLine(start, out int startLineIndex);
         richText.IndexOnLine(start, out int startLineIndex);
@@ -225,7 +228,17 @@ internal class ExtractSelectedText_Change : Change
 
 
         if (cursor < end)
         if (cursor < end)
         {
         {
-            result.Add((cursor, end, text.Substring(cursor, end - cursor)));
+            if (extractEachCharacter)
+            {
+                for(int i = cursor; i < end; i++)
+                {
+                    result.Add((i, i + 1, text.Substring(i, 1)));
+                }
+            }
+            else
+            {
+                result.Add((cursor, end, text.Substring(cursor, end - cursor)));
+            }
             cursor = end;
             cursor = end;
 
 
             if (cursor >= text.Length)
             if (cursor >= text.Length)

+ 2 - 2
src/PixiEditor/Models/DocumentModels/Public/DocumentOperationsModule.cs

@@ -968,7 +968,7 @@ internal class DocumentOperationsModule : IDocumentOperations
         Internals.ActionAccumulator.AddFinishedActions(new SeparateShapes_Action(memberId));
         Internals.ActionAccumulator.AddFinishedActions(new SeparateShapes_Action(memberId));
     }
     }
 
 
-    public void ExtractSelectedText(Guid memberId, int startIndex, int endIndex)
+    public void ExtractSelectedText(Guid memberId, int startIndex, int endIndex, bool extractEachCharacter)
     {
     {
         if (Internals.ChangeController.IsBlockingChangeActive)
         if (Internals.ChangeController.IsBlockingChangeActive)
             return;
             return;
@@ -976,6 +976,6 @@ internal class DocumentOperationsModule : IDocumentOperations
         Internals.ChangeController.TryStopActiveExecutor();
         Internals.ChangeController.TryStopActiveExecutor();
 
 
         Internals.ActionAccumulator.AddFinishedActions(
         Internals.ActionAccumulator.AddFinishedActions(
-            new ExtractSelectedText_Action(memberId, startIndex, endIndex));
+            new ExtractSelectedText_Action(memberId, startIndex, endIndex, extractEachCharacter));
     }
     }
 }
 }

+ 9 - 2
src/PixiEditor/ViewModels/SubViewModels/LayersViewModel.cs

@@ -605,9 +605,16 @@ internal class LayersViewModel : SubViewModel<ViewModelMain>
     [Command.Basic("PixiEditor.Layer.ExtractSelectedText", "EXTRACT_SELECTED_TEXT", "EXTRACT_SELECTED_TEXT_DESCRIPTIVE",
     [Command.Basic("PixiEditor.Layer.ExtractSelectedText", "EXTRACT_SELECTED_TEXT", "EXTRACT_SELECTED_TEXT_DESCRIPTIVE",
         CanExecute = "PixiEditor.Layer.SelectedMemberIsSelectedText",
         CanExecute = "PixiEditor.Layer.SelectedMemberIsSelectedText",
         Key = Key.X, Modifiers = KeyModifiers.Control | KeyModifiers.Shift,
         Key = Key.X, Modifiers = KeyModifiers.Control | KeyModifiers.Shift,
+        Parameter = false,
         ShortcutContexts = [ typeof(ViewportWindowViewModel), typeof(TextOverlay)],
         ShortcutContexts = [ typeof(ViewportWindowViewModel), typeof(TextOverlay)],
         MenuItemPath = "LAYER/TEXT/EXTRACT_SELECTED_TEXT", AnalyticsTrack = true)]
         MenuItemPath = "LAYER/TEXT/EXTRACT_SELECTED_TEXT", AnalyticsTrack = true)]
-    public void ExtractSelectedText()
+    [Command.Basic("PixiEditor.Layer.ExtractSelectedCharacters", "EXTRACT_SELECTED_CHARACTERS", "EXTRACT_SELECTED_CHARACTERS_DESCRIPTIVE",
+        CanExecute = "PixiEditor.Layer.SelectedMemberIsSelectedText",
+        Key = Key.X, Modifiers = KeyModifiers.Control | KeyModifiers.Shift | KeyModifiers.Alt,
+        Parameter = true,
+        ShortcutContexts = [ typeof(ViewportWindowViewModel), typeof(TextOverlay)],
+        MenuItemPath = "LAYER/TEXT/EXTRACT_SELECTED_CHARACTERS", AnalyticsTrack = true)]
+    public void ExtractSelectedText(bool extractEachCharacter)
     {
     {
         var doc = Owner.DocumentManagerSubViewModel.ActiveDocument;
         var doc = Owner.DocumentManagerSubViewModel.ActiveDocument;
         var member = doc?.SelectedStructureMember;
         var member = doc?.SelectedStructureMember;
@@ -620,7 +627,7 @@ internal class LayersViewModel : SubViewModel<ViewModelMain>
         int startIndex = doc.TextOverlayViewModel.CursorPosition;
         int startIndex = doc.TextOverlayViewModel.CursorPosition;
         int endIndex = doc.TextOverlayViewModel.SelectionEnd;
         int endIndex = doc.TextOverlayViewModel.SelectionEnd;
 
 
-        doc!.Operations.ExtractSelectedText(vectorLayer.Id, startIndex, endIndex);
+        doc!.Operations.ExtractSelectedText(vectorLayer.Id, startIndex, endIndex, extractEachCharacter);
     }
     }
 
 
     [Evaluator.Icon("PixiEditor.Layer.ToggleReferenceLayerTopMostIcon")]
     [Evaluator.Icon("PixiEditor.Layer.ToggleReferenceLayerTopMostIcon")]