public static void ValueEditor(String title, ref int increment, Func <int> get, Action <long> set, int min = 0, int max = int.MaxValue, float titleWidth = 500) { var value = get(); var inc = increment; UI.Label(title.cyan(), UI.Width(titleWidth)); UI.Space(25); float fieldWidth = GUI.skin.textField.CalcSize(new GUIContent(max.ToString())).x; UI.ActionButton(" < ", () => { set(Math.Max(value - inc, min)); }, UI.AutoWidth()); UI.Space(20); UI.Label($"{value}".orange().bold(), UI.AutoWidth());; UI.Space(20); UI.ActionButton(" > ", () => { set(Math.Min(value + inc, max)); }, UI.AutoWidth()); UI.Space(50); UI.ActionIntTextField(ref inc, title, (v) => { }, null, UI.Width(fieldWidth + 25)); increment = inc; }
public static void OnGUI(UnitEntityData ch, IEnumerable <BlueprintScriptableObject> blueprints, float indent = 0, float remainingWidth = 0, Func <String, String> titleFormater = null, NamedTypeFilter typeFilter = null ) { if (titleFormater == null) { titleFormater = (t) => t.orange().bold(); } int index = 0; if (needsLayout) { foreach (BlueprintScriptableObject blueprint in blueprints) { var actions = blueprint.GetActions(); if (actions.Any(a => a.isRepeatable)) { hasRepeatableAction = true; } int actionCount = actions.Sum(action => action.canPerform(blueprint, ch) ? 1 : 0); maxActions = Math.Max(actionCount, maxActions); } needsLayout = false; } if (hasRepeatableAction) { UI.BeginHorizontal(); UI.Space(553); UI.ActionIntTextField( ref repeatCount, "repeatCount", (limit) => { }, () => { }, UI.Width(160)); UI.Space(40); UI.Label("Parameter".cyan() + ": " + $"{repeatCount}".orange(), UI.ExpandWidth(false)); repeatCount = Math.Max(1, repeatCount); repeatCount = Math.Min(100, repeatCount); UI.EndHorizontal(); } UI.Div(indent); foreach (BlueprintScriptableObject blueprint in blueprints) { UI.BeginHorizontal(); UI.Space(indent); var actions = blueprint.GetActions().Where(action => action.canPerform(blueprint, ch)).ToArray(); var titles = actions.Select(a => a.name); var title = blueprint.name; if (titles.Contains("Remove")) { title = title.cyan().bold(); } else { title = titleFormater(title); } UI.Label(title, UI.Width(550 - indent)); int actionCount = actions != null?actions.Count() : 0; for (int ii = 0; ii < maxActions; ii++) { if (ii < actionCount) { BlueprintAction action = actions[ii]; // TODO -don't show increase or decrease actions until we redo actions into a proper value editor that gives us Add/Remove and numeric item with the ability to show values. For now users can edit ranks in the Facts Editor if (action.name == "<" || action.name == ">") { UI.Space(164); continue; } var actionName = action.name; float extraSpace = 0; if (action.isRepeatable) { actionName += (action.isRepeatable ? $" {repeatCount}" : ""); extraSpace = 20 * (float)Math.Ceiling(Math.Log10((double)repeatCount)); } UI.ActionButton(actionName, () => { action.action(blueprint, ch, repeatCount); }, UI.Width(160 + extraSpace)); UI.Space(10); } else { UI.Space(174); } } UI.Space(30); String typeString = blueprint.GetType().Name; if (typeFilter?.collator != null) { var collatorString = typeFilter.collator(blueprint); if (!typeString.Contains(collatorString)) { typeString += $" : {collatorString}".yellow(); } } Rect rect = GUILayoutUtility.GetLastRect(); var description = blueprint.GetDescription(); if (description != null && description.Length > 0) { description = $"\n{description.green()}"; } else { description = ""; } if (settings.showComponents && blueprint.ComponentsArray != null) { String componentStr = String.Join <object>(" ", blueprint.ComponentsArray).grey(); if (description.Length == 0) { description = componentStr; } else { description = componentStr + description; } } if (settings.showElements && blueprint.ElementsArray != null) { String elementsStr = String.Join <object>(" ", blueprint.ElementsArray).yellow(); if (description.Length == 0) { description = elementsStr; } else { description = elementsStr + "\n" + description; } } if (settings.showAssetIDs) { UI.Label(typeString.cyan()); GUILayout.TextField(blueprint.AssetGuid, UI.Width(450)); UI.EndHorizontal(); if (description.Length > 0) { UI.BeginHorizontal(); UI.Label("", UI.Width(rect.x)); UI.Label(blueprint.GetDescription().green()); //, UI.EndHorizontal(); } } else { float width = remainingWidth - rect.xMax; UI.Label(typeString.cyan() + " " + description, UI.Width(800)); //UI.Label($"{remainingWidth} - {rect.xMax} = {width}" + typeString + " " + description, UI.Width(800)); UI.EndHorizontal(); } #if false String description = blueprint.GetDescription(); if (description.Length > 0) { UI.BeginHorizontal(); UI.Space(684 + maxActions * 154); UI.Label($"{description.green()}"); UI.EndHorizontal(); } #endif UI.Div(indent); index++; } }
public static void OnGUI() { var player = Game.Instance.Player; var filterChoices = GetPartyFilterChoices(); if (filterChoices == null) { return; } charToAdd = null; charToRemove = null; var characterListFunc = UI.TypePicker <List <UnitEntityData> >( null, ref Main.settings.selectedPartyFilter, filterChoices ); var characterList = characterListFunc.func(); var mainChar = GameHelper.GetPlayerCharacter(); if (characterListFunc.name == "Nearby") { UI.Slider("Nearby Distance", ref nearbyRange, 1f, 200, 25, 0, " meters", UI.Width(250)); characterList = characterList.OrderBy((ch) => ch.DistanceTo(mainChar)).ToList(); } UI.Space(20); int chIndex = 0; respecableCount = 0; var selectedCharacter = GetSelectedCharacter(); bool isWide = Main.IsWide; foreach (UnitEntityData ch in characterList) { var classData = ch.Progression.Classes; // TODO - understand the difference between ch.Progression and ch.Descriptor.Progression UnitProgressionData progression = ch.Descriptor.Progression; BlueprintStatProgression xpTable = BlueprintRoot.Instance.Progression.XPTable; int level = progression.CharacterLevel; int mythicLevel = progression.MythicExperience; var spellbooks = ch.Spellbooks; var spellCount = spellbooks.Sum((sb) => sb.GetAllKnownSpells().Count()); using (UI.HorizontalScope()) { UI.Label(ch.CharacterName.orange().bold(), UI.Width(200)); UI.Space(25); float distance = mainChar.DistanceTo(ch);; UI.Label(distance < 1 ? "" : distance.ToString("0") + "m", UI.Width(75)); UI.Space(25); UI.Label("lvl".green() + $": {level}", UI.Width(75)); // Level up code adapted from Bag of Tricks https://www.nexusmods.com/pathfinderkingmaker/mods/2 if (player.AllCharacters.Contains(ch)) { if (progression.Experience < xpTable.GetBonus(level + 1) && level < 20) { UI.ActionButton("+1", () => { progression.AdvanceExperienceTo(xpTable.GetBonus(level + 1), true); }, UI.Width(70)); } else if (progression.Experience >= xpTable.GetBonus(level + 1) && level < 20) { UI.Label("LvUp".cyan().italic(), UI.Width(70)); } else { UI.Space(74); } } else { UI.Space(74); } UI.Space(25); UI.Label($"my".green() + $": {mythicLevel}", UI.Width(100)); if (player.AllCharacters.Contains(ch)) { if (progression.MythicExperience < 10) { UI.ActionButton("+1", () => { progression.AdvanceMythicExperience(progression.MythicExperience + 1, true); }, UI.Width(70)); } else { UI.Label("max".cyan(), UI.Width(70)); } } else { UI.Space(74); } UI.Space(35); if (!isWide) { ActionsGUI(ch); } UI.Wrap(!Main.IsWide, 303, 0); bool showClasses = ch == selectedCharacter && selectedToggle == ToggleChoice.Classes; if (UI.DisclosureToggle($"{classData.Count} Classes", ref showClasses)) { if (showClasses) { selectedCharacter = ch; selectedToggle = ToggleChoice.Classes; Logger.Log($"selected {ch.CharacterName}"); } else { selectedToggle = ToggleChoice.None; } } bool showStats = ch == selectedCharacter && selectedToggle == ToggleChoice.Stats; if (UI.DisclosureToggle("Stats", ref showStats, true, isWide ? 150 : 200)) { if (showStats) { selectedCharacter = ch; selectedToggle = ToggleChoice.Stats; } else { selectedToggle = ToggleChoice.None; } } UI.Wrap(Main.IsNarrow, 279); bool showFacts = ch == selectedCharacter && selectedToggle == ToggleChoice.Facts; if (UI.DisclosureToggle("Facts", ref showFacts, true, isWide ? 150 : 200)) { if (showFacts) { selectedCharacter = ch; selectedToggle = ToggleChoice.Facts; } else { selectedToggle = ToggleChoice.None; } } bool showBuffs = ch == selectedCharacter && selectedToggle == ToggleChoice.Buffs; if (UI.DisclosureToggle("Buffs", ref showBuffs, true, isWide ? 150 : 200)) { if (showBuffs) { selectedCharacter = ch; selectedToggle = ToggleChoice.Buffs; } else { selectedToggle = ToggleChoice.None; } } UI.Wrap(Main.IsNarrow, 304); bool showAbilities = ch == selectedCharacter && selectedToggle == ToggleChoice.Abilities; if (UI.DisclosureToggle("Abilities", ref showAbilities, true)) { if (showAbilities) { selectedCharacter = ch; selectedToggle = ToggleChoice.Abilities; } else { selectedToggle = ToggleChoice.None; } } UI.Space(25); if (spellCount > 0) { bool showSpells = ch == selectedCharacter && selectedToggle == ToggleChoice.Spells; if (UI.DisclosureToggle($"{spellCount} Spells", ref showSpells, true)) { if (showSpells) { selectedCharacter = ch; selectedToggle = ToggleChoice.Spells; } else { selectedToggle = ToggleChoice.None; } } } else { UI.Space(180); } if (isWide) { ActionsGUI(ch); } } if (!Main.IsWide) { UI.Div(20, 20); } if (selectedCharacter != spellbookEditCharacter) { editSpellbooks = false; spellbookEditCharacter = null; } if (selectedCharacter != multiclassEditCharacter) { editMultiClass = false; multiclassEditCharacter = null; } if (ch == selectedCharacter && selectedToggle == ToggleChoice.Classes) { #if DEBUG UI.Div(100, 20); using (UI.HorizontalScope()) { UI.Space(100); UI.Toggle("Multiple Classes On Level-Up", ref settings.toggleMulticlass, 0); if (settings.toggleMulticlass) { UI.Space(39); if (UI.DisclosureToggle("Config".orange().bold(), ref editMultiClass)) { multiclassEditCharacter = selectedCharacter; } UI.Space(25); UI.Label("Experimental Preview ".magenta() + "See 'Level Up + Multiclass' for more options".green()); } else { UI.Space(50); UI.Label("Experimental Preview ".magenta()); } } #endif UI.Div(100, 20); if (editMultiClass) { var multiclassSet = ch.GetMulticlassSet(); MulticlassPicker.OnGUI(multiclassSet); ch.SetMulticlassSet(multiclassSet); } else { var prog = ch.Descriptor.Progression; using (UI.HorizontalScope()) { UI.Space(100); UI.Label("Character Level".cyan(), UI.Width(250)); UI.ActionButton("<", () => prog.CharacterLevel = Math.Max(0, prog.CharacterLevel - 1), UI.AutoWidth()); UI.Space(25); UI.Label("level".green() + $": {prog.CharacterLevel}", UI.Width(100f)); UI.ActionButton(">", () => prog.CharacterLevel = Math.Min(20, prog.CharacterLevel + 1), UI.AutoWidth()); UI.Space(25); UI.ActionButton("Reset", () => ch.resetClassLevel(), UI.Width(125)); UI.Space(23); UI.Label("This directly changes your character level but will not change exp or adjust any features associated with your character. To do a normal level up use +1 Lvl above".green()); } UI.Div(0, 25); using (UI.HorizontalScope()) { UI.Space(100); UI.Label("Mythic Level".cyan(), UI.Width(250)); UI.ActionButton("<", () => prog.MythicLevel = Math.Max(0, prog.MythicLevel - 1), UI.AutoWidth()); UI.Space(25); UI.Label("my lvl".green() + $": {prog.MythicLevel}", UI.Width(100f)); UI.ActionButton(">", () => prog.MythicLevel = Math.Min(10, prog.MythicLevel + 1), UI.AutoWidth()); UI.Space(175); UI.Label("This directly changes your mythic level but will not adjust any features associated with your character. To do a normal mythic level up use +1 my above".green()); } foreach (var cd in classData) { UI.Div(100, 20); using (UI.HorizontalScope()) { UI.Space(100); UI.Label(cd.CharacterClass.Name.orange(), UI.Width(250)); UI.ActionButton("<", () => cd.Level = Math.Max(0, cd.Level - 1), UI.AutoWidth()); UI.Space(25); UI.Label("level".green() + $": {cd.Level}", UI.Width(100f)); var maxLevel = cd.CharacterClass.Progression.IsMythic ? 10 : 20; UI.ActionButton(">", () => cd.Level = Math.Min(maxLevel, cd.Level + 1), UI.AutoWidth()); UI.Space(175); UI.Label(cd.CharacterClass.Description.green(), UI.AutoWidth()); } } } } if (ch == selectedCharacter && selectedToggle == ToggleChoice.Stats) { UI.Div(100, 20, 755); var alignment = ch.Descriptor.Alignment.Value; using (UI.HorizontalScope()) { UI.Space(100); UI.Label("Alignment", UI.Width(425)); UI.Label($"{alignment.Name()}".color(alignment.Color()).bold(), UI.Width(1250f)); } using (UI.HorizontalScope()) { UI.Space(528); int alignmentIndex = Array.IndexOf(alignments, alignment); var titles = alignments.Select( a => a.Acronym().color(a.Color()).bold()).ToArray(); if (UI.SelectionGrid(ref alignmentIndex, titles, 3, UI.Width(250f))) { ch.Descriptor.Alignment.Set(alignments[alignmentIndex]); } } UI.Div(100, 20, 755); using (UI.HorizontalScope()) { UI.Space(100); UI.Label("Size", UI.Width(425)); var size = ch.Descriptor.State.Size; UI.Label($"{size}".orange().bold(), UI.Width(175)); } using (UI.HorizontalScope()) { UI.Space(528); UI.EnumGrid( () => ch.Descriptor.State.Size, (s) => ch.Descriptor.State.Size = s, 3, UI.Width(600)); } using (UI.HorizontalScope()) { UI.Space(528); UI.ActionButton("Reset", () => { ch.Descriptor.State.Size = ch.Descriptor.OriginalSize; }, UI.Width(197)); } UI.Div(100, 20, 755); foreach (StatType obj in Enum.GetValues(typeof(StatType))) { StatType statType = (StatType)obj; ModifiableValue modifiableValue = ch.Stats.GetStat(statType); if (modifiableValue != null) { String key = $"{ch.CharacterName}-{statType.ToString()}"; var storedValue = statEditorStorage.ContainsKey(key) ? statEditorStorage[key] : modifiableValue.BaseValue; var statName = statType.ToString(); if (statName == "BaseAttackBonus" || statName == "SkillAthletics") { UI.Div(100, 20, 755); } using (UI.HorizontalScope()) { UI.Space(100); UI.Label(statName, UI.Width(400f)); UI.Space(25); UI.ActionButton(" < ", () => { modifiableValue.BaseValue -= 1; storedValue = modifiableValue.BaseValue; }, UI.AutoWidth()); UI.Space(20); UI.Label($"{modifiableValue.BaseValue}".orange().bold(), UI.Width(50f)); UI.ActionButton(" > ", () => { modifiableValue.BaseValue += 1; storedValue = modifiableValue.BaseValue; }, UI.AutoWidth()); UI.Space(25); UI.ActionIntTextField(ref storedValue, statType.ToString(), (v) => { modifiableValue.BaseValue = v; }, null, UI.Width(75)); statEditorStorage[key] = storedValue; } } } } if (ch == selectedCharacter && selectedToggle == ToggleChoice.Facts) { FactsEditor.OnGUI(ch, ch.Progression.Features.Enumerable.ToList()); } if (ch == selectedCharacter && selectedToggle == ToggleChoice.Buffs) { FactsEditor.OnGUI(ch, ch.Descriptor.Buffs.Enumerable.ToList()); } if (ch == selectedCharacter && selectedToggle == ToggleChoice.Abilities) { FactsEditor.OnGUI(ch, ch.Descriptor.Abilities.Enumerable.ToList()); } if (ch == selectedCharacter && selectedToggle == ToggleChoice.Spells) { UI.Space(20); var names = spellbooks.Select((sb) => sb.Blueprint.GetDisplayName()).ToArray(); var titles = names.Select((name, i) => $"{name} ({spellbooks.ElementAt(i).CasterLevel})").ToArray(); if (spellbooks.Any()) { using (UI.HorizontalScope()) { UI.SelectionGrid(ref selectedSpellbook, titles, 7, UI.Width(1581)); if (selectedSpellbook > names.Count()) { selectedSpellbook = 0; } // UI.DisclosureToggle("Edit", ref editSpellbooks); } var spellbook = spellbooks.ElementAt(selectedSpellbook); if (editSpellbooks) { spellbookEditCharacter = ch; var blueprints = BlueprintExensions.GetBlueprints <BlueprintSpellbook>().OrderBy((bp) => bp.GetDisplayName()); BlueprintListUI.OnGUI(ch, blueprints, 100); } else { var maxLevel = spellbook.Blueprint.MaxSpellLevel; var casterLevel = spellbook.CasterLevel; using (UI.HorizontalScope()) { UI.EnumerablePicker <int>( "Spell Level".bold() + " (count)", ref selectedSpellbookLevel, Enumerable.Range(0, casterLevel + 1), 0, (lvl) => { var levelText = lvl <= casterLevel ? $"L{lvl}".bold() : $"L{lvl}".grey(); var knownCount = spellbook.GetKnownSpells(lvl).Count(); var countText = knownCount > 0 ? $" ({knownCount})".white() : ""; return(levelText + countText); }, UI.AutoWidth() ); if (casterLevel < maxLevel) { UI.ActionButton("+1 Caster Level", () => spellbook.AddBaseLevel()); } } FactsEditor.OnGUI(ch, spellbook, selectedSpellbookLevel); } } #if false else { spellbookEditCharacter = ch; editSpellbooks = true; var blueprints = BlueprintExensions.GetBlueprints <BlueprintSpellbook>().OrderBy((bp) => bp.GetDisplayName()); BlueprintListUI.OnGUI(ch, blueprints, 100); } #endif } if (selectedCharacter != GetSelectedCharacter()) { selectedCharacterIndex = characterList.IndexOf(selectedCharacter); } chIndex += 1; } UI.Space(25); if (respecableCount > 0) { UI.Label($"{respecableCount} characters".yellow().bold() + " can be respecced. Pressing Respec will close the mod window and take you to character level up".orange()); UI.Label("WARNING".yellow().bold() + " this feature is ".orange() + "EXPERIMENTAL".yellow().bold() + " and uses unreleased and likely buggy code.".orange()); UI.Label("BACK UP".yellow().bold() + " before playing with this feature.You will lose your mythic ranks but you can restore them in this Party Editor.".orange()); } UI.Space(25); if (charToAdd != null) { UnitEntityDataUtils.AddCompanion(charToAdd); } if (charToRemove != null) { UnitEntityDataUtils.RemoveCompanion(charToRemove); } }
static public void OnGUI <T>(String callerKey, UnitEntityData unit, List <T> facts, Func <T, BlueprintScriptableObject> blueprint, IEnumerable <BlueprintScriptableObject> blueprints, Func <T, String> title, Func <T, String> description = null, Func <T, int> value = null, IEnumerable <BlueprintAction> actions = null ) { bool searchChanged = false; if (actions == null) { actions = new List <BlueprintAction>(); } if (callerKey != prevCallerKey) { searchChanged = true; showAll = false; } prevCallerKey = callerKey; var mutatorLookup = actions.Distinct().ToDictionary(a => a.name, a => a); UI.BeginHorizontal(); UI.Space(100); UI.ActionTextField(ref searchText, "searhText", null, () => { searchChanged = true; }, UI.Width(320)); UI.Space(25); UI.Label("Limit", UI.ExpandWidth(false)); UI.ActionIntTextField(ref searchLimit, "searchLimit", null, () => { searchChanged = true; }, UI.Width(175)); if (searchLimit > 1000) { searchLimit = 1000; } UI.Space(25); UI.Toggle("Show GUIDs", ref Main.settings.showAssetIDs); UI.Space(25); UI.Toggle("Dividers", ref Main.settings.showDivisions); UI.Space(25); searchChanged |= UI.DisclosureToggle("Show All".orange().bold(), ref showAll); UI.EndHorizontal(); UI.BeginHorizontal(); UI.Space(100); UI.ActionButton("Search", () => { searchChanged = true; }, UI.AutoWidth()); UI.Space(25); if (matchCount > 0 && searchText.Length > 0) { String matchesText = "Matches: ".green().bold() + $"{matchCount}".orange().bold(); if (matchCount > searchLimit) { matchesText += " => ".cyan() + $"{searchLimit}".cyan().bold(); } UI.Label(matchesText, UI.ExpandWidth(false)); } #if false UI.Label("Repeat Count", UI.ExpandWidth(false)); UI.ActionIntTextField( ref repeatCount, "repeatCount", (limit) => { }, () => { }, UI.Width(200)); #endif UI.EndHorizontal(); if (showAll) { // TODO - do we need this logic or can we make blueprint filtering fast enough to do keys by key searching? //if (filteredBPs == null || searchChanged) { UpdateSearchResults(searchText, searchLimit, blueprints); //} BlueprintListUI.OnGUI(unit, filteredBPs, 100); return; } var terms = searchText.Split(' ').Select(s => s.ToLower()).ToHashSet(); BlueprintAction add = mutatorLookup.GetValueOrDefault("Add", null); BlueprintAction remove = mutatorLookup.GetValueOrDefault("Remove", null); BlueprintAction decrease = mutatorLookup.GetValueOrDefault("<", null); BlueprintAction increase = mutatorLookup.GetValueOrDefault(">", null); mutatorLookup.Remove("Add"); mutatorLookup.Remove("Remove"); mutatorLookup.Remove("<"); mutatorLookup.Remove(">"); BlueprintScriptableObject toAdd = null; BlueprintScriptableObject toRemove = null; BlueprintScriptableObject toIncrease = null; BlueprintScriptableObject toDecrease = null; var toValues = new Dictionary <String, BlueprintScriptableObject>(); var sorted = facts.OrderBy((f) => title(f)); matchCount = 0; UI.Div(100); foreach (var fact in sorted) { if (fact == null) { continue; } var bp = blueprint(fact); String name = title(fact); String nameLower = name.ToLower(); if (name != null && name.Length > 0 && (searchText.Length == 0 || terms.All(term => nameLower.Contains(term)))) { matchCount++; UI.BeginHorizontal(); UI.Space(100); UI.Label($"{name}".cyan().bold(), UI.Width(400)); UI.Space(30); if (value != null) { var v = value(fact); decrease.BlueprintActionButton(unit, bp, () => { toDecrease = bp; }, 50); UI.Space(10f); UI.Label($"{v}".orange().bold(), UI.Width(30)); increase.BlueprintActionButton(unit, bp, () => { toIncrease = bp; }, 50); } #if false UI.Space(30); add.BlueprintActionButton(unit, bp, () => { toAdd = bp; }, 150); #endif UI.Space(30); remove.BlueprintActionButton(unit, bp, () => { toRemove = bp; }, 150); #if false foreach (var action in actions) { action.MutatorButton(unit, bp, () => { toValues[action.name] = bp; }, 150); } #endif if (description != null) { UI.Space(30); var assetID = Main.settings.showAssetIDs ? blueprint(fact).AssetGuid.magenta() + " " : ""; UI.Label(assetID + description(fact).green(), UI.AutoWidth()); } UI.EndHorizontal(); UI.Div(100); } } if (toAdd != null) { add.action(toAdd, unit, repeatCount); toAdd = null; } if (toRemove != null) { remove.action(toRemove, unit, repeatCount); toRemove = null; } if (toDecrease != null) { decrease.action(toDecrease, unit, repeatCount); toDecrease = null; } if (toIncrease != null) { increase.action(toIncrease, unit, repeatCount); toIncrease = null; } foreach (var item in toValues) { var muator = mutatorLookup[item.Key]; if (muator != null) { muator.action(item.Value, unit, repeatCount); } } toValues.Clear(); }
public static IEnumerable OnGUI() { UI.ActionSelectionGrid(ref settings.selectedBPTypeFilter, blueprintTypeFilters.Select(tf => tf.name).ToArray(), 10, (selected) => { UpdateSearchResults(); }, UI.MinWidth(200)); UI.Space(10); UI.BeginHorizontal(); UI.ActionTextField( ref settings.searchText, "searhText", (text) => { }, () => { UpdateSearchResults(); }, UI.Width(400)); UI.Label("Limit", UI.ExpandWidth(false)); UI.ActionIntTextField( ref settings.searchLimit, "searchLimit", (limit) => { }, () => { UpdateSearchResults(); }, UI.Width(200)); if (settings.searchLimit > 1000) { settings.searchLimit = 1000; } UI.Space(25); UI.Toggle("Show GUIs", ref settings.showAssetIDs); UI.Space(25); UI.Toggle("Dividers", ref settings.showDivisions); UI.EndHorizontal(); UI.BeginHorizontal(); UI.ActionButton("Search", () => { UpdateSearchResults(); }, UI.AutoWidth()); UI.Space(25); if (firstSearch) { UI.Label("please note the first search may take a few seconds.".green(), UI.AutoWidth()); } else if (matchCount > 0) { String title = "Matches: ".green().bold() + $"{matchCount}".orange().bold(); if (matchCount > settings.searchLimit) { title += " => ".cyan() + $"{settings.searchLimit}".cyan().bold(); } if (collatedBPs != null) { foreach (var group in collatedBPs) { title += $" {group.Key} ({group.Count()})"; } } UI.Label(title, UI.ExpandWidth(false)); } UI.Space(50); UI.Label("".green(), UI.AutoWidth()); UI.EndHorizontal(); UI.Space(10); if (filteredBPs != null) { CharacterPicker.OnGUI(); UnitReference selected = CharacterPicker.GetSelectedCharacter(); BlueprintListUI.OnGUI(selected, filteredBPs, collatedBPs, 0, null, selectedTypeFilter); } UI.Space(25); return(null); }
public static IEnumerable OnGUI() { // Stackable browser using (UI.HorizontalScope(UI.Width(450))) { // First column - Type Selection Grid using (UI.VerticalScope(GUI.skin.box)) { UI.ActionSelectionGrid(ref settings.selectedBPTypeFilter, blueprintTypeFilters.Select(tf => tf.name).ToArray(), 1, (selected) => { UpdateSearchResults(); }, UI.buttonStyle, UI.Width(200)); } bool collationChanged = false; if (collatedBPs != null) { using (UI.VerticalScope(GUI.skin.box)) { UI.ActionSelectionGrid(ref selectedCollationIndex, collationKeys.ToArray(), 1, (selected) => { collationChanged = true; BlueprintListUI.needsLayout = true; }, UI.buttonStyle, UI.Width(200)); } } // Section Column - Main Area float remainingWidth = Main.ummWidth - 325; using (UI.VerticalScope(UI.Width(remainingWidth))) { // Search Field and modifiers using (UI.HorizontalScope()) { UI.ActionTextField( ref settings.searchText, "searhText", (text) => { }, () => { UpdateSearchResults(); }, UI.Width(400)); UI.Label("Limit", UI.ExpandWidth(false)); UI.ActionIntTextField( ref settings.searchLimit, "searchLimit", (limit) => { }, () => { UpdateSearchResults(); }, UI.Width(200)); if (settings.searchLimit > 1000) { settings.searchLimit = 1000; } UI.Space(25); UI.Toggle("Show GUIDs", ref settings.showAssetIDs); UI.Space(25); UI.Toggle("Components", ref settings.showComponents); UI.Space(25); UI.Toggle("Elements", ref settings.showElements); UI.Space(25); UI.Toggle("Dividers", ref settings.showDivisions); } // Search Button and Results Summary using (UI.HorizontalScope()) { UI.ActionButton("Search", () => { UpdateSearchResults(); }, UI.AutoWidth()); UI.Space(25); if (firstSearch) { UI.Label("please note the first search may take a few seconds.".green(), UI.AutoWidth()); } else if (matchCount > 0) { String title = "Matches: ".green().bold() + $"{matchCount}".orange().bold(); if (matchCount > settings.searchLimit) { title += " => ".cyan() + $"{settings.searchLimit}".cyan().bold(); } UI.Label(title, UI.ExpandWidth(false)); } UI.Space(50); UI.Label($"".green(), UI.AutoWidth()); } UI.Space(10); if (filteredBPs != null) { CharacterPicker.OnGUI(); UnitReference selected = CharacterPicker.GetSelectedCharacter(); var bps = filteredBPs; if (selectedCollationIndex == 0) { selectedCollatedBPs = null; } if (selectedCollationIndex > 0) { if (collationChanged) { var key = collationKeys.ElementAt(selectedCollationIndex); var selectedKey = collationKeys.ElementAt(selectedCollationIndex); foreach (var group in collatedBPs) { if (group.Key == selectedKey) { selectedCollatedBPs = group.Take(settings.searchLimit).ToArray(); } } BlueprintListUI.needsLayout = true; } bps = selectedCollatedBPs; } BlueprintListUI.OnGUI(selected, bps, 0, remainingWidth, null, selectedTypeFilter); } UI.Space(25); } } return(null); }