mirror of
https://github.com/kwsch/PKHeX.git
synced 2026-06-16 05:00:01 -05:00
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:
parent
33649d4e02
commit
f47382e34f
|
|
@ -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};
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user