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[]
This commit is contained in:
Kurt 2019-09-24 18:14:15 -07:00
parent 33649d4e02
commit f47382e34f
8 changed files with 36 additions and 19 deletions

View File

@ -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};

View File

@ -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;

View File

@ -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();
@ -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();

View File

@ -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)
{

View File

@ -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();

View File

@ -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]);

View File

@ -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]);
@ -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);
@ -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];

View File

@ -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>