private void UpdateSecondLevel() { using (Monitor.Enter()) { var previousSecondLevel = SelectedSecondLevel; if (SelectedFirstLevel == BaseGroup.Any) { SecondLevelList = EligibleBases.Select(b => b.ItemClass) .Prepend(ItemClass.Any) .Distinct() .OrderBy(c => c).ToList(); } else { var list = EligibleBases .Where(b => BaseGroupEx.FromTags(b.Tags) == SelectedFirstLevel) .Select(b => b.ItemClass) .Distinct() .OrderBy(c => c).ToList(); switch (list.Count) { case 1: // Only contains the only class of the selected group // -> "any" makes no sense SecondLevelList = list; break; default: SecondLevelList = list.Prepend(ItemClass.Any).ToList(); break; } } SelectedSecondLevel = SecondLevelList.Contains(previousSecondLevel) ? previousSecondLevel : SecondLevelList[0]; if (previousSecondLevel == SelectedSecondLevel) { UpdateThirdLevel(); } } }
private void UpdateThirdLevel() { var previousThirdLevel = SelectedThirdLevel; if (SelectedSecondLevel == ItemClass.Any) { ThirdLevelList = new[] { Tags.Default }; } else { var matchingBases = EligibleBases .Where(b => b.ItemClass == SelectedSecondLevel) .ToList(); var list = _thirdLevelOptions .Where(t => matchingBases.Any(b => b.Tags.HasFlag(t))) .ToList(); switch (list.Count) { case 0: ThirdLevelList = new[] { Tags.Default }; break; case 1: ThirdLevelList = list; break; default: ThirdLevelList = list.Prepend(Tags.Default).ToList(); break; } } SelectedThirdLevel = ThirdLevelList.Contains(previousThirdLevel) ? previousThirdLevel : ThirdLevelList[0]; if (previousThirdLevel == SelectedThirdLevel) { UpdateBaseList(); } }
private void UpdateBaseList() { using (Monitor.Enter()) { var previousSelectedBase = SelectedBase; if (SelectedType == ItemType.Any) { BaseList = SelectedGroup == ItemGroup.Any ? EligibleBases.ToList() : BasesPerGroup[SelectedGroup].ToList(); } else { BaseList = BasesPerType[SelectedType].ToList(); } SelectedBase = BaseList[0]; if (SelectedBase == previousSelectedBase) { UpdateBase(); } } }