diff --git a/PKHeX/MainWindow/Main.Designer.cs b/PKHeX/MainWindow/Main.Designer.cs index 1e265c14d..810383caf 100644 --- a/PKHeX/MainWindow/Main.Designer.cs +++ b/PKHeX/MainWindow/Main.Designer.cs @@ -436,6 +436,8 @@ public void InitializeComponent() this.mnuLSave = new System.Windows.Forms.ToolStripMenuItem(); this.PB_Legal = new System.Windows.Forms.PictureBox(); this.L_UpdateAvailable = new System.Windows.Forms.LinkLabel(); + this.Menu_Undo = new System.Windows.Forms.ToolStripMenuItem(); + this.Menu_Redo = new System.Windows.Forms.ToolStripMenuItem(); this.tabMain.SuspendLayout(); this.Tab_Main.SuspendLayout(); this.FLP_Main.SuspendLayout(); @@ -3898,7 +3900,7 @@ public void InitializeComponent() this.CB_MainLanguage}); this.Menu_Language.Image = global::PKHeX.Properties.Resources.language; this.Menu_Language.Name = "Menu_Language"; - this.Menu_Language.Size = new System.Drawing.Size(139, 22); + this.Menu_Language.Size = new System.Drawing.Size(152, 22); this.Menu_Language.Text = "Language"; // // CB_MainLanguage @@ -3912,10 +3914,12 @@ public void InitializeComponent() // this.Menu_Modify.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.Menu_ModifyDex, - this.Menu_ModifyPKM}); + this.Menu_ModifyPKM, + this.Menu_Undo, + this.Menu_Redo}); this.Menu_Modify.Image = global::PKHeX.Properties.Resources.settings; this.Menu_Modify.Name = "Menu_Modify"; - this.Menu_Modify.Size = new System.Drawing.Size(139, 22); + this.Menu_Modify.Size = new System.Drawing.Size(152, 22); this.Menu_Modify.Text = "Set to SAV"; // // Menu_ModifyDex @@ -3944,7 +3948,7 @@ public void InitializeComponent() this.Menu_Unicode.CheckOnClick = true; this.Menu_Unicode.CheckState = System.Windows.Forms.CheckState.Checked; this.Menu_Unicode.Name = "Menu_Unicode"; - this.Menu_Unicode.Size = new System.Drawing.Size(139, 22); + this.Menu_Unicode.Size = new System.Drawing.Size(152, 22); this.Menu_Unicode.Text = "Unicode"; this.Menu_Unicode.Click += new System.EventHandler(this.mainMenuUnicode); // @@ -3954,7 +3958,7 @@ public void InitializeComponent() this.Menu_About.Name = "Menu_About"; this.Menu_About.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.P))); this.Menu_About.ShowShortcutKeys = false; - this.Menu_About.Size = new System.Drawing.Size(139, 22); + this.Menu_About.Size = new System.Drawing.Size(152, 22); this.Menu_About.Text = "About &PKHeX"; this.Menu_About.Click += new System.EventHandler(this.mainMenuAbout); // @@ -5603,6 +5607,26 @@ public void InitializeComponent() this.L_UpdateAvailable.TextAlign = System.Drawing.ContentAlignment.MiddleRight; this.L_UpdateAvailable.Visible = false; // + // Menu_Undo + // + this.Menu_Undo.Enabled = false; + this.Menu_Undo.Name = "Menu_Undo"; + this.Menu_Undo.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.U))); + this.Menu_Undo.ShowShortcutKeys = false; + this.Menu_Undo.Size = new System.Drawing.Size(164, 22); + this.Menu_Undo.Text = "Undo Last Change"; + this.Menu_Undo.Click += new System.EventHandler(this.clickUndo); + // + // Menu_Redo + // + this.Menu_Redo.Enabled = false; + this.Menu_Redo.Name = "Menu_Redo"; + this.Menu_Redo.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Y))); + this.Menu_Redo.ShowShortcutKeys = false; + this.Menu_Redo.Size = new System.Drawing.Size(164, 22); + this.Menu_Redo.Text = "Redo Last Change"; + this.Menu_Redo.Click += new System.EventHandler(this.clickRedo); + // // Main // this.AllowDrop = true; @@ -6238,6 +6262,8 @@ public void InitializeComponent() private System.Windows.Forms.FlowLayoutPanel FLP_ShadowID; private System.Windows.Forms.Label L_ShadowID; private System.Windows.Forms.NumericUpDown NUD_ShadowID; + private System.Windows.Forms.ToolStripMenuItem Menu_Undo; + private System.Windows.Forms.ToolStripMenuItem Menu_Redo; } } diff --git a/PKHeX/MainWindow/Main.cs b/PKHeX/MainWindow/Main.cs index 8a4da2d36..2fa46abac 100644 --- a/PKHeX/MainWindow/Main.cs +++ b/PKHeX/MainWindow/Main.cs @@ -1170,6 +1170,10 @@ private void loadSAV(SaveFile sav, string path) if (WindowTranslationRequired) // force update -- re-added controls may be untranslated Util.TranslateInterface(this, curlanguage); + + // No changes made yet + UndoStack.Clear(); Menu_Undo.Enabled = false; + RedoStack.Clear(); Menu_Redo.Enabled = false; // Indicate audibly the save is loaded SystemSounds.Beep.Play(); @@ -3202,6 +3206,18 @@ private void clickSet(object sender, EventArgs e) } else if (slot < 30 || HaX && slot >= 36 && slot < 42) { + if (slot < 30) + { + UndoStack.Push(new SlotChange + { + Box = CB_BoxSelect.SelectedIndex, + Slot = slot, + Offset = offset, + OriginalData = SAV.getStoredSlot(offset) + }); + Menu_Undo.Enabled = true; + } + SAV.setStoredSlot(pk, offset); getQuickFiller(SlotPictureBoxes[slot], pk); getSlotColor(slot, Properties.Resources.slotSet); @@ -3209,16 +3225,6 @@ private void clickSet(object sender, EventArgs e) updateBoxViewers(); } - - private void updateSaveSlot(object sender, EventArgs e) - { - if (SAV.Version == GameVersion.BATREV) - { - ((SAV4BR) SAV).CurrentSlot = Util.getIndex(CB_SaveSlot); - setPKXBoxes(); - } - } - private void clickDelete(object sender, EventArgs e) { int slot = getSlot(sender); @@ -3238,13 +3244,81 @@ private void clickDelete(object sender, EventArgs e) return; } if (slot < 30 || HaX && slot >= 36 && slot < 42) - { SAV.setStoredSlot(SAV.BlankPKM, getPKXOffset(slot)); } + { + if (slot < 30) + { + UndoStack.Push(new SlotChange + { + Box = CB_BoxSelect.SelectedIndex, + Slot = slot, + Offset = offset, + OriginalData = SAV.getStoredSlot(offset) + }); + Menu_Undo.Enabled = true; + } + SAV.setStoredSlot(SAV.BlankPKM, getPKXOffset(slot)); + } else return; getQuickFiller(SlotPictureBoxes[slot], SAV.BlankPKM); getSlotColor(slot, Properties.Resources.slotDel); updateBoxViewers(); } + private readonly Stack UndoStack = new Stack(); + private readonly Stack RedoStack = new Stack(); + private void clickUndo(object sender, EventArgs e) + { + if (!UndoStack.Any()) + return; + + SlotChange change = UndoStack.Pop(); + if (change.Slot >= 30) + return; + + RedoStack.Push(new SlotChange + { + Slot = change.Slot, + Box = change.Box, + Offset = change.Offset, + OriginalData = SAV.getStoredSlot(change.Offset) + }); + undoSlotChange(change); + } + private void clickRedo(object sender, EventArgs e) + { + if (!RedoStack.Any()) + return; + + SlotChange change = RedoStack.Pop(); + if (change.Slot >= 30) + return; + + UndoStack.Push(new SlotChange + { + Slot = change.Slot, + Box = change.Box, + Offset = change.Offset, + OriginalData = SAV.getStoredSlot(change.Offset) + }); + undoSlotChange(change); + } + private void undoSlotChange(SlotChange change) + { + int slot = change.Slot; + int offset = change.Offset; + PKM pk = (PKM)change.OriginalData; + + if (CB_BoxSelect.SelectedIndex != change.Box) + CB_BoxSelect.SelectedIndex = change.Box; + SAV.setStoredSlot(pk, offset); + getQuickFiller(SlotPictureBoxes[slot], pk); + getSlotColor(slot, Properties.Resources.slotSet); + + Menu_Undo.Enabled = UndoStack.Any(); + Menu_Redo.Enabled = RedoStack.Any(); + + SystemSounds.Asterisk.Play(); + } private void clickClone(object sender, EventArgs e) { if (getSlot(sender) > 30) return; // only perform action if cloning to boxes @@ -3285,7 +3359,13 @@ private void clickLegality(object sender, EventArgs e) } showLegality(pk as PK6, slot < 0, ModifierKeys == Keys.Control); } - + private void updateSaveSlot(object sender, EventArgs e) + { + if (SAV.Version != GameVersion.BATREV) + return; + ((SAV4BR)SAV).CurrentSlot = Util.getIndex(CB_SaveSlot); + setPKXBoxes(); + } private void updateEggRNGSeed(object sender, EventArgs e) { if (TB_RNGSeed.Text.Length == 0) @@ -3363,7 +3443,6 @@ private void updateU64(object sender, EventArgs e) SAV.Edited = true; } } - private void updateIsNicknamed(object sender, EventArgs e) { if (!fieldsLoaded) diff --git a/PKHeX/MainWindow/Main.resx b/PKHeX/MainWindow/Main.resx index f0c9f5ccd..cbcdb103b 100644 --- a/PKHeX/MainWindow/Main.resx +++ b/PKHeX/MainWindow/Main.resx @@ -129,6 +129,15 @@ True + + True + + + True + + + True + @@ -155,6 +164,21 @@ True + + True + + + True + + + True + + + True + + + True + True @@ -164,9 +188,51 @@ True + + True + + + True + + + True + True + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + True @@ -179,18 +245,132 @@ True + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + True + + True + + + True + + + True + + + True + + + True + + + True + + + True + True True + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + True + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + True @@ -203,6 +383,18 @@ True + + True + + + True + + + True + + + True + True @@ -215,9 +407,24 @@ True + + True + + + True + True + + True + + + True + + + True + True @@ -230,6 +437,414 @@ True + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + True @@ -254,621 +869,6 @@ True - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - True @@ -1134,6 +1134,15 @@ True + + True + + + True + + + True + True diff --git a/PKHeX/MainWindow/SlotChange.cs b/PKHeX/MainWindow/SlotChange.cs new file mode 100644 index 000000000..52a586550 --- /dev/null +++ b/PKHeX/MainWindow/SlotChange.cs @@ -0,0 +1,10 @@ +namespace PKHeX +{ + public class SlotChange + { + public int Box; + public int Slot; + public int Offset; + public object OriginalData; + } +} diff --git a/PKHeX/PKHeX.csproj b/PKHeX/PKHeX.csproj index 93aee4692..7c1fc417b 100644 --- a/PKHeX/PKHeX.csproj +++ b/PKHeX/PKHeX.csproj @@ -129,6 +129,7 @@ Form + Form