From f47382e34f4167a8564f0070fb0935ca1c005e92 Mon Sep 17 00:00:00 2001 From: Kurt Date: Tue, 24 Sep 2019 18:14:15 -0700 Subject: [PATCH] Fix GetUnderlyingControl call from ContextMenuStrip https://projectpokemon.org/home/forums/topic/55096-unhandled-exception-error-pkmdb/?tab=comments#comment-249235 had recently moved the contextmenu to the designer, event handler has sender as the ContextMenuStrip use recursion -> while loop so that the input can be any of the 3 cases; it'll drill down until it gets a picturebox or none. make generic for giggles, update usages so Array.IndexOf uses picturebox[] instead of object[] --- .../Controls/SAV Editor/ContextMenuSAV.cs | 3 +-- .../Controls/SAV Editor/SlotList.cs | 2 +- PKHeX.WinForms/Subforms/SAV_Database.cs | 8 ++++---- PKHeX.WinForms/Subforms/SAV_Encounters.cs | 2 +- PKHeX.WinForms/Subforms/SAV_MysteryGiftDB.cs | 4 ++-- .../Save Editors/Gen7/SAV_FestivalPlaza.cs | 4 ++-- .../Subforms/Save Editors/SAV_Wondercard.cs | 12 +++++------ PKHeX.WinForms/Util/WinFormsUtil.cs | 20 ++++++++++++++++++- 8 files changed, 36 insertions(+), 19 deletions(-) diff --git a/PKHeX.WinForms/Controls/SAV Editor/ContextMenuSAV.cs b/PKHeX.WinForms/Controls/SAV Editor/ContextMenuSAV.cs index a2bff0ca905..7452c4cb930 100644 --- a/PKHeX.WinForms/Controls/SAV Editor/ContextMenuSAV.cs +++ b/PKHeX.WinForms/Controls/SAV Editor/ContextMenuSAV.cs @@ -131,8 +131,7 @@ private void MenuOpening(object sender, CancelEventArgs e) private static SlotViewInfo GetSenderInfo(ref object sender) { - sender = WinFormsUtil.GetUnderlyingControl(sender); - var pb = (PictureBox)sender; + var pb = WinFormsUtil.GetUnderlyingControl(sender); var view = WinFormsUtil.FindFirstControlOfType>(pb); var loc = view.GetSlotData(pb); return new SlotViewInfo {Slot = loc, View = view}; diff --git a/PKHeX.WinForms/Controls/SAV Editor/SlotList.cs b/PKHeX.WinForms/Controls/SAV Editor/SlotList.cs index af20d1e5465..673ec5f6937 100644 --- a/PKHeX.WinForms/Controls/SAV Editor/SlotList.cs +++ b/PKHeX.WinForms/Controls/SAV Editor/SlotList.cs @@ -70,7 +70,7 @@ public ISlotInfo GetSlotData(PictureBox view) public ISlotInfo GetSlotData(int slot) => SlotOffsets[slot]; public IList SlotPictureBoxes => slots; - public int GetSlot(PictureBox sender) => slots.IndexOf(WinFormsUtil.GetUnderlyingControl(sender) as PictureBox); + public int GetSlot(PictureBox sender) => slots.IndexOf(WinFormsUtil.GetUnderlyingControl(sender)); public int GetSlotOffset(int slot) => SlotOffsets[slot].Offset; public int ViewIndex { get; set; } = -1; diff --git a/PKHeX.WinForms/Subforms/SAV_Database.cs b/PKHeX.WinForms/Subforms/SAV_Database.cs index c38b40d76c6..d8cbf7dd054 100644 --- a/PKHeX.WinForms/Subforms/SAV_Database.cs +++ b/PKHeX.WinForms/Subforms/SAV_Database.cs @@ -109,8 +109,8 @@ public SAV_Database(PKMEditor f1, SAVEditor saveditor) // Important Events private void ClickView(object sender, EventArgs e) { - sender = WinFormsUtil.GetUnderlyingControl(sender); - int index = Array.IndexOf(PKXBOXES, sender); + var pb = WinFormsUtil.GetUnderlyingControl(sender); + int index = Array.IndexOf(PKXBOXES, pb); if (!GetShiftedIndex(ref index)) { System.Media.SystemSounds.Exclamation.Play(); @@ -126,8 +126,8 @@ private void ClickView(object sender, EventArgs e) private void ClickDelete(object sender, EventArgs e) { - sender = WinFormsUtil.GetUnderlyingControl(sender); - int index = Array.IndexOf(PKXBOXES, sender); + var pb = WinFormsUtil.GetUnderlyingControl(sender); + int index = Array.IndexOf(PKXBOXES, pb); if (!GetShiftedIndex(ref index)) { System.Media.SystemSounds.Exclamation.Play(); diff --git a/PKHeX.WinForms/Subforms/SAV_Encounters.cs b/PKHeX.WinForms/Subforms/SAV_Encounters.cs index 554bcc8ff70..c9a5e2dd989 100644 --- a/PKHeX.WinForms/Subforms/SAV_Encounters.cs +++ b/PKHeX.WinForms/Subforms/SAV_Encounters.cs @@ -125,7 +125,7 @@ private EncounterOrder[] GetTypes() // Important Events private void ClickView(object sender, EventArgs e) { - sender = WinFormsUtil.GetUnderlyingControl(sender); + var pb = WinFormsUtil.GetUnderlyingControl(sender); int index = Array.IndexOf(PKXBOXES, sender); if (index >= RES_MAX) { diff --git a/PKHeX.WinForms/Subforms/SAV_MysteryGiftDB.cs b/PKHeX.WinForms/Subforms/SAV_MysteryGiftDB.cs index dd59a99103e..4d2a222018a 100644 --- a/PKHeX.WinForms/Subforms/SAV_MysteryGiftDB.cs +++ b/PKHeX.WinForms/Subforms/SAV_MysteryGiftDB.cs @@ -144,8 +144,8 @@ private void ClickSaveMG(object sender, EventArgs e) private int GetSenderIndex(object sender) { - sender = WinFormsUtil.GetUnderlyingControl(sender); - int index = Array.IndexOf(PKXBOXES, sender); + var pb = WinFormsUtil.GetUnderlyingControl(sender); + int index = Array.IndexOf(PKXBOXES, pb); if (index >= RES_MAX) { System.Media.SystemSounds.Exclamation.Play(); diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen7/SAV_FestivalPlaza.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen7/SAV_FestivalPlaza.cs index 64cc63c6b66..1c8cd8b6a66 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen7/SAV_FestivalPlaza.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen7/SAV_FestivalPlaza.cs @@ -687,8 +687,8 @@ private void B_ImportParty_Click(object sender, EventArgs e) private void MnuSave_Click(object sender, EventArgs e) { - sender = WinFormsUtil.GetUnderlyingControl(sender); - int i = Array.IndexOf(PBs, sender); + var pb = WinFormsUtil.GetUnderlyingControl(sender); + int i = Array.IndexOf(PBs, pb); if (i < 0) return; WinFormsUtil.SavePKMDialog(p[i]); diff --git a/PKHeX.WinForms/Subforms/Save Editors/SAV_Wondercard.cs b/PKHeX.WinForms/Subforms/Save Editors/SAV_Wondercard.cs index 02625c56fd8..ff90036c289 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/SAV_Wondercard.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/SAV_Wondercard.cs @@ -157,8 +157,8 @@ private static int GetLastUnfilledByType(MysteryGift Gift, MysteryGiftAlbum Albu // Mystery Gift RW (window<->sav) private void ClickView(object sender, EventArgs e) { - sender = WinFormsUtil.GetUnderlyingControl(sender); - int index = Array.IndexOf(pba, sender); + var pb = WinFormsUtil.GetUnderlyingControl(sender); + int index = Array.IndexOf(pba, pb); SetBackground(index, Properties.Resources.slotView); ViewGiftData(mga.Gifts[index]); @@ -172,8 +172,8 @@ private void ClickSet(object sender, EventArgs e) return; } - sender = WinFormsUtil.GetUnderlyingControl(sender); - int index = Array.IndexOf(pba, sender); + var pb = WinFormsUtil.GetUnderlyingControl(sender); + int index = Array.IndexOf(pba, pb); // Hijack to the latest unfilled slot if index creates interstitial empty slots. int lastUnfilled = GetLastUnfilledByType(mg, mga); @@ -197,8 +197,8 @@ private void ClickSet(object sender, EventArgs e) private void ClickDelete(object sender, EventArgs e) { - sender = WinFormsUtil.GetUnderlyingControl(sender); - int index = Array.IndexOf(pba, sender); + var pb = WinFormsUtil.GetUnderlyingControl(sender); + int index = Array.IndexOf(pba, pb); mga.Gifts[index].Data = new byte[mga.Gifts[index].Data.Length]; diff --git a/PKHeX.WinForms/Util/WinFormsUtil.cs b/PKHeX.WinForms/Util/WinFormsUtil.cs index 5e7718bdec6..4e8f776409b 100644 --- a/PKHeX.WinForms/Util/WinFormsUtil.cs +++ b/PKHeX.WinForms/Util/WinFormsUtil.cs @@ -38,7 +38,25 @@ internal static void CenterToForm(this Control child, Control parent) } } - public static Control GetUnderlyingControl(object sender) => ((sender as ToolStripItem)?.Owner as ContextMenuStrip)?.SourceControl ?? sender as PictureBox; + public static T GetUnderlyingControl(object sender) + { + while (true) + { + switch (sender) + { + case ToolStripItem t: + sender = t.Owner; + continue; + case ContextMenuStrip c: + sender = c.SourceControl; + continue; + case T p: + return p; + default: + return default; + } + } + } #region Message Displays ///