// View Updates private IEnumerable <PKM> SearchDatabase() { // Populate Search Query Result IEnumerable <PKM> res = RawDB; // Filter for Selected Source if (!Menu_SearchBoxes.Checked) { res = res.Where(pk => pk.Identifier.StartsWith(DatabasePath + Path.DirectorySeparatorChar, StringComparison.Ordinal)); } if (!Menu_SearchDatabase.Checked) { res = res.Where(pk => !pk.Identifier.StartsWith(DatabasePath + Path.DirectorySeparatorChar, StringComparison.Ordinal)); #if LOADALL res = res.Where(pk => !pk.Identifier.StartsWith(EXTERNAL_SAV, StringComparison.Ordinal)); #endif } int format = MAXFORMAT + 1 - CB_Format.SelectedIndex; switch (CB_FormatComparator.SelectedIndex) { case 0: /* Do nothing */ break; case 1: res = res.Where(pk => pk.Format >= format); break; case 2: res = res.Where(pk => pk.Format == format); break; case 3: res = res.Where(pk => pk.Format <= format); break; } if (CB_FormatComparator.SelectedIndex != 0) { if (format <= 2) // 1-2 { res = res.Where(pk => pk.Format <= 2); } if (format >= 3 && format <= 6) // 3-6 { res = res.Where(pk => pk.Format >= 3); } if (format >= 7) // 1,3-6,7 { res = res.Where(pk => pk.Format != 2); } } switch (CB_Generation.SelectedIndex) { case 0: /* Do nothing */ break; case 1: res = res.Where(pk => pk.Gen7); break; case 2: res = res.Where(pk => pk.Gen6); break; case 3: res = res.Where(pk => pk.Gen5); break; case 4: res = res.Where(pk => pk.Gen4); break; case 5: res = res.Where(pk => pk.Gen3); break; } // Primary Searchables int species = WinFormsUtil.GetIndex(CB_Species); int ability = WinFormsUtil.GetIndex(CB_Ability); int nature = WinFormsUtil.GetIndex(CB_Nature); int item = WinFormsUtil.GetIndex(CB_HeldItem); if (species != -1) { res = res.Where(pk => pk.Species == species); } if (ability != -1) { res = res.Where(pk => pk.Ability == ability); } if (nature != -1) { res = res.Where(pk => pk.Nature == nature); } if (item != -1) { res = res.Where(pk => pk.HeldItem == item); } // Secondary Searchables int move1 = WinFormsUtil.GetIndex(CB_Move1); int move2 = WinFormsUtil.GetIndex(CB_Move2); int move3 = WinFormsUtil.GetIndex(CB_Move3); int move4 = WinFormsUtil.GetIndex(CB_Move4); if (move1 != -1) { res = res.Where(pk => pk.Moves.Contains(move1)); } if (move2 != -1) { res = res.Where(pk => pk.Moves.Contains(move2)); } if (move3 != -1) { res = res.Where(pk => pk.Moves.Contains(move3)); } if (move4 != -1) { res = res.Where(pk => pk.Moves.Contains(move4)); } int vers = WinFormsUtil.GetIndex(CB_GameOrigin); if (vers != -1) { res = res.Where(pk => pk.Version == vers); } int hptype = WinFormsUtil.GetIndex(CB_HPType); if (hptype != -1) { res = res.Where(pk => pk.HPType == hptype); } if (CHK_Shiny.CheckState == CheckState.Checked) { res = res.Where(pk => pk.IsShiny); } if (CHK_Shiny.CheckState == CheckState.Unchecked) { res = res.Where(pk => !pk.IsShiny); } if (CHK_IsEgg.CheckState == CheckState.Checked) { res = res.Where(pk => pk.IsEgg); } if (CHK_IsEgg.CheckState == CheckState.Unchecked) { res = res.Where(pk => !pk.IsEgg); } if (CHK_IsEgg.CheckState == CheckState.Checked && MT_ESV.Text != "") { res = res.Where(pk => pk.PSV == Convert.ToInt16(MT_ESV.Text)); } // Tertiary Searchables res = FilterByLVL(res, CB_Level.SelectedIndex, TB_Level.Text); res = FilterByIVs(res, CB_IV.SelectedIndex); res = FilterByEVs(res, CB_EVTrain.SelectedIndex); slotSelected = -1; // reset the slot last viewed if (Menu_SearchLegal.Checked && !Menu_SearchIllegal.Checked) { res = res.Where(pk => new LegalityAnalysis(pk).ParsedValid); } if (!Menu_SearchLegal.Checked && Menu_SearchIllegal.Checked) { res = res.Where(pk => new LegalityAnalysis(pk).ParsedInvalid); } if (RTB_Instructions.Lines.Any(line => line.Length > 0)) { var filters = BatchEditor.StringInstruction.GetFilters(RTB_Instructions.Lines).ToArray(); BatchEditor.ScreenStrings(filters); res = res.Where(pkm => // Compare across all filters { foreach (var cmd in filters) { if (cmd.PropertyName == nameof(PKM.Identifier) + "Contains") { return(pkm.Identifier.Contains(cmd.PropertyValue)); } if (!pkm.GetType().HasPropertyAll(cmd.PropertyName)) { return(false); } try { if (pkm.GetType().IsValueEqual(pkm, cmd.PropertyName, cmd.PropertyValue) == cmd.Evaluator) { continue; } } catch { Debug.WriteLine($"Unable to compare {cmd.PropertyName} to {cmd.PropertyValue}."); } return(false); } return(true); }); } if (Menu_SearchClones.Checked) { res = res.GroupBy(Hash).Where(group => group.Count() > 1).SelectMany(z => z); } return(res); }
// View Updates private IEnumerable <PKM> SearchDatabase() { // Populate Search Query Result IEnumerable <PKM> res = RawDB; // Filter for Selected Source if (!Menu_SearchBoxes.Checked) { res = res.Where(pk => pk.Identifier.StartsWith(DatabasePath + Path.DirectorySeparatorChar, StringComparison.Ordinal)); } if (!Menu_SearchDatabase.Checked) { res = res.Where(pk => !pk.Identifier.StartsWith(DatabasePath + Path.DirectorySeparatorChar, StringComparison.Ordinal)); #if LOADALL res = res.Where(pk => !pk.Identifier.StartsWith(EXTERNAL_SAV, StringComparison.Ordinal)); #endif } int format = MAXFORMAT + 1 - CB_Format.SelectedIndex; switch (CB_FormatComparator.SelectedIndex) { case 0: /* Do nothing */ break; case 1: res = res.Where(pk => pk.Format >= format); break; case 2: res = res.Where(pk => pk.Format == format); break; case 3: res = res.Where(pk => pk.Format <= format); break; } if (CB_FormatComparator.SelectedIndex != 0) { if (format <= 2) // 1-2 { res = res.Where(pk => pk.Format <= 2); } if (format >= 3 && format <= 6) // 3-6 { res = res.Where(pk => pk.Format >= 3); } if (format >= 7) // 1,3-6,7 { res = res.Where(pk => pk.Format != 2); } } switch (CB_Generation.SelectedIndex) { case 0: /* Do nothing */ break; case 1: res = res.Where(pk => pk.Gen7); break; case 2: res = res.Where(pk => pk.Gen6); break; case 3: res = res.Where(pk => pk.Gen5); break; case 4: res = res.Where(pk => pk.Gen4); break; case 5: res = res.Where(pk => pk.Gen3); break; } // Primary Searchables int species = WinFormsUtil.GetIndex(CB_Species); int ability = WinFormsUtil.GetIndex(CB_Ability); int nature = WinFormsUtil.GetIndex(CB_Nature); int item = WinFormsUtil.GetIndex(CB_HeldItem); if (species != -1) { res = res.Where(pk => pk.Species == species); } if (ability != -1) { res = res.Where(pk => pk.Ability == ability); } if (nature != -1) { res = res.Where(pk => pk.Nature == nature); } if (item != -1) { res = res.Where(pk => pk.HeldItem == item); } // Secondary Searchables int move1 = WinFormsUtil.GetIndex(CB_Move1); int move2 = WinFormsUtil.GetIndex(CB_Move2); int move3 = WinFormsUtil.GetIndex(CB_Move3); int move4 = WinFormsUtil.GetIndex(CB_Move4); var moves = new[] { move1, move2, move3, move4 }.Where(z => z > 0).ToList(); int count = moves.Count; if (count > 0) { res = res.Where(pk => pk.Moves.Intersect(moves).Count() == count); } int vers = WinFormsUtil.GetIndex(CB_GameOrigin); if (vers != -1) { res = res.Where(pk => pk.Version == vers); } int hptype = WinFormsUtil.GetIndex(CB_HPType); if (hptype != -1) { res = res.Where(pk => pk.HPType == hptype); } if (CHK_Shiny.CheckState == CheckState.Checked) { res = res.Where(pk => pk.IsShiny); } if (CHK_Shiny.CheckState == CheckState.Unchecked) { res = res.Where(pk => !pk.IsShiny); } if (CHK_IsEgg.CheckState == CheckState.Checked) { res = res.Where(pk => pk.IsEgg); } if (CHK_IsEgg.CheckState == CheckState.Unchecked) { res = res.Where(pk => !pk.IsEgg); } if (CHK_IsEgg.CheckState == CheckState.Checked && string.IsNullOrWhiteSpace(MT_ESV.Text)) { res = res.Where(pk => pk.PSV == Convert.ToInt16(MT_ESV.Text)); } // Tertiary Searchables res = FilterByLVL(res, CB_Level.SelectedIndex, TB_Level.Text); res = FilterByIVs(res, CB_IV.SelectedIndex); res = FilterByEVs(res, CB_EVTrain.SelectedIndex); slotSelected = -1; // reset the slot last viewed if (Menu_SearchLegal.Checked && !Menu_SearchIllegal.Checked) { res = res.Where(pk => new LegalityAnalysis(pk).ParsedValid); } if (!Menu_SearchLegal.Checked && Menu_SearchIllegal.Checked) { res = res.Where(pk => new LegalityAnalysis(pk).ParsedInvalid); } if (RTB_Instructions.Lines.Any(line => line.Length > 0)) { var filters = BatchEditor.StringInstruction.GetFilters(RTB_Instructions.Lines).ToArray(); BatchEditor.ScreenStrings(filters); res = res.Where(pkm => IsPKMFiltered(pkm, filters)); // Compare across all filters } if (Menu_SearchClones.Checked) { res = res.GroupBy(Hash).Where(group => group.Count() > 1).SelectMany(z => z); } return(res); }
// View Updates private void B_Search_Click(object sender, EventArgs e) { // Populate Search Query Result IEnumerable <PKM> res = RawDB; int format = MAXFORMAT + 1 - CB_Format.SelectedIndex; switch (CB_FormatComparator.SelectedIndex) { case 0: /* Do nothing */ break; case 1: res = res.Where(pk => pk.Format >= format); break; case 2: res = res.Where(pk => pk.Format == format); break; case 3: res = res.Where(pk => pk.Format <= format); break; } if (CB_FormatComparator.SelectedIndex != 0) { if (format <= 2) // 1-2 { res = res.Where(pk => pk.Format <= 2); } if (format >= 3 && format <= 6) // 3-6 { res = res.Where(pk => pk.Format >= 3); } if (format >= 7) // 1,3-6,7 { res = res.Where(pk => pk.Format != 2); } } switch (CB_Generation.SelectedIndex) { case 0: /* Do nothing */ break; case 1: res = res.Where(pk => pk.Gen7); break; case 2: res = res.Where(pk => pk.Gen6); break; case 3: res = res.Where(pk => pk.Gen5); break; case 4: res = res.Where(pk => pk.Gen4); break; case 5: res = res.Where(pk => pk.Gen3); break; } // Primary Searchables int species = WinFormsUtil.getIndex(CB_Species); int ability = WinFormsUtil.getIndex(CB_Ability); int nature = WinFormsUtil.getIndex(CB_Nature); int item = WinFormsUtil.getIndex(CB_HeldItem); if (species != -1) { res = res.Where(pk => pk.Species == species); } if (ability != -1) { res = res.Where(pk => pk.Ability == ability); } if (nature != -1) { res = res.Where(pk => pk.Nature == nature); } if (item != -1) { res = res.Where(pk => pk.HeldItem == item); } // Secondary Searchables int move1 = WinFormsUtil.getIndex(CB_Move1); int move2 = WinFormsUtil.getIndex(CB_Move2); int move3 = WinFormsUtil.getIndex(CB_Move3); int move4 = WinFormsUtil.getIndex(CB_Move4); if (move1 != -1) { res = res.Where(pk => pk.Moves.Contains(move1)); } if (move2 != -1) { res = res.Where(pk => pk.Moves.Contains(move2)); } if (move3 != -1) { res = res.Where(pk => pk.Moves.Contains(move3)); } if (move4 != -1) { res = res.Where(pk => pk.Moves.Contains(move4)); } int vers = WinFormsUtil.getIndex(CB_GameOrigin); if (vers != -1) { res = res.Where(pk => pk.Version == vers); } int hptype = WinFormsUtil.getIndex(CB_HPType); if (hptype != -1) { res = res.Where(pk => pk.HPType == hptype); } if (CHK_Shiny.CheckState == CheckState.Checked) { res = res.Where(pk => pk.IsShiny); } if (CHK_Shiny.CheckState == CheckState.Unchecked) { res = res.Where(pk => !pk.IsShiny); } if (CHK_IsEgg.CheckState == CheckState.Checked) { res = res.Where(pk => pk.IsEgg); } if (CHK_IsEgg.CheckState == CheckState.Unchecked) { res = res.Where(pk => !pk.IsEgg); } if (CHK_IsEgg.CheckState == CheckState.Checked && MT_ESV.Text != "") { res = res.Where(pk => pk.PSV == Convert.ToInt16(MT_ESV.Text)); } // Tertiary Searchables if (TB_Level.Text != "") // Level { int level = Convert.ToInt16(TB_Level.Text); if (level <= 100) { switch (CB_Level.SelectedIndex) { case 0: break; // Any case 1: // <= res = res.Where(pk => pk.Stat_Level <= level); break; case 2: // == res = res.Where(pk => pk.Stat_Level == level); break; case 3: // >= res = res.Where(pk => pk.Stat_Level >= level); break; } } } switch (CB_IV.SelectedIndex) { case 0: break; // Do nothing case 1: // <= 90 res = res.Where(pk => pk.IVs.Sum() <= 90); break; case 2: // 91-120 res = res.Where(pk => pk.IVs.Sum() > 90 && pk.IVs.Sum() <= 120); break; case 3: // 121-150 res = res.Where(pk => pk.IVs.Sum() > 120 && pk.IVs.Sum() <= 150); break; case 4: // 151-179 res = res.Where(pk => pk.IVs.Sum() > 150 && pk.IVs.Sum() < 180); break; case 5: // 180+ res = res.Where(pk => pk.IVs.Sum() >= 180); break; case 6: // == 186 res = res.Where(pk => pk.IVs.Sum() == 186); break; } switch (CB_EVTrain.SelectedIndex) { case 0: break; // Do nothing case 1: // None (0) res = res.Where(pk => pk.EVs.Sum() == 0); break; case 2: // Some (127-0) res = res.Where(pk => pk.EVs.Sum() < 128); break; case 3: // Half (128-507) res = res.Where(pk => pk.EVs.Sum() >= 128 && pk.EVs.Sum() < 508); break; case 4: // Full (508+) res = res.Where(pk => pk.EVs.Sum() >= 508); break; } // Filter for Selected Source if (!Menu_SearchBoxes.Checked) { res = res.Where(pk => pk.Identifier.StartsWith(DatabasePath + Path.DirectorySeparatorChar, StringComparison.Ordinal)); } if (!Menu_SearchDatabase.Checked) { res = res.Where(pk => !pk.Identifier.StartsWith(DatabasePath + Path.DirectorySeparatorChar, StringComparison.Ordinal)); } slotSelected = -1; // reset the slot last viewed if (Menu_SearchLegal.Checked && !Menu_SearchIllegal.Checked) // Legal Only { res = res.Where(pk => pk.GenNumber >= 6 && new LegalityAnalysis(pk).Valid); } if (!Menu_SearchLegal.Checked && Menu_SearchIllegal.Checked) // Illegal Only { res = res.Where(pk => pk.GenNumber >= 6 && !new LegalityAnalysis(pk).Valid); } if (RTB_Instructions.Lines.Any(line => line.Length > 0)) { var raw = RTB_Instructions.Lines .Where(line => !string.IsNullOrWhiteSpace(line)) .Where(line => new[] { '!', '=' }.Contains(line[0])); var filters = (from line in raw let eval = line[0] == '=' let split = line.Substring(1).Split('=') where split.Length == 2 && !string.IsNullOrWhiteSpace(split[0]) select new BatchEditor.StringInstruction { PropertyName = split[0], PropertyValue = split[1], Evaluator = eval }).ToArray(); BatchEditor.screenStrings(filters); res = res.Where(pkm => // Compare across all filters { foreach (var cmd in filters) { if (!pkm.GetType().HasPropertyAll(cmd.PropertyName)) { return(false); } try { if (ReflectUtil.GetValueEquals(pkm, cmd.PropertyName, cmd.PropertyValue) == cmd.Evaluator) { continue; } } catch { Console.WriteLine($"Unable to compare {cmd.PropertyName} to {cmd.PropertyValue}."); } return(false); } return(true); }); } if (Menu_SearchClones.Checked) { var r = res.ToArray(); var hashes = r.Select(hash).ToArray(); res = r.Where((t, i) => hashes.Count(x => x == hashes[i]) > 1).OrderBy(hash); } var results = res.ToArray(); if (results.Length == 0) { if (!Menu_SearchBoxes.Checked && !Menu_SearchDatabase.Checked) { WinFormsUtil.Alert("No data source to search!", "No results found!"); } else { WinFormsUtil.Alert("No results found!"); } } setResults(new List <PKM>(results)); // updates Count Label as well. System.Media.SystemSounds.Asterisk.Play(); }