/// <summary> /// Build the list of Qualities. /// </summary> private void BuildQualityList() { if (_blnLoading) { return; } string strCategory = cboCategory.SelectedValue?.ToString() ?? string.Empty; StringBuilder sbdFilter = new StringBuilder('(' + _objCharacter.Options.BookXPath() + ')'); if (!string.IsNullOrEmpty(strCategory) && strCategory != "Show All" && (GlobalOptions.SearchInCategoryOnly || txtSearch.TextLength == 0)) { sbdFilter.Append(" and category = " + strCategory.CleanXPath()); } else { StringBuilder objCategoryFilter = new StringBuilder(); foreach (string strItem in _lstCategory.Select(x => x.Value)) { if (!string.IsNullOrEmpty(strItem)) { objCategoryFilter.Append("category = " + strItem.CleanXPath() + " or "); } } if (objCategoryFilter.Length > 0) { objCategoryFilter.Length -= 4; sbdFilter.Append(" and (" + objCategoryFilter + ')'); } } if (chkMetagenic.Checked) { sbdFilter.Append(" and (metagenic = 'True' or required/oneof[contains(., 'Changeling')])"); } else if (chkNotMetagenic.Checked) { sbdFilter.Append(" and not(metagenic = 'True') and not(required/oneof[contains(., 'Changeling')])"); } if (nudValueBP.Value != 0) { if (_objCharacter.Created && !_objCharacter.Options.DontDoubleQualityPurchases && nudValueBP.Value > 0) { sbdFilter.Append(" and ((doublecareer = 'False' and karma = " + nudValueBP.Value.ToString(GlobalOptions.InvariantCultureInfo) + ") or (not(doublecareer = 'False') and karma = " + (nudValueBP.Value / 2).ToString(GlobalOptions.InvariantCultureInfo) + "))"); } else { sbdFilter.Append(" and karma = " + nudValueBP.Value.ToString(GlobalOptions.InvariantCultureInfo)); } } else { if (nudMinimumBP.Value != 0) { if (_objCharacter.Created && !_objCharacter.Options.DontDoubleQualityPurchases) { sbdFilter.Append(" and (((doublecareer = 'False' or karma < 0) and karma >= " + nudMinimumBP.Value.ToString(GlobalOptions.InvariantCultureInfo) + ") or (not(doublecareer = 'False' or karma < 0) and karma >= " + (nudMinimumBP.Value / 2).ToString(GlobalOptions.InvariantCultureInfo) + "))"); } else { sbdFilter.Append(" and karma >= " + nudMinimumBP.Value.ToString(GlobalOptions.InvariantCultureInfo)); } } if (nudMaximumBP.Value != 0) { if (_objCharacter.Created && !_objCharacter.Options.DontDoubleQualityPurchases && nudMaximumBP.Value > 0) { sbdFilter.Append(" and (((doublecareer = 'False' or karma < 0) and karma <= " + nudMaximumBP.Value.ToString(GlobalOptions.InvariantCultureInfo) + ") or (not(doublecareer = 'False' or karma < 0) and karma <= " + (nudMaximumBP.Value / 2).ToString(GlobalOptions.InvariantCultureInfo) + "))"); } else { sbdFilter.Append(" and karma <= " + nudMaximumBP.Value.ToString(GlobalOptions.InvariantCultureInfo)); } } } if (!string.IsNullOrEmpty(txtSearch.Text)) { sbdFilter.Append(" and " + CommonFunctions.GenerateSearchXPath(txtSearch.Text)); } string strCategoryLower = strCategory == "Show All" ? "*" : strCategory.ToLowerInvariant(); List <ListItem> lstQuality = new List <ListItem>(); foreach (XPathNavigator objXmlQuality in _xmlBaseQualityDataNode.Select("qualities/quality[" + sbdFilter + "]")) { string strLoopName = objXmlQuality.SelectSingleNode("name")?.Value; if (string.IsNullOrEmpty(strLoopName)) { continue; } if (_xmlMetatypeQualityRestrictionNode != null && _xmlMetatypeQualityRestrictionNode.SelectSingleNode(strCategoryLower + "/quality[. = " + strLoopName.CleanXPath() + "]") == null) { continue; } if (!chkLimitList.Checked || objXmlQuality.RequirementsMet(_objCharacter, string.Empty, string.Empty, IgnoreQuality)) { lstQuality.Add(new ListItem(objXmlQuality.SelectSingleNode("id")?.Value ?? string.Empty, objXmlQuality.SelectSingleNode("translate")?.Value ?? strLoopName)); } } lstQuality.Sort(CompareListItems.CompareNames); string strOldSelectedQuality = lstQualities.SelectedValue?.ToString(); _blnLoading = true; lstQualities.BeginUpdate(); lstQualities.ValueMember = nameof(ListItem.Value); lstQualities.DisplayMember = nameof(ListItem.Name); lstQualities.DataSource = lstQuality; _blnLoading = false; if (string.IsNullOrEmpty(strOldSelectedQuality)) { lstQualities.SelectedIndex = -1; } else { lstQualities.SelectedValue = strOldSelectedQuality; } lstQualities.EndUpdate(); }
/// <summary> /// Build the list of Arts. /// </summary> private void BuildList() { if (_blnLoading) { return; } List <ListItem> lstArts = new List <ListItem>(); foreach (XPathNavigator objXmlMetamagic in _objXmlDocument.Select(_strBaseXPath + '[' + _strXPathFilter + CommonFunctions.GenerateSearchXPath(txtSearch.Text) + ']')) { string strId = objXmlMetamagic.SelectSingleNode("id")?.Value; if (!string.IsNullOrEmpty(strId)) { if (!chkLimitList.Checked || objXmlMetamagic.RequirementsMet(_objCharacter)) { lstArts.Add(new ListItem(objXmlMetamagic.SelectSingleNode("id")?.Value, objXmlMetamagic.SelectSingleNode("translate")?.Value ?? objXmlMetamagic.SelectSingleNode("name")?.Value ?? LanguageManager.GetString("String_Unknown"))); } } } lstArts.Sort(CompareListItems.CompareNames); string strOldSelected = lstArt.SelectedValue?.ToString(); _blnLoading = true; lstArt.BeginUpdate(); lstArt.ValueMember = "Value"; lstArt.DisplayMember = "Name"; lstArt.DataSource = lstArts; _blnLoading = false; if (!string.IsNullOrEmpty(strOldSelected)) { lstArt.SelectedValue = strOldSelected; } else { lstArt.SelectedIndex = -1; } lstArt.EndUpdate(); }
/// <summary> /// Build the list of available weapon accessories. /// </summary> private void BuildAccessoryList() { List <ListItem> lstAccessories = new List <ListItem>(); // Populate the Accessory list. StringBuilder strMount = new StringBuilder("contains(mount, \"Internal\") or contains(mount, \"None\") or mount = \"\""); foreach (string strAllowedMount in _lstAllowedMounts) { if (!string.IsNullOrEmpty(strAllowedMount)) { strMount.Append(" or contains(mount, \"" + strAllowedMount + "\")"); } } strMount.Append(CommonFunctions.GenerateSearchXPath(txtSearch.Text)); XPathNavigator xmlParentWeaponDataNode = _xmlBaseChummerNode.SelectSingleNode("weapons/weapon[id = \"" + _objParentWeapon.SourceID.ToString("D") + "\"]"); foreach (XPathNavigator objXmlAccessory in _xmlBaseChummerNode.Select("accessories/accessory[(" + strMount + ") and (" + _objCharacter.Options.BookXPath() + ")]")) { string strId = objXmlAccessory.SelectSingleNode("id")?.Value; if (string.IsNullOrEmpty(strId)) { continue; } XPathNavigator xmlExtraMountNode = objXmlAccessory.SelectSingleNode("extramount"); if (xmlExtraMountNode != null) { if (_lstAllowedMounts.Count > 1) { foreach (string strItem in xmlExtraMountNode.Value.Split('/')) { if (!string.IsNullOrEmpty(strItem) && _lstAllowedMounts.All(strAllowedMount => strAllowedMount != strItem)) { goto NextItem; } } } } XPathNavigator xmlTestNode = objXmlAccessory.SelectSingleNode("forbidden/weapondetails"); if (xmlTestNode != null) { // Assumes topmost parent is an AND node if (xmlParentWeaponDataNode.ProcessFilterOperationNode(xmlTestNode, false)) { continue; } } xmlTestNode = objXmlAccessory.SelectSingleNode("required/weapondetails"); if (xmlTestNode != null) { // Assumes topmost parent is an AND node if (!xmlParentWeaponDataNode.ProcessFilterOperationNode(xmlTestNode, false)) { continue; } } xmlTestNode = objXmlAccessory.SelectSingleNode("forbidden/oneof"); XPathNodeIterator objXmlForbiddenList = xmlTestNode?.Select("accessory"); if (objXmlForbiddenList?.Count > 0) { //Add to set for O(N log M) runtime instead of O(N * M) HashSet <string> objForbiddenAccessory = new HashSet <string>(); foreach (XPathNavigator node in objXmlForbiddenList) { objForbiddenAccessory.Add(node.Value); } if (_objParentWeapon.WeaponAccessories.Any(objAccessory => objForbiddenAccessory.Contains(objAccessory.Name))) { continue; } } xmlTestNode = objXmlAccessory.SelectSingleNode("required/oneof"); if (xmlTestNode != null) { XPathNodeIterator objXmlRequiredList = xmlTestNode.Select("accessory"); if (objXmlRequiredList.Count > 0) { //Add to set for O(N log M) runtime instead of O(N * M) HashSet <string> objRequiredAccessory = new HashSet <string>(); foreach (XPathNavigator node in objXmlRequiredList) { objRequiredAccessory.Add(node.Value); } if (!_objParentWeapon.WeaponAccessories.Any(objAccessory => objRequiredAccessory.Contains(objAccessory.Name))) { continue; } } else { continue; } } decimal decCostMultiplier = 1 + (nudMarkup.Value / 100.0m); if (_blnIsParentWeaponBlackMarketAllowed) { decCostMultiplier *= 0.9m; } if ((!chkHideOverAvailLimit.Checked || SelectionShared.CheckAvailRestriction(objXmlAccessory, _objCharacter) && (chkFreeItem.Checked || !chkShowOnlyAffordItems.Checked || SelectionShared.CheckNuyenRestriction(objXmlAccessory, _objCharacter.Nuyen, decCostMultiplier)))) { lstAccessories.Add(new ListItem(strId, objXmlAccessory.SelectSingleNode("translate")?.Value ?? objXmlAccessory.SelectSingleNode("name")?.Value ?? LanguageManager.GetString("String_Unknown", GlobalOptions.Language))); } NextItem :; } lstAccessories.Sort(CompareListItems.CompareNames); string strOldSelected = lstAccessory.SelectedValue?.ToString(); _blnLoading = true; lstAccessory.BeginUpdate(); lstAccessory.ValueMember = "Value"; lstAccessory.DisplayMember = "Name"; lstAccessory.DataSource = lstAccessories; _blnLoading = false; if (!string.IsNullOrEmpty(strOldSelected)) { lstAccessory.SelectedValue = strOldSelected; } else { lstAccessory.SelectedIndex = -1; } lstAccessory.EndUpdate(); }
/// <summary> /// Build the list of Metamagics. /// </summary> private void BuildMetamagicList() { string strFilter = _objCharacter.Options.BookXPath(); // If the character has MAG enabled, filter the list based on Adept/Magician availability. if (_objCharacter.MAGEnabled) { bool blnIsMagician = _objCharacter.MagicianEnabled; if (blnIsMagician != _objCharacter.AdeptEnabled) { if (blnIsMagician) { strFilter = "magician = 'True' and (" + strFilter + ')'; } else { strFilter = "adept = 'True' and (" + strFilter + ')'; } } } strFilter += CommonFunctions.GenerateSearchXPath(txtSearch.Text); List <ListItem> lstMetamagics = new List <ListItem>(); using (XmlNodeList objXmlMetamagicList = _objXmlDocument.SelectNodes(_strRootXPath + '[' + strFilter + ']')) if (objXmlMetamagicList?.Count > 0) { foreach (XmlNode objXmlMetamagic in objXmlMetamagicList) { string strId = objXmlMetamagic["id"]?.InnerText; if (!string.IsNullOrEmpty(strId)) { if (_lstMetamagicLimits.Count > 0 && (_objMode == Mode.Metamagic && !_lstMetamagicLimits.Any(item => item.Key == objXmlMetamagic["name"]?.InnerText && (item.Value == -1 || item.Value == _objCharacter.InitiateGrade)) || _objMode == Mode.Echo && !_lstMetamagicLimits.Any(item => item.Key == objXmlMetamagic["name"]?.InnerText && (item.Value == -1 || item.Value == _objCharacter.SubmersionGrade)))) { continue; } if (!chkLimitList.Checked || objXmlMetamagic.CreateNavigator().RequirementsMet(_objCharacter)) { lstMetamagics.Add(new ListItem(strId, objXmlMetamagic["translate"]?.InnerText ?? objXmlMetamagic["name"]?.InnerText ?? LanguageManager.GetString("String_Unknown"))); } } } } lstMetamagics.Sort(CompareListItems.CompareNames); string strOldSelected = lstMetamagic.SelectedValue?.ToString(); _blnLoading = true; lstMetamagic.BeginUpdate(); lstMetamagic.ValueMember = nameof(ListItem.Value); lstMetamagic.DisplayMember = nameof(ListItem.Name); lstMetamagic.DataSource = lstMetamagics; _blnLoading = false; if (!string.IsNullOrEmpty(strOldSelected)) { lstMetamagic.SelectedValue = strOldSelected; } else { lstMetamagic.SelectedIndex = -1; } lstMetamagic.EndUpdate(); }
/// <summary> /// Build the list of available weapon accessories. /// </summary> private void RefreshList() { List <ListItem> lstAccessories = new List <ListItem>(); // Populate the Accessory list. StringBuilder sbdFilter = new StringBuilder("(" + _objCharacter.Options.BookXPath() + ") and (contains(mount, \"Internal\") or contains(mount, \"None\") or mount = \"\""); foreach (string strAllowedMount in _lstAllowedMounts.Where(strAllowedMount => !string.IsNullOrEmpty(strAllowedMount))) { sbdFilter.Append(" or contains(mount, " + strAllowedMount.CleanXPath() + ")"); } sbdFilter.Append(')'); if (!string.IsNullOrEmpty(txtSearch.Text)) { sbdFilter.Append(" and " + CommonFunctions.GenerateSearchXPath(txtSearch.Text)); } int intOverLimit = 0; foreach (XPathNavigator objXmlAccessory in _xmlBaseChummerNode.Select("accessories/accessory[" + sbdFilter + "]")) { string strId = objXmlAccessory.SelectSingleNode("id")?.Value; if (string.IsNullOrEmpty(strId)) { continue; } if (!_objParentWeapon.CheckAccessoryRequirements(objXmlAccessory)) { continue; } decimal decCostMultiplier = 1 + (nudMarkup.Value / 100.0m); if (_blnIsParentWeaponBlackMarketAllowed) { decCostMultiplier *= 0.9m; } if ((!chkHideOverAvailLimit.Checked || objXmlAccessory.CheckAvailRestriction(_objCharacter) && (chkFreeItem.Checked || !chkShowOnlyAffordItems.Checked || objXmlAccessory.CheckNuyenRestriction(_objCharacter.Nuyen, decCostMultiplier)))) { lstAccessories.Add(new ListItem(strId, objXmlAccessory.SelectSingleNode("translate")?.Value ?? objXmlAccessory.SelectSingleNode("name")?.Value ?? LanguageManager.GetString("String_Unknown"))); } else { ++intOverLimit; } } lstAccessories.Sort(CompareListItems.CompareNames); if (intOverLimit > 0) { // Add after sort so that it's always at the end lstAccessories.Add(new ListItem(string.Empty, string.Format(GlobalOptions.CultureInfo, LanguageManager.GetString("String_RestrictedItemsHidden"), intOverLimit))); } string strOldSelected = lstAccessory.SelectedValue?.ToString(); _blnLoading = true; lstAccessory.BeginUpdate(); lstAccessory.ValueMember = nameof(ListItem.Value); lstAccessory.DisplayMember = nameof(ListItem.Name); lstAccessory.DataSource = lstAccessories; _blnLoading = false; if (!string.IsNullOrEmpty(strOldSelected)) { lstAccessory.SelectedValue = strOldSelected; } else { lstAccessory.SelectedIndex = -1; } lstAccessory.EndUpdate(); }
private void cboCategory_SelectedIndexChanged(object sender, EventArgs e) { trePowers.Nodes.Clear(); string strCategory = cboCategory.SelectedValue?.ToString(); List <string> lstPowerWhitelist = new List <string>(); // If the Critter is only allowed certain Powers, display only those. XPathNavigator xmlOptionalPowers = _xmlMetatypeDataNode.SelectSingleNode("optionalpowers"); if (xmlOptionalPowers != null) { foreach (XPathNavigator xmlNode in xmlOptionalPowers.Select("power")) { lstPowerWhitelist.Add(xmlNode.Value); } // Determine if the Critter has a physical presence Power (Materialization, Possession, or Inhabitation). bool blnPhysicalPresence = _objCharacter.CritterPowers.Any(x => x.Name == "Materialization" || x.Name == "Possession" || x.Name == "Inhabitation"); // Add any Critter Powers the Critter comes with that have been manually deleted so they can be re-added. foreach (XPathNavigator objXmlCritterPower in _xmlMetatypeDataNode.Select("powers/power")) { bool blnAddPower = true; // Make sure the Critter doesn't already have the Power. foreach (CritterPower objCheckPower in _objCharacter.CritterPowers) { if (objCheckPower.Name == objXmlCritterPower.Value) { blnAddPower = false; break; } if ((objCheckPower.Name == "Materialization" || objCheckPower.Name == "Possession" || objCheckPower.Name == "Inhabitation") && blnPhysicalPresence) { blnAddPower = false; break; } } if (blnAddPower) { lstPowerWhitelist.Add(objXmlCritterPower.Value); // If Manifestation is one of the Powers, also include Inhabitation and Possess if they're not already in the list. if (!blnPhysicalPresence) { if (objXmlCritterPower.Value == "Materialization") { bool blnFoundPossession = false; bool blnFoundInhabitation = false; foreach (string strCheckPower in lstPowerWhitelist) { if (strCheckPower == "Possession") { blnFoundPossession = true; } else if (strCheckPower == "Inhabitation") { blnFoundInhabitation = true; } if (blnFoundInhabitation && blnFoundPossession) { break; } } if (!blnFoundPossession) { lstPowerWhitelist.Add("Possession"); } if (!blnFoundInhabitation) { lstPowerWhitelist.Add("Inhabitation"); } } } } } } string strFilter = "(" + _objCharacter.Options.BookXPath() + ')'; if (!string.IsNullOrEmpty(strCategory) && strCategory != "Show All") { strFilter += " and (contains(category,\"" + strCategory + "\"))"; } else { bool blnHasToxic = false; StringBuilder objCategoryFilter = new StringBuilder(); foreach (string strItem in _lstCategory.Select(x => x.Value)) { if (!string.IsNullOrEmpty(strItem)) { objCategoryFilter.Append("(contains(category,\"" + strItem + "\")) or "); if (strItem == "Toxic Critter Powers") { objCategoryFilter.Append("toxic = \"True\" or "); blnHasToxic = true; } } } if (objCategoryFilter.Length > 0) { strFilter += " and (" + objCategoryFilter.ToString().TrimEndOnce(" or ") + ')'; } if (!blnHasToxic) { strFilter += " and (not(toxic) or toxic != \"True\")"; } } strFilter += CommonFunctions.GenerateSearchXPath(txtSearch.Text); foreach (XPathNavigator objXmlPower in _xmlBaseCritterPowerDataNode.Select("powers/power[" + strFilter + "]")) { string strPowerName = objXmlPower.SelectSingleNode("name")?.Value ?? LanguageManager.GetString("String_Unknown"); if (!lstPowerWhitelist.Contains(strPowerName) && lstPowerWhitelist.Count != 0) { continue; } if (!objXmlPower.RequirementsMet(_objCharacter, string.Empty, string.Empty)) { continue; } TreeNode objNode = new TreeNode { Tag = objXmlPower.SelectSingleNode("id")?.Value ?? string.Empty, Text = objXmlPower.SelectSingleNode("translate")?.Value ?? strPowerName }; trePowers.Nodes.Add(objNode); } trePowers.Sort(); }
/// <summary> /// Build the list of Metamagics. /// </summary> private void BuildMetamagicList() { string strFilter = '(' + _objCharacter.Options.BookXPath() + ')'; // If the character has MAG enabled, filter the list based on Adept/Magician availability. if (_objCharacter.MAGEnabled) { bool blnIsMagician = _objCharacter.MagicianEnabled; if (blnIsMagician != _objCharacter.AdeptEnabled) { if (blnIsMagician) { strFilter += "and magician = " + bool.TrueString.CleanXPath(); } else { strFilter += "and adept = " + bool.TrueString.CleanXPath(); } } } if (!string.IsNullOrEmpty(txtSearch.Text)) { strFilter += " and " + CommonFunctions.GenerateSearchXPath(txtSearch.Text); } List <ListItem> lstMetamagics = new List <ListItem>(); foreach (XPathNavigator objXmlMetamagic in _objXmlDocument.Select(_strRootXPath + '[' + strFilter + ']')) { string strId = objXmlMetamagic.SelectSingleNode("id")?.Value; if (!string.IsNullOrEmpty(strId)) { if (_lstMetamagicLimits.Count > 0 && (_objMode == Mode.Metamagic && !_lstMetamagicLimits.Any(item => item.Key == objXmlMetamagic.SelectSingleNode("name")?.Value&& (item.Value == -1 || item.Value == _objCharacter.InitiateGrade)) || _objMode == Mode.Echo && !_lstMetamagicLimits.Any(item => item.Key == objXmlMetamagic.SelectSingleNode("name")?.Value&& (item.Value == -1 || item.Value == _objCharacter.SubmersionGrade)))) { continue; } if (!chkLimitList.Checked || objXmlMetamagic.CreateNavigator().RequirementsMet(_objCharacter)) { lstMetamagics.Add(new ListItem(strId, objXmlMetamagic.SelectSingleNode("translate")?.Value ?? objXmlMetamagic.SelectSingleNode("name")?.Value ?? LanguageManager.GetString("String_Unknown"))); } } } lstMetamagics.Sort(CompareListItems.CompareNames); string strOldSelected = lstMetamagic.SelectedValue?.ToString(); _blnLoading = true; lstMetamagic.BeginUpdate(); lstMetamagic.PopulateWithListItems(lstMetamagics); _blnLoading = false; if (!string.IsNullOrEmpty(strOldSelected)) { lstMetamagic.SelectedValue = strOldSelected; } else { lstMetamagic.SelectedIndex = -1; } lstMetamagic.EndUpdate(); }
/// <summary> /// Build the list of Metamagics. /// </summary> private async ValueTask BuildMetamagicList() { string strFilter = '(' + _objCharacter.Settings.BookXPath() + ')'; // If the character has MAG enabled, filter the list based on Adept/Magician availability. if (_objCharacter.MAGEnabled) { bool blnIsMagician = _objCharacter.MagicianEnabled; if (blnIsMagician != _objCharacter.AdeptEnabled) { if (blnIsMagician) { strFilter += "and magician = " + bool.TrueString.CleanXPath(); } else { strFilter += "and adept = " + bool.TrueString.CleanXPath(); } } } if (_lstMetamagicLimits.Count > 0) { strFilter += " and ("; using (new FetchSafelyFromPool <StringBuilder>(Utils.StringBuilderPool, out StringBuilder sbdFilter)) { foreach (string strMetamagic in _lstMetamagicLimits) { sbdFilter.Append("name = ").Append(strMetamagic.CleanXPath()).Append(" or "); } sbdFilter.Length -= 4; strFilter += sbdFilter.ToString() + ')'; } } string strSearch = await txtSearch.DoThreadSafeFuncAsync(x => x.Text); if (!string.IsNullOrEmpty(strSearch)) { strFilter += " and " + CommonFunctions.GenerateSearchXPath(strSearch); } using (new FetchSafelyFromPool <List <ListItem> >(Utils.ListItemListPool, out List <ListItem> lstMetamagics)) { foreach (XPathNavigator objXmlMetamagic in _objXmlDocument.Select(_strRootXPath + '[' + strFilter + ']')) { string strId = (await objXmlMetamagic.SelectSingleNodeAndCacheExpressionAsync("id"))?.Value; if (string.IsNullOrEmpty(strId)) { continue; } if (!chkLimitList.Checked || objXmlMetamagic.CreateNavigator().RequirementsMet(_objCharacter)) { lstMetamagics.Add(new ListItem(strId, (await objXmlMetamagic.SelectSingleNodeAndCacheExpressionAsync("translate")) ?.Value ?? (await objXmlMetamagic .SelectSingleNodeAndCacheExpressionAsync("name"))?.Value ?? await LanguageManager.GetStringAsync("String_Unknown"))); } } lstMetamagics.Sort(CompareListItems.CompareNames); string strOldSelected = await lstMetamagic.DoThreadSafeFuncAsync(x => x.SelectedValue?.ToString()); _blnLoading = true; await lstMetamagic.PopulateWithListItemsAsync(lstMetamagics); _blnLoading = false; await lstMetamagic.DoThreadSafeAsync(x => { if (!string.IsNullOrEmpty(strOldSelected)) { x.SelectedValue = strOldSelected; } else { x.SelectedIndex = -1; } }); } }
/// <summary> /// Build the list of available weapon accessories. /// </summary> private async ValueTask RefreshList() { using (new FetchSafelyFromPool <List <ListItem> >(Utils.ListItemListPool, out List <ListItem> lstAccessories)) { // Populate the Accessory list. string strFilter = string.Empty; using (new FetchSafelyFromPool <StringBuilder>(Utils.StringBuilderPool, out StringBuilder sbdFilter)) { sbdFilter.Append('(').Append(_objCharacter.Settings.BookXPath()) .Append( ") and (contains(mount, \"Internal\") or contains(mount, \"None\") or mount = \"\""); foreach (string strAllowedMount in _lstAllowedMounts.Where( strAllowedMount => !string.IsNullOrEmpty(strAllowedMount))) { sbdFilter.Append(" or contains(mount, ").Append(strAllowedMount.CleanXPath()).Append(')'); } sbdFilter.Append(')'); string strSearch = await txtSearch.DoThreadSafeFuncAsync(x => x.Text); if (!string.IsNullOrEmpty(strSearch)) { sbdFilter.Append(" and ").Append(CommonFunctions.GenerateSearchXPath(strSearch)); } if (sbdFilter.Length > 0) { strFilter = '[' + sbdFilter.ToString() + ']'; } } int intOverLimit = 0; bool blnHideOverAvailLimit = await chkHideOverAvailLimit.DoThreadSafeFuncAsync(x => x.Checked); bool blnShowOnlyAffordItems = await chkShowOnlyAffordItems.DoThreadSafeFuncAsync(x => x.Checked); bool blnFreeItem = await chkFreeItem.DoThreadSafeFuncAsync(x => x.Checked); decimal decBaseCostMultiplier = 1 + (await nudMarkup.DoThreadSafeFuncAsync(x => x.Value) / 100.0m); foreach (XPathNavigator objXmlAccessory in _xmlBaseChummerNode.Select( "accessories/accessory" + strFilter)) { string strId = (await objXmlAccessory.SelectSingleNodeAndCacheExpressionAsync("id"))?.Value; if (string.IsNullOrEmpty(strId)) { continue; } if (!_objParentWeapon.CheckAccessoryRequirements(objXmlAccessory)) { continue; } decimal decCostMultiplier = decBaseCostMultiplier; if (_blnIsParentWeaponBlackMarketAllowed) { decCostMultiplier *= 0.9m; } if (!blnHideOverAvailLimit || objXmlAccessory.CheckAvailRestriction(_objCharacter) && (blnFreeItem || !blnShowOnlyAffordItems || objXmlAccessory.CheckNuyenRestriction( _objCharacter.Nuyen, decCostMultiplier))) { lstAccessories.Add(new ListItem( strId, (await objXmlAccessory.SelectSingleNodeAndCacheExpressionAsync("translate"))?.Value ?? (await objXmlAccessory.SelectSingleNodeAndCacheExpressionAsync("name"))?.Value ?? await LanguageManager.GetStringAsync("String_Unknown"))); } else { ++intOverLimit; } } lstAccessories.Sort(CompareListItems.CompareNames); if (intOverLimit > 0) { // Add after sort so that it's always at the end lstAccessories.Add(new ListItem(string.Empty, string.Format( GlobalSettings.CultureInfo, await LanguageManager.GetStringAsync("String_RestrictedItemsHidden"), intOverLimit))); } string strOldSelected = await lstAccessory.DoThreadSafeFuncAsync(x => x.SelectedValue?.ToString()); _blnLoading = true; await lstAccessory.PopulateWithListItemsAsync(lstAccessories); _blnLoading = false; await lstAccessory.DoThreadSafeAsync(x => { if (!string.IsNullOrEmpty(strOldSelected)) { x.SelectedValue = strOldSelected; } else { x.SelectedIndex = -1; } }); } }
private void BuildComplexFormList() { if (_blnLoading) { return; } string strFilter = '(' + _objCharacter.Options.BookXPath() + ')'; if (!string.IsNullOrEmpty(txtSearch.Text)) { strFilter += " and " + CommonFunctions.GenerateSearchXPath(txtSearch.Text); } // Populate the Complex Form list. List <ListItem> lstComplexFormItems = new List <ListItem>(); foreach (XPathNavigator xmlComplexForm in _xmlBaseComplexFormsNode.Select("complexform[" + strFilter + ']')) { string strId = xmlComplexForm.SelectSingleNode("id")?.Value; if (string.IsNullOrEmpty(strId)) { continue; } if (!xmlComplexForm.RequirementsMet(_objCharacter)) { continue; } string strName = xmlComplexForm.SelectSingleNode("name")?.Value ?? LanguageManager.GetString("String_Unknown"); // If this is a Sprite with Optional Complex Forms, see if this Complex Form is allowed. if (_xmlOptionalComplexFormNode?.SelectSingleNode("complexform") != null) { if (_xmlOptionalComplexFormNode.SelectSingleNode("complexform[text() = \"" + strName + "\"]") == null) { continue; } } lstComplexFormItems.Add(new ListItem(strId, xmlComplexForm.SelectSingleNode("translate")?.Value ?? strName)); } lstComplexFormItems.Sort(CompareListItems.CompareNames); _blnLoading = true; string strOldSelected = lstComplexForms.SelectedValue?.ToString(); lstComplexForms.BeginUpdate(); lstComplexForms.ValueMember = nameof(ListItem.Value); lstComplexForms.DisplayMember = nameof(ListItem.Name); lstComplexForms.DataSource = lstComplexFormItems; _blnLoading = false; if (!string.IsNullOrEmpty(strOldSelected)) { lstComplexForms.SelectedValue = strOldSelected; } else { lstComplexForms.SelectedIndex = -1; } lstComplexForms.EndUpdate(); }