diff --git a/PKHeX.Core/PKM/Util/ItemConverter.cs b/PKHeX.Core/PKM/Util/ItemConverter.cs index f7f68844c..5854e8a49 100644 --- a/PKHeX.Core/PKM/Util/ItemConverter.cs +++ b/PKHeX.Core/PKM/Util/ItemConverter.cs @@ -1,12 +1,13 @@ using System; using System.Collections.Generic; +using System.Linq; namespace PKHeX.Core { /// /// Logic for converting Item IDs between the generation specific value sets. /// - internal static class ItemConverter + public static class ItemConverter { /// Unused item ID, placeholder for item/sprite finding private const ushort NaN = 128; @@ -16,28 +17,28 @@ namespace PKHeX.Core /// /// Generation 3 Item ID. /// True if transferrable, False if not transferrable. - public static bool IsItemTransferrable34(ushort item) => item != NaN && item > 0; + internal static bool IsItemTransferrable34(ushort item) => item != NaN && item > 0; /// /// Converts a Generation 3 Item ID to Generation 4+ Item ID. /// /// Generation 3 Item ID. /// Generation 4+ Item ID. - public static ushort GetG4Item(ushort g3val) => g3val > arr3.Length ? NaN : arr3[g3val]; + internal static ushort GetG4Item(ushort g3val) => g3val > arr3.Length ? NaN : arr3[g3val]; /// /// Converts a Generation 2 Item ID to Generation 4+ Item ID. /// /// Generation 2 Item ID. /// Generation 4+ Item ID. - public static ushort GetG4Item(byte g2val) => g2val > arr2.Length ? NaN : arr2[g2val]; + internal static ushort GetG4Item(byte g2val) => g2val > arr2.Length ? NaN : arr2[g2val]; /// /// Converts a Generation 4+ Item ID to Generation 3 Item ID. /// /// Generation 4+ Item ID. /// Generation 3 Item ID. - public static ushort GetG3Item(ushort g4val) + private static ushort GetG3Item(ushort g4val) { if (g4val == NaN) return 0; @@ -50,7 +51,7 @@ namespace PKHeX.Core /// /// Generation 4+ Item ID. /// Generation 2 Item ID. - public static byte GetG2Item(ushort g4val) + private static byte GetG2Item(ushort g4val) { if (g4val == NaN) return 0; @@ -160,14 +161,14 @@ namespace PKHeX.Core } } - public static int GetG2ItemTransfer(int g1val) + internal static int GetG2ItemTransfer(int g1val) { if (!IsItemTransferrable12((ushort) g1val)) return GetTeruSamaItem(g1val); return g1val; } - public static bool IsItemTransferrable12(ushort item) => ((IList) Legal.HeldItems_GSC).Contains(item); + private static bool IsItemTransferrable12(ushort item) => ((IList) Legal.HeldItems_GSC).Contains(item); /// /// Gets a format specific value depending on the desired format and the provided item index & origin format. @@ -175,7 +176,7 @@ namespace PKHeX.Core /// Held Item to apply /// Format from importing /// Format required for holder - public static int GetFormatHeldItemID(int item, int srcFormat, int destFormat) + internal static int GetFormatHeldItemID(int item, int srcFormat, int destFormat) { if (item <= 0) return 0; @@ -203,5 +204,22 @@ namespace PKHeX.Core default: return item; } } + + private static readonly int[] HMs = { 420, 421, 422, 423, 423, 424, 425, 426, 427, 737 }; + + public static bool IsItemHM(ushort item, int gen) + { + switch (gen) + { + case 1: + return 196 >= item && item <= 200; // HMs + case 2: + return item >= 243; // HMs + case 3: + return Legal.Pouch_HM_RS.Contains(item); + default: + return HMs.Contains(item); + } + } } } diff --git a/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs b/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs index a6c4cabf2..5317201ef 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs @@ -34,7 +34,6 @@ namespace PKHeX.WinForms } private readonly InventoryPouch[] Pouches; - private const string TabPrefix = "TAB_"; private const string DGVPrefix = "DGV_"; private readonly bool HasFreeSpace; private readonly bool HasNew; @@ -72,7 +71,7 @@ namespace PKHeX.WinForms private DataGridView GetDGV(InventoryPouch pouch) { // Add DataGrid - DataGridView dgv = new DataGridView + var dgv = new DataGridView { Dock = DockStyle.Fill, Text = pouch.Type.ToString(), @@ -95,7 +94,7 @@ namespace PKHeX.WinForms }; int c = 0; - DataGridViewComboBoxColumn dgvItemVal = new DataGridViewComboBoxColumn + var dgvItemVal = new DataGridViewComboBoxColumn { HeaderText = "Item", DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing, @@ -103,14 +102,14 @@ namespace PKHeX.WinForms Width = 135, FlatStyle = FlatStyle.Flat }; - DataGridViewColumn dgvIndex = new DataGridViewTextBoxColumn(); + var dgvIndex = new DataGridViewTextBoxColumn(); { dgvIndex.HeaderText = "Count"; dgvIndex.DisplayIndex = c++; dgvIndex.Width = 45; dgvIndex.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; if (!Main.HaX) - ((DataGridViewTextBoxColumn) dgvIndex).MaxInputLength = (int)(Math.Log10(Math.Max(1, pouch.MaxCount)) + 1); + dgvIndex.MaxInputLength = (int)(Math.Log10(Math.Max(1, pouch.MaxCount)) + 1); } dgv.Columns.Add(dgvItemVal); @@ -118,7 +117,7 @@ namespace PKHeX.WinForms if (HasFreeSpace) { - DataGridViewCheckBoxColumn dgvFree = new DataGridViewCheckBoxColumn + var dgvFree = new DataGridViewCheckBoxColumn { HeaderText = "Free", DisplayIndex = c++, @@ -129,7 +128,7 @@ namespace PKHeX.WinForms } if (HasNew) { - DataGridViewCheckBoxColumn dgvNew = new DataGridViewCheckBoxColumn + var dgvNew = new DataGridViewCheckBoxColumn { HeaderText = "NEW", DisplayIndex = c++, @@ -142,7 +141,7 @@ namespace PKHeX.WinForms var itemcount = pouch.Items.Length; string[] itemarr = Main.HaX ? (string[])itemlist.Clone() : GetItems(pouch.LegalItems); - var combo = dgv.Columns[0] as DataGridViewComboBoxColumn; + var combo = (DataGridViewComboBoxColumn) dgv.Columns[0]; foreach (string t in itemarr) combo.Items.Add(t); // add only the Item Names @@ -152,11 +151,14 @@ namespace PKHeX.WinForms return dgv; } + private DataGridView GetGrid(InventoryType type) => (DataGridView)Controls.Find(DGVPrefix + type, true)[0]; + private DataGridView GetGrid(int pouch) => GetGrid(Pouches[pouch].Type); + private void GetBags() { foreach (InventoryPouch pouch in Pouches) { - DataGridView dgv = Controls.Find(DGVPrefix + pouch.Type, true).FirstOrDefault() as DataGridView; + var dgv = GetGrid(pouch.Type); // Sanity Screen var invalid = pouch.Items.Where(item => item.Index != 0 && !pouch.LegalItems.Contains((ushort)item.Index)).ToArray(); @@ -175,10 +177,10 @@ namespace PKHeX.WinForms private void SetBags() { - foreach (InventoryPouch t in Pouches) + foreach (var pouch in Pouches) { - DataGridView dgv = Controls.Find(DGVPrefix + t.Type, true).FirstOrDefault() as DataGridView; - SetBag(dgv, t); + var dgv = GetGrid(pouch.Type); + SetBag(dgv, pouch); } } @@ -292,12 +294,14 @@ namespace PKHeX.WinForms // User Cheats private int CurrentPouch => tabControl1.SelectedIndex; + private void B_GiveAll_Click(object sender, EventArgs e) => ShowContextMenuBelow(giveMenu, (Control)sender); + private void B_Sort_Click(object sender, EventArgs e) => ShowContextMenuBelow(sortMenu, (Control)sender); - private void B_GiveAll_Click(object sender, EventArgs e) - { - Button btn = (Button)sender; - giveMenu.Show(btn.PointToScreen(new Point(0, btn.Height))); - } + private void SortByName(object sender, EventArgs e) => Sort(p => p.SortByName(itemlist, reverse: sender == mnuSortNameReverse)); + private void SortByCount(object sender, EventArgs e) => Sort(p => p.SortByCount(reverse: sender == mnuSortCountReverse)); + private void SortByIndex(object sender, EventArgs e) => Sort(p => p.SortByIndex(reverse: sender == mnuSortIndexReverse)); + + private static void ShowContextMenuBelow(ToolStripDropDown c, Control n) => c.Show(n.PointToScreen(new Point(0, n.Height))); private void GiveAllItems(object sender, EventArgs e) { @@ -319,7 +323,7 @@ namespace PKHeX.WinForms Array.Resize(ref legalitems, p.Items.Length); } - DataGridView dgv = Controls.Find(DGVPrefix + p.Type, true).FirstOrDefault() as DataGridView; + var dgv = GetGrid(pouch); SetBag(dgv, p); int Count = (int)NUD_Count.Value; @@ -330,7 +334,7 @@ namespace PKHeX.WinForms int c = Count; // Override for HMs - if (IsItemCount1(item, SAV)) + if (ItemConverter.IsItemHM(item, SAV.Generation)) c = 1; int l = 0; @@ -347,21 +351,6 @@ namespace PKHeX.WinForms System.Media.SystemSounds.Asterisk.Play(); } - private static bool IsItemCount1(ushort item, SaveFile sav) - { - switch (sav.Generation) - { - case 1: - return 196 >= item && item <= 200; // HMs - case 2: - return item >= 244; - case 3: - return Legal.Pouch_HM_RS.Contains(item); - default: - return new[] {420, 421, 422, 423, 423, 424, 425, 426, 427, 737}.Contains(item); - } - } - private void RemoveAllItems(object sender, EventArgs e) { // Get Current Pouch @@ -369,7 +358,7 @@ namespace PKHeX.WinForms if (pouch < 0) return; - DataGridView dgv = Controls.Find(DGVPrefix + Pouches[pouch].Type, true).FirstOrDefault() as DataGridView; + var dgv = GetGrid(pouch); for (int i = 0; i < dgv.RowCount; i++) { @@ -391,61 +380,29 @@ namespace PKHeX.WinForms if (pouch < 0) return; - DataGridView dgv = Controls.Find(DGVPrefix + Pouches[pouch].Type, true).FirstOrDefault() as DataGridView; + var dgv = GetGrid(pouch); for (int i = 0; i < dgv.RowCount; i++) { string item = dgv.Rows[i].Cells[0].Value.ToString(); int itemindex = Array.IndexOf(itemlist, item); if (itemindex > 0) - dgv.Rows[i].Cells[1].Value = IsItemCount1((ushort)itemindex, SAV) ? 1 : NUD_Count.Value; + dgv.Rows[i].Cells[1].Value = ItemConverter.IsItemHM((ushort)itemindex, SAV.Generation) ? 1 : NUD_Count.Value; } WinFormsUtil.Alert(MsgItemPouchCountUpdated); } - private void B_Sort_Click(object sender, EventArgs e) + private void Sort(Action func) { - Button btn = (Button)sender; - sortMenu.Show(btn.PointToScreen(new Point(0, btn.Height))); - } + if (func == null) + throw new ArgumentNullException(nameof(func)); - private void SortByName(object sender, EventArgs e) - { int pouch = CurrentPouch; - var dgv = Controls.Find(DGVPrefix + Pouches[pouch].Type, true).FirstOrDefault() as DataGridView; + var dgv = GetGrid(pouch); var p = Pouches[pouch]; - SetBag(dgv, p); - if (sender == mnuSortName) - p.SortByName(itemlist, reverse:false); - if (sender == mnuSortNameReverse) - p.SortByName(itemlist, reverse:true); - GetBag(dgv, p); - } - - private void SortByCount(object sender, EventArgs e) - { - int pouch = CurrentPouch; - var dgv = Controls.Find(DGVPrefix + Pouches[pouch].Type, true).FirstOrDefault() as DataGridView; - var p = Pouches[pouch]; - SetBag(dgv, p); - if (sender == mnuSortCount) - p.SortByCount(reverse:false); - if (sender == mnuSortCountReverse) - p.SortByCount(reverse:true); - GetBag(dgv, p); - } - - private void SortByIndex(object sender, EventArgs e) - { - int pouch = CurrentPouch; - var dgv = Controls.Find(DGVPrefix + Pouches[pouch].Type, true).FirstOrDefault() as DataGridView; - var p = Pouches[pouch]; - SetBag(dgv, p); - if (sender == mnuSortIndex) - p.SortByIndex(reverse: false); - if (sender == mnuSortIndexReverse) - p.SortByIndex(reverse: true); - GetBag(dgv, p); + SetBag(dgv, p); // save current + func(p); // update + GetBag(dgv, p); // load current } } }