public SettingSortingOrderScreenVM(SettingScreenVM parent, PartySort sorter) { _settingScreen = parent; _sorter = sorter; _sortingOrder = new MBBindingList <SettingSortingOrderVM>(); Name = sorter.GetName(); InitializeList(); }
public new void OnFinalize() { base.OnFinalize(); SaveList(); PartyScreenConfig.Save(); _sortingOrder = null; _settingScreen = null; _sorter = null; }
public SettingSorterPaneVM(SettingScreenVM parent, string name, PartySort sorter, Action <PartySort> newSorterCallback) { _sorter = sorter; _parent = parent; _newSorterCallBack = newSorterCallback; PossibleSettingList = new MBBindingList <SettingSortVM>(); SettingList = new MBBindingList <SettingSortVM>(); Name = name; InitialiseSettingLists(); }
private PartySort GetFullPartySorter(int n) { if (n == _settingList.Count - 1) { return(_settingList[n].SortingComparer); } PartySort toReturn = _settingList[n].SortingComparer; toReturn.EqualSorter = GetFullPartySorter(n + 1); return(toReturn); }
public SettingSortVM(PartySort sortingComparer, Action <SettingSortVM, SettingSide> transferCallBack, SettingSide side, Action <SettingSortVM> openSubSetting) { SortingComparer = sortingComparer; SettingHint = new HintViewModel(new TextObject(SortingComparer.GetHintText())); _transferHint = new HintViewModel(new TextObject($"Click to transfer to the {side.GetOtherSide().ToString().ToLower()} side!")); AscDescHint = new HintViewModel(new TextObject($"Current Mode: {(IsDescending ? "Descending" : "Ascending")}")); IsTransferable = true; IsDescending = SortingComparer.Descending; _transferCallBack = transferCallBack; _openSubSetting = openSubSetting; _side = side; }
public void SortTroops() { var settings = PartyScreenConfig.ExtraSettings; try { SortAnyParty(_mainPartyList, _partyLogic.RightOwnerParty, _partyLogic.MemberRosters[_rightSide], settings.PartySorter); if (!Utilities.IsControlDown()) { SortAnyParty(_mainPartyPrisoners, null, _partyLogic.PrisonerRosters[_rightSide], settings.SeparateSortingProfiles ? settings.PrisonerSorter : settings.PartySorter); SortAnyParty(_partyVM.OtherPartyPrisoners, null, _partyLogic.PrisonerRosters[_leftSide], settings.SeparateSortingProfiles ? settings.PrisonerSorter : settings.PartySorter); if (_partyLogic.LeftOwnerParty?.MobileParty != null) { bool useGarrisonSorter = settings.SeparateSortingProfiles; PartySort sorterToUse = useGarrisonSorter ? settings.GarrisonAndAlliedPartySorter : settings.PartySorter; SortAnyParty(_partyVM.OtherPartyTroops, _partyLogic.LeftOwnerParty, _partyLogic.MemberRosters[_leftSide], sorterToUse); } } if (!_mainPartyList.IsEmpty() && (!_mainPartyList[0]?.Troop.Character?.IsPlayerCharacter ?? false)) { InformationManager.DisplayMessage(new InformationMessage( "Your player character is no longer at the top of the list due to sorting, do NOT save your game and notify the mod manager")); } } catch (Exception e) { Logging.Log(Logging.Levels.ERROR, $"Sorting: {e}"); Utilities.DisplayMessage($"PSE Sorting Unit Exception: {e}"); } }
private static void SortAnyParty(MBBindingList <PartyCharacterVM> toSort, PartyBase party, TroopRoster rosterToSort, PartySort sorter) { if (rosterToSort == null || rosterToSort.Count == 0 || toSort == null || toSort.IsEmpty()) { return; } CharacterObject leaderOfParty = party?.LeaderHero?.CharacterObject; // Sort the list, this is done for the visual unit cards to be properly positioned after the sort // This is not yet persisted to the actual roster, that is done after this. toSort.StableSort(sorter); // Sanity check to ensure the leader is *always* at the top of the party. if (leaderOfParty != null) { var index = toSort.FindIndex((character) => character.Character.Equals(leaderOfParty)); PartyCharacterVM leaderVm = toSort[index]; toSort.RemoveAt(index); toSort.Insert(0, leaderVm); } // Here we manually clear the roster while ignoring the party leader. // Don't use `rosterToSort.Clear()` as that seems to cause the party leader to get unset permanently afterward, which stops upgrades from working. rosterToSort.RemoveIf((item) => item.Character != leaderOfParty); // Re-add the correctly sorted troops to the roster. We need to do it in this janky way due to the fact that we can't easily sort // the underlying roster array. foreach (PartyCharacterVM character in toSort) { if (character.Character != leaderOfParty) { rosterToSort.AddToCounts( character.Troop.Character, character.Troop.Number, false, character.Troop.WoundedNumber, character.Troop.Xp); } } }
private void InitialiseSettingList() { for (PartySort currentSort = _sorter; currentSort != null; currentSort = currentSort.EqualSorter) { PartySort freshSorter; if (currentSort.HasCustomSettings()) { freshSorter = currentSort.GetType() .GetConstructor(new[] { typeof(PartySort), typeof(bool), typeof(List <string>) }) ?.Invoke(new object[] { null, currentSort.Descending, currentSort.CustomSettingsList }) as PartySort; } else { freshSorter = currentSort.GetType().GetConstructor(new[] { typeof(PartySort), typeof(bool) }) ?.Invoke(new object[] { null, currentSort.Descending }) as PartySort; } var settingSortVM = new SettingSortVM(freshSorter, TransferSorter, SettingSide.RIGHT, _parent.OpenSubSetting); _settingList.Add(settingSortVM); } }