/// <summary> /// Compares a node's research, unlocks and tech-level to the current filter. Updates the node of it's match status. /// </summary> /// <param name="node"></param> /// <returns></returns> public FilterMatchType NodeIsMatch(Node node) { if (!FilterDirty) { return(FilterMatchType.NONE); } string phrase = _filterPhrase.Trim(); FilterMatchType ret = FilterMatchType.NONE; string retDesc = StringExtensions.TitleCase(node.Research.LabelCap); // default if (phrase != "") { foreach (FilterMatchType tryMatch in Enum.GetValues(typeof(FilterMatchType))) { //Log.Message("trying match for " + tryMatch.ToString()); switch (tryMatch) { case FilterMatchType.RESEARCH: if (node.Research.label.Contains(phrase, StringComparison.InvariantCultureIgnoreCase)) { ret = FilterMatchType.RESEARCH; } break; case FilterMatchType.UNLOCK: { List <string> unlockDescs = node.Research.GetUnlockDefsAndDescs() .Where(unlock => unlock.First.label.Contains(phrase, StringComparison.InvariantCulture)) .Select(unlock => unlock.First.label).ToList(); if (unlockDescs.Count > 0) { retDesc = string.Format("{0} ({1})", retDesc, StringExtensions.TitleCase(string.Join(", ", unlockDescs.ToArray()))); ret = FilterMatchType.UNLOCK; } } break; case FilterMatchType.TECH_LEVEL: { if (node.Research.techLevel.ToStringHuman().Contains(phrase, StringComparison.InvariantCultureIgnoreCase)) { ret = FilterMatchType.TECH_LEVEL; } } break; default: ret = FilterMatchType.NO_MATCH; break; } if (ret != FilterMatchType.NONE) { break; } } } else { ret = FilterMatchType.NONE; } // save the result for display later if (ret.IsValidMatch()) { if (!_matchResults.ContainsKey(ret)) { _matchResults.Add(ret, new List <string>()); } _matchResults[ret].Add(retDesc); } // update the node of the result node.FilterMatch = ret; return(ret); }