added support for undo/redo using Ctrl-z/Ctrl-Shift-z in level editor
authorHolger Schemel <info@artsoft.org>
Thu, 20 Jun 2019 18:43:26 +0000 (20:43 +0200)
committerHolger Schemel <info@artsoft.org>
Thu, 20 Jun 2019 18:43:51 +0000 (20:43 +0200)
src/editor.c
src/editor.h
src/events.c

index 8175781..c8444b1 100644 (file)
@@ -12355,6 +12355,16 @@ void CopyBrushToClipboard_Small(void)
   CopyBrushExt(0, 0, 0, 0, 0, CB_BRUSH_TO_CLIPBOARD_SMALL);
 }
 
+void UndoLevelEditorOperation(void)
+{
+  ClickOnGadget(level_editor_gadget[GADGET_ID_UNDO], -1);
+}
+
+void RedoLevelEditorOperation(void)
+{
+  ClickOnGadget(level_editor_gadget[GADGET_ID_UNDO], 3);
+}
+
 static void FloodFill(int from_x, int from_y, int fill_element)
 {
   FloodFillLevel(from_x, from_y, fill_element, Feld, lev_fieldx, lev_fieldy);
@@ -13820,7 +13830,9 @@ static void HandleControlButtons(struct GadgetInfo *gi)
       break;
 
     case GADGET_ID_UNDO:
-      if (button == 1 && GetKeyModState() & (KMOD_Shift|KMOD_Control))
+      if (button < 0)  // keep button value (even if modifier keys are pressed)
+       button = -button;
+      else if (button == 1 && GetKeyModState() & (KMOD_Shift | KMOD_Control))
        button = 3;
 
       if (button == 1 && undo_buffer_steps == 0)
index 09c2cca..1979196 100644 (file)
@@ -31,4 +31,7 @@ void CopyClipboardToBrush(void);
 void CopyBrushToClipboard(void);
 void CopyBrushToClipboard_Small(void);
 
+void UndoLevelEditorOperation(void);
+void RedoLevelEditorOperation(void);
+
 #endif
index 085dd9f..9526f19 100644 (file)
@@ -1910,6 +1910,13 @@ static void HandleKeysSpecial(Key key)
       {
        CopyClipboardToBrush();
       }
+      else if (letter == 'z')  // undo or redo last operation
+      {
+       if (GetKeyModState() & KMOD_Shift)
+         RedoLevelEditorOperation();
+       else
+         UndoLevelEditorOperation();
+      }
     }
   }