Skip to content

Commit

Permalink
Fix GetUnderlyingControl call from ContextMenuStrip
Browse files Browse the repository at this point in the history
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[]
  • Loading branch information
kwsch committed Sep 25, 2019
1 parent 33649d4 commit f47382e
Show file tree
Hide file tree
Showing 8 changed files with 36 additions and 19 deletions.
3 changes: 1 addition & 2 deletions PKHeX.WinForms/Controls/SAV Editor/ContextMenuSAV.cs
Expand Up @@ -131,8 +131,7 @@ private void MenuOpening(object sender, CancelEventArgs e)

private static SlotViewInfo<PictureBox> GetSenderInfo(ref object sender)
{
sender = WinFormsUtil.GetUnderlyingControl(sender);
var pb = (PictureBox)sender;
var pb = WinFormsUtil.GetUnderlyingControl<PictureBox>(sender);
var view = WinFormsUtil.FindFirstControlOfType<ISlotViewer<PictureBox>>(pb);
var loc = view.GetSlotData(pb);
return new SlotViewInfo<PictureBox> {Slot = loc, View = view};
Expand Down
2 changes: 1 addition & 1 deletion PKHeX.WinForms/Controls/SAV Editor/SlotList.cs
Expand Up @@ -70,7 +70,7 @@ public ISlotInfo GetSlotData(PictureBox view)
public ISlotInfo GetSlotData(int slot) => SlotOffsets[slot];

public IList<PictureBox> SlotPictureBoxes => slots;
public int GetSlot(PictureBox sender) => slots.IndexOf(WinFormsUtil.GetUnderlyingControl(sender) as PictureBox);
public int GetSlot(PictureBox sender) => slots.IndexOf(WinFormsUtil.GetUnderlyingControl<PictureBox>(sender));
public int GetSlotOffset(int slot) => SlotOffsets[slot].Offset;
public int ViewIndex { get; set; } = -1;

Expand Down
8 changes: 4 additions & 4 deletions PKHeX.WinForms/Subforms/SAV_Database.cs
Expand Up @@ -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<PictureBox>(sender);
int index = Array.IndexOf(PKXBOXES, pb);
if (!GetShiftedIndex(ref index))
{
System.Media.SystemSounds.Exclamation.Play();
Expand All @@ -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<PictureBox>(sender);
int index = Array.IndexOf(PKXBOXES, pb);
if (!GetShiftedIndex(ref index))
{
System.Media.SystemSounds.Exclamation.Play();
Expand Down
2 changes: 1 addition & 1 deletion PKHeX.WinForms/Subforms/SAV_Encounters.cs
Expand Up @@ -125,7 +125,7 @@ private EncounterOrder[] GetTypes()
// Important Events
private void ClickView(object sender, EventArgs e)
{
sender = WinFormsUtil.GetUnderlyingControl(sender);
var pb = WinFormsUtil.GetUnderlyingControl<PictureBox>(sender);
int index = Array.IndexOf(PKXBOXES, sender);
if (index >= RES_MAX)
{
Expand Down
4 changes: 2 additions & 2 deletions PKHeX.WinForms/Subforms/SAV_MysteryGiftDB.cs
Expand Up @@ -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<PictureBox>(sender);
int index = Array.IndexOf(PKXBOXES, pb);
if (index >= RES_MAX)
{
System.Media.SystemSounds.Exclamation.Play();
Expand Down
Expand Up @@ -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<PictureBox>(sender);
int i = Array.IndexOf(PBs, pb);
if (i < 0)
return;
WinFormsUtil.SavePKMDialog(p[i]);
Expand Down
12 changes: 6 additions & 6 deletions PKHeX.WinForms/Subforms/Save Editors/SAV_Wondercard.cs
Expand Up @@ -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<PictureBox>(sender);
int index = Array.IndexOf(pba, pb);

SetBackground(index, Properties.Resources.slotView);
ViewGiftData(mga.Gifts[index]);
Expand All @@ -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<PictureBox>(sender);
int index = Array.IndexOf(pba, pb);

// Hijack to the latest unfilled slot if index creates interstitial empty slots.
int lastUnfilled = GetLastUnfilledByType(mg, mga);
Expand All @@ -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<PictureBox>(sender);
int index = Array.IndexOf(pba, pb);

mga.Gifts[index].Data = new byte[mga.Gifts[index].Data.Length];

Expand Down
20 changes: 19 additions & 1 deletion PKHeX.WinForms/Util/WinFormsUtil.cs
Expand Up @@ -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<T>(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
/// <summary>
Expand Down

0 comments on commit f47382e

Please sign in to comment.