Browse Source

Add UndoRedo to image edits

pull/513/head
Joseph Finney 6 months ago
parent
commit
c5fed3fe95
  1. 14
      .editorconfig
  2. 52
      Text-Grab/UndoRedoOperations/ChangedImage.cs
  3. 10
      Text-Grab/UndoRedoOperations/Operation.cs
  4. 8
      Text-Grab/UndoRedoOperations/UndoRedo.cs
  5. 33
      Text-Grab/Views/GrabFrame.xaml.cs

14
.editorconfig

@ -16,6 +16,15 @@ dotnet_style_null_propagation = true:suggestion
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
dotnet_style_prefer_auto_properties = true:silent
dotnet_style_object_initializer = true:suggestion
dotnet_style_collection_initializer = false:suggestion
dotnet_style_prefer_simplified_boolean_expressions = true:suggestion
dotnet_style_prefer_conditional_expression_over_assignment = true:silent
dotnet_style_prefer_conditional_expression_over_return = true:silent
dotnet_style_explicit_tuple_names = true:suggestion
dotnet_style_prefer_inferred_tuple_names = true:suggestion
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
dotnet_style_prefer_compound_assignment = true:suggestion
dotnet_style_prefer_simplified_interpolation = true:suggestion
[*.{yml,yaml,appxmanifest,manifest,config}]
indent_style = space
@ -142,7 +151,7 @@ csharp_prefer_braces = when_multiline:silent
csharp_prefer_simple_using_statement = true:suggestion
csharp_style_namespace_declarations = file_scoped:silent
csharp_style_prefer_method_group_conversion = true:silent
csharp_style_prefer_primary_constructors = true:suggestion
csharp_style_prefer_primary_constructors = false:suggestion
csharp_style_prefer_top_level_statements = true:silent
# Expression-level preferences
@ -279,4 +288,5 @@ dotnet_diagnostic.IDE0055.severity = none
dotnet_diagnostic.CA2263.severity = none
dotnet_diagnostic.IDE0051.severity = none
dotnet_diagnostic.IDE0052.severity = none
dotnet_diagnostic.CS1591.severity = none
dotnet_diagnostic.CS1591.severity = none
csharp_prefer_system_threading_lock = true:suggestion

52
Text-Grab/UndoRedoOperations/ChangedImage.cs

@ -0,0 +1,52 @@
using System.Collections.Generic;
using System.Windows.Controls;
using System.Windows.Media;
using Text_Grab.Controls;
namespace Text_Grab.UndoRedoOperations;
internal class ChangedImage : Operation, IUndoRedoOperation
{
public ChangedImage(uint transactionId, Image destination, List<WordBorder> previousWordBorders,
Canvas canvas, ICollection<WordBorder> wordBorders, ImageSource? oldImage, ImageSource? newImage) : base(transactionId)
{
DestinationImage = destination;
RectanglesCanvas = canvas;
PreviousWordBorders = previousWordBorders;
WordBorders = wordBorders;
OldImage = oldImage;
NewImage = newImage;
}
private readonly ImageSource? OldImage;
private readonly ImageSource? NewImage;
private readonly Image DestinationImage;
private readonly Canvas RectanglesCanvas;
private readonly List<WordBorder> PreviousWordBorders;
private readonly ICollection<WordBorder> WordBorders;
public UndoRedoOperation GetUndoRedoOperation() => UndoRedoOperation.ChangedImage;
public void Undo()
{
DestinationImage.Source = OldImage;
foreach (WordBorder wordBorder in PreviousWordBorders)
{
RectanglesCanvas.Children.Add(wordBorder);
WordBorders.Add(wordBorder);
}
}
public void Redo()
{
DestinationImage.Source = NewImage;
RectanglesCanvas.Children.Clear();
WordBorders.Clear();
}
}

10
Text-Grab/UndoRedoOperations/Operation.cs

@ -1,6 +1,7 @@
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using Text_Grab.Controls;
namespace Text_Grab.UndoRedoOperations;
@ -15,6 +16,7 @@ internal abstract class Operation
public enum UndoRedoOperation
{
None,
ChangedImage,
AddWordBorder,
ChangeWord,
RemoveWordBorder,
@ -49,4 +51,10 @@ public struct GrabFrameOperationArgs
public string OldWord { get; set; }
public string NewWord { get; set; }
}
public Image DestinationImage { get; set; }
public ImageSource? OldImage { get; set; }
public ImageSource? NewImage { get; set; }
}

8
Text-Grab/UndoRedoOperations/UndoRedo.cs

@ -82,6 +82,9 @@ internal class UndoRedo
case UndoRedoOperation.ResizeWordBorder:
InsertResizeWordBorderOperation((GrabFrameOperationArgs)operationArgs);
break;
case UndoRedoOperation.ChangedImage:
InsertChangedImageOperation((GrabFrameOperationArgs)operationArgs);
break;
case UndoRedoOperation.None:
default:
break;
@ -106,6 +109,9 @@ internal class UndoRedo
private void InsertResizeWordBorderOperation(GrabFrameOperationArgs args) => AddOperationToUndoStack(
new ResizeWordBorder(TransactionId, args.WordBorder, args.OldSize, args.NewSize));
private void InsertChangedImageOperation(GrabFrameOperationArgs args) => AddOperationToUndoStack(
new ChangedImage(TransactionId, args.DestinationImage, args.RemovingWordBorders, args.GrabFrameCanvas, args.WordBorders, args.OldImage, args.NewImage));
public void Undo()
{
if (UndoStack.Count == 0 || UndoStack.Last is null)
@ -155,4 +161,4 @@ internal class UndoRedo
++ActiveTransactionIdCount;
}
}
}

33
Text-Grab/Views/GrabFrame.xaml.cs

@ -992,11 +992,11 @@ public partial class GrabFrame : Window
UndoRedo.InsertUndoRedoOperation(UndoRedoOperation.AddWordBorder,
new GrabFrameOperationArgs()
{
WordBorder = wordBorderBox,
WordBorders = wordBorders,
GrabFrameCanvas = RectanglesCanvas
});
{
WordBorder = wordBorderBox,
WordBorders = wordBorders,
GrabFrameCanvas = RectanglesCanvas
});
}
lineNumber++;
@ -1432,7 +1432,7 @@ public partial class GrabFrame : Window
{
if (e.MiddleButton == MouseButtonState.Pressed)
{
DefaultSettings.LastUsedLang = String.Empty;
DefaultSettings.LastUsedLang = string.Empty;
DefaultSettings.Save();
}
}
@ -2299,6 +2299,7 @@ new GrabFrameOperationArgs()
private void CloseOnGrabMenuItem_Click(object sender, RoutedEventArgs e)
{
DefaultSettings.CloseFrameOnGrab = CloseOnGrabMenuItem.IsChecked is true;
DefaultSettings.Save();
}
private void CanExecuteGrab(object sender, CanExecuteRoutedEventArgs e)
@ -2376,6 +2377,7 @@ new GrabFrameOperationArgs()
return;
DefaultSettings.GrabFrameScrollBehavior = scrollBehavior.ToString();
DefaultSettings.Save();
SetScrollBehaviorMenuItems();
}
@ -2406,10 +2408,19 @@ new GrabFrameOperationArgs()
}
}
#endregion Methods
private void InvertColorsMI_Click(object sender, RoutedEventArgs e)
{
List<WordBorder> existingWordBorders = new(wordBorders);
GrabFrameOperationArgs args = new()
{
WordBorders = wordBorders,
GrabFrameCanvas = RectanglesCanvas,
DestinationImage = GrabFrameImage,
RemovingWordBorders = existingWordBorders,
OldImage = frameContentImageSource
};
reDrawTimer.Stop();
RectanglesCanvas.Children.Clear();
wordBorders.Clear();
@ -2426,6 +2437,10 @@ new GrabFrameOperationArgs()
frameContentImageSource = MagickHelpers.Invert(frameContentImageSource);
GrabFrameImage.Source = frameContentImageSource;
reDrawTimer.Start();
args.NewImage = frameContentImageSource;
UndoRedo.InsertUndoRedoOperation(UndoRedoOperation.ChangedImage, args);
}
private void AutoContrastMI_Click(object sender, RoutedEventArgs e)
@ -2467,4 +2482,6 @@ new GrabFrameOperationArgs()
GrabFrameImage.Source = frameContentImageSource;
reDrawTimer.Start();
}
#endregion Methods
}
Loading…
Cancel
Save