static IEnumerable <PawnColumnDef> ImpliedPawnColumnDefsForMechs() { PawnTableDef workTable = WTH_DefOf.WTH_Work_Mechanoids; bool moveWorkTypeLabelDown = false; List <WorkTypeDef> allowed = new List <WorkTypeDef>(); //TODO: Store this somewhere global. allowed.Add(WorkTypeDefOf.Hauling); allowed.Add(WorkTypeDefOf.Growing); allowed.Add(WTH_DefOf.Cleaning); allowed.Add(WTH_DefOf.PlantCutting); foreach (WorkTypeDef def in (from d in WorkTypeDefsUtility.WorkTypeDefsInPriorityOrder where d.visible && allowed.Contains(d) select d).Reverse <WorkTypeDef>()) { moveWorkTypeLabelDown = !moveWorkTypeLabelDown; PawnColumnDef d2 = new PawnColumnDef(); d2.defName = "WorkPriority_" + def.defName; d2.workType = def; d2.moveWorkTypeLabelDown = moveWorkTypeLabelDown; d2.workerClass = typeof(PawnColumnWorker_WorkPriority); d2.sortable = true; d2.modContentPack = def.modContentPack; workTable.columns.Insert(workTable.columns.FindIndex((PawnColumnDef x) => x.Worker is PawnColumnWorker_CopyPasteWorkPriorities) + 1, d2); yield return(d2); } }
private IEnumerable <PawnColumnDef> GenerateImpliedDefs() { PawnTableDef workTable = DefDatabase <PawnTableDef> .GetNamed("MD3_DroidWork"); bool moveWorkTypeLabelDown2 = false; using (IEnumerator <WorkTypeDef> enumerator2 = (from d in WorkTypeDefsUtility.WorkTypeDefsInPriorityOrder where d.visible select d).Reverse().GetEnumerator()) { while (enumerator2.MoveNext()) { WorkTypeDef def = enumerator2.Current; moveWorkTypeLabelDown2 = !moveWorkTypeLabelDown2; PawnColumnDef d2 = new PawnColumnDef { defName = "DroidWorkPriority_" + def.defName, workType = def, moveWorkTypeLabelDown = moveWorkTypeLabelDown2, workerClass = typeof(PawnColumnWorker_DroidWorkPriority), sortable = true, modContentPack = def.modContentPack }; workTable.columns.Insert(workTable.columns.FindIndex((PawnColumnDef x) => x.Worker is PawnColumnWorker_CopyPasteWorkPriorities) + 1, d2); yield return(d2); } } }
//ctor to populate lists. public MainTabWindow_Numbers() { optionsMaker = new OptionsMaker(this); MethodInfo statsToDraw = typeof(StatsReportUtility).GetMethod("StatsToDraw", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.InvokeMethod, null, new[] { typeof(Thing) }, null); Pawn tmpPawn = PawnGenerator.GeneratePawn(PawnKindDefOf.AncientSoldier, Faction.OfPlayerSilentFail); if (statsToDraw != null) { pawnHumanlikeStatDef = ((IEnumerable <StatDrawEntry>)statsToDraw.Invoke(null, new[] { tmpPawn })) .Concat(tmpPawn.def.SpecialDisplayStats(StatRequest.For(tmpPawn))) .Where(s => s.stat != null && s.ShouldDisplay && s.stat.Worker != null) .Select(s => s.stat) .OrderBy(stat => stat.LabelCap); tmpPawn.Destroy(); tmpPawn = PawnGenerator.GeneratePawn(PawnKindDefOf.Thrumbo); pawnAnimalNeedDef = tmpPawn.needs.AllNeeds.Where(x => x.def.showOnNeedList).Select(x => x.def); pawnAnimalStatDef = ((IEnumerable <StatDrawEntry>)statsToDraw.Invoke(null, new[] { tmpPawn })) .Where(s => s.stat != null && s.ShouldDisplay && s.stat.Worker != null) .Select(s => s.stat) .OrderBy(stat => stat.LabelCap); Corpse corpse = (Corpse)ThingMaker.MakeThing(tmpPawn.RaceProps.corpseDef); corpse.InnerPawn = tmpPawn; corpseStatDef = ((IEnumerable <StatDrawEntry>)statsToDraw.Invoke(null, new[] { corpse })) .Concat(tmpPawn.def.SpecialDisplayStats(StatRequest.For(tmpPawn))) .Where(s => s.stat != null && s.ShouldDisplay && s.stat.Worker != null) .Select(s => s.stat) .OrderBy(stat => stat.LabelCap); tmpPawn.Destroy(); } else { Log.Error("ReflectionTypeLoadException in Numbers: statsToDraw was null. Please contact mod author."); } pawnHumanlikeNeedDef = DefDatabase <NeedDef> .AllDefsListForReading; PawnTableDef defaultTable = WorldComponent_Numbers.PrimaryFilter.First().Key; if (Find.World.GetComponent <WorldComponent_Numbers>().sessionTable.TryGetValue(defaultTable, out List <PawnColumnDef> list)) { pawnTableDef.columns = list; } UpdateFilter(); }
private static void Prefix(PawnTable __instance, ref bool __state, PawnTableDef ___def) { __state = (bool)dirtyField.GetValue(__instance) && ___def == PawnTableDefOf.Work; if (__state) { Logger.Debug("ColumnWidths dirty"); } }
private static void AddTrainablesToAnimalTable() { PawnTableDef animalsTable = NumbersDefOf.Numbers_Animals; foreach (PawnColumnDef item in DefDatabase <PawnColumnDef> .AllDefsListForReading.Where(x => x.Worker is PawnColumnWorker_Trainable)) { animalsTable.columns.Insert(animalsTable.columns.FindIndex(x => x.Worker is PawnColumnWorker_Checkbox) - 1, item); } }
public static DefModExtension_PawnTableDefs Ext(this PawnTableDef def) { if (!def.HasModExtension <DefModExtension_PawnTableDefs>()) { Log.Error("Numbers expected DefModExtension PawnTableDef, got null"); return(null); } return(def.GetModExtension <DefModExtension_PawnTableDefs>()); }
public static DefModExtension_PawnTableDefs Ext(this PawnTableDef def) { var ext = def.GetModExtension <DefModExtension_PawnTableDefs>(); if (ext == null) { Log.Error($"Numbers expected DefModExtension PawnTableDef, got null for def {def.defName}"); } return(ext); }
private static string TurnPawnTableColumnsIntoCommaDelimitedString(PawnTableDef table) { StringBuilder stringBuilder = new StringBuilder(); foreach (var item in table.columns) { stringBuilder.Append(item.defName); stringBuilder.Append(','); } return(stringBuilder.ToString()); }
public static void Prefix(object __instance, PawnTableDef ___def) { int idx = ___def.columns.FindIndex(x => x.workType == supressedDef); if (idx >= 0) { for (int i = idx + 1; i < ___def.columns.Count; i++) { ___def.columns[i].moveWorkTypeLabelDown = !___def.columns[i].moveWorkTypeLabelDown; } ___def.columns.RemoveAt(idx); } }
public static void CreateTable_Postfix(PawnTable __result) { PawnTableDef def = (PawnTableDef)PawnTableDefInfo.GetValue(__result); int idx = def.columns.FindIndex(x => x.workType == supressedDef); if (idx >= 0) { for (int i = idx + 1; i < def.columns.Count; i++) { def.columns[i].moveWorkTypeLabelDown = !def.columns[i].moveWorkTypeLabelDown; } def.columns.RemoveAt(idx); } }
public override void DoWindowContents(Rect inRect) { int num = ((int)inRect.height - 90) / 3; PawnTableDef pawnTableDef = new PawnTableDef(); pawnTableDef.columns = new List <PawnColumnDef> { singleColumn }; pawnTableDef.minWidth = 0; if (pawnTableMin == null) { pawnTableMin = new PawnTable(pawnTableDef, () => Pawns, 0, 0); pawnTableMin.SetMinMaxSize(Mathf.Min(singleColumn.Worker.GetMinWidth(pawnTableMin) + 16, (int)inRect.width), Mathf.Min(singleColumn.Worker.GetMinWidth(pawnTableMin) + 16, (int)inRect.width), 0, num); } if (pawnTableOptimal == null) { pawnTableOptimal = new PawnTable(pawnTableDef, () => Pawns, 0, 0); pawnTableOptimal.SetMinMaxSize(Mathf.Min(singleColumn.Worker.GetOptimalWidth(pawnTableOptimal) + 16, (int)inRect.width), Mathf.Min(singleColumn.Worker.GetOptimalWidth(pawnTableOptimal) + 16, (int)inRect.width), 0, num); } if (pawnTableMax == null) { pawnTableMax = new PawnTable(pawnTableDef, () => Pawns, 0, 0); pawnTableMax.SetMinMaxSize(Mathf.Min(singleColumn.Worker.GetMaxWidth(pawnTableMax) + 16, (int)inRect.width), Mathf.Min(singleColumn.Worker.GetMaxWidth(pawnTableMax) + 16, (int)inRect.width), 0, num); } int num2 = 0; Text.Font = GameFont.Small; GUI.color = Color.gray; Widgets.Label(new Rect(0f, num2, inRect.width, 30f), "Min size"); GUI.color = Color.white; num2 += 30; pawnTableMin.PawnTableOnGUI(new Vector2(0f, num2)); num2 += num; GUI.color = Color.gray; Widgets.Label(new Rect(0f, num2, inRect.width, 30f), "Optimal size"); GUI.color = Color.white; num2 += 30; pawnTableOptimal.PawnTableOnGUI(new Vector2(0f, num2)); num2 += num; GUI.color = Color.gray; Widgets.Label(new Rect(0f, num2, inRect.width, 30f), "Max size"); GUI.color = Color.white; num2 += 30; pawnTableMax.PawnTableOnGUI(new Vector2(0f, num2)); num2 += num; }
public static void Prefix(PawnTableDef ___def) { if (acted) { return; } int idx = ___def.columns.FindIndex(x => x.workType == supressedDef); if (idx >= 0) { for (int i = idx + 1; i < ___def.columns.Count; i++) { ___def.columns[i].moveWorkTypeLabelDown = !___def.columns[i].moveWorkTypeLabelDown; } ___def.columns.RemoveAt(idx); acted = true; } }
public override void FinalizeInit() { base.FinalizeInit(); primaryFilter = PrimaryFilter.First(); if (!sessionTable.Any()) { List <string> storedPawnTables = LoadedModManager.GetMod <Numbers>().GetSettings <Numbers_Settings>().storedPawnTableDefs; foreach (string item in storedPawnTables) { if (item.Split(',')[1] == "Default" && sessionTable.All(x => x.Key.defName != item.Split(',')[0])) { PawnTableDef pawnTableDef = HorribleStringParsersForSaving.TurnCommaDelimitedStringIntoPawnTableDef(item); sessionTable.Add(pawnTableDef, pawnTableDef.columns); } } } NotifySettingsChanged(); }
static StaticConstructorOnGameStart() { //add trainables to animal table PawnTableDef animalsTable = NumbersDefOf.Numbers_Animals; foreach (PawnColumnDef item in DefDatabase <PawnColumnDef> .AllDefsListForReading.Where(x => x.Worker is PawnColumnWorker_Trainable)) { animalsTable.columns.Insert(animalsTable.columns.FindIndex(x => x.Worker is PawnColumnWorker_Checkbox) - 1, item); } //add remaining space to my PTDefs IEnumerable <PawnTableDef> allPawntableDefs = DefDatabase <PawnTableDef> .AllDefsListForReading.Where(x => x.HasModExtension <DefModExtension_PawnTableDefs>()); PawnColumnDef remainingspace = DefDatabase <PawnColumnDef> .AllDefsListForReading.First(x => x.Worker is PawnColumnWorker_RemainingSpace); IEnumerable <PawnTableDef> ptsDfromPtDses = allPawntableDefs as PawnTableDef[] ?? allPawntableDefs.ToArray(); foreach (PawnTableDef PTSDfromPTDs in ptsDfromPtDses) { PTSDfromPTDs.columns.Insert(PTSDfromPTDs.columns.Count, remainingspace); } foreach (PawnColumnDef pawnColumnDef in DefDatabase <PawnColumnDef> .AllDefsListForReading.Where(x => !x.generated && x.defName.StartsWith("Numbers_") && !(x.Worker is PawnColumnWorker_AllHediffs || x.Worker is PawnColumnWorker_SelfTend))) //special treatment for those. { pawnColumnDef.headerTip += (pawnColumnDef.headerTip.NullOrEmpty() ? "" : "\n\n") + "Numbers_ColumnHeader_Tooltip".Translate(); } foreach (PawnColumnDef pcd in DefDatabase <PawnTableDef> .GetNamed("Numbers_CombatPreset").columns) { combatPreset.Add(pcd); } foreach (PawnColumnDef pcd in DefDatabase <PawnTableDef> .GetNamed("Numbers_WorkTabPlusPreset").columns) { workTabPlusPreset.Add(pcd); } foreach (PawnColumnDef pcd in DefDatabase <PawnTableDef> .GetNamed("Numbers_ColonistNeedsPreset").columns) { colonistNeedsPreset.Add(pcd); } }
public void PawnSelectOptionsMaker() { List <FloatMenuOption> list = new List <FloatMenuOption>(); foreach (KeyValuePair <PawnTableDef, Func <Pawn, bool> > filter in WorldComponent_Numbers.PrimaryFilter) { void Action() { if (filter.Value != filterValidator.First()) { pawnTableDef = filter.Key; UpdateFilter(); Notify_ResolutionChanged(); } } list.Add(new FloatMenuOption(filter.Key.label, Action)); } Find.WindowStack.Add(new FloatMenu(list)); }
//ctor to populate lists. public MainTabWindow_Numbers() { optionsMaker = new OptionsMaker(this); StatsToDraw = typeof(StatsReportUtility).GetMethod("StatsToDraw", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.InvokeMethod, null, new[] { typeof(Thing) }, null); if (StatsToDraw == null) { Log.Error("ReflectionTypeLoadException in Numbers: statsToDraw was null. Please contact mod author."); } if (pawnHumanlikeNeedDef == null) { pawnHumanlikeNeedDef = GetHumanLikeNeedDef(); } if (pawnHumanlikeStatDef == null) { pawnHumanlikeStatDef = GetHumanLikeStatDefs(); } if (pawnAnimalNeedDef == null || pawnAnimalStatDef == null || corpseStatDef == null) { var statDefs = PopulateLists(); pawnAnimalStatDef = statDefs.pawnAnimalStatDef; pawnAnimalNeedDef = statDefs.pawnAnimalNeedDef; corpseStatDef = statDefs.corpseStatDef; } PawnTableDef defaultTable = WorldComponent_Numbers.PrimaryFilter.First().Key; if (Find.World.GetComponent <WorldComponent_Numbers>().sessionTable.TryGetValue(defaultTable, out List <PawnColumnDef> list)) { pawnTableDef.columns = list; } UpdateFilter(); }
static void Postfix(PawnTableDef def, ref Func <IEnumerable <Pawn> > ___pawnsGetter) { if (def != PawnTableDefOf.Work) { return; } Func <IEnumerable <Pawn> > oldPawns = ___pawnsGetter; try { ___pawnsGetter = () => { try { List <Pawn> newPawns = new List <Pawn>(); foreach (Pawn pawn in oldPawns()) { YouDoYou_MapComponent ydy = pawn.Map.GetComponent <YouDoYou_MapComponent>(); string pawnKey = pawn.GetUniqueLoadID(); if (ydy != null && ydy.pawnFree != null && ydy.pawnFree.ContainsKey(pawnKey) && ydy.pawnFree[pawnKey]) { continue; } newPawns.Add(pawn); } return(newPawns); } catch { Logger.Message("You Do You could not remove free pawns from work tab - likely due to a mod conflict"); return(oldPawns()); } }; Logger.Message("You Do You sucessfully patched the work tab"); } catch { Logger.Message("You Do You failed to patch the work tab"); ___pawnsGetter = oldPawns; } }
public override void DefsLoaded() { //bool defaultNoMountedHunting = AssemblyExists("CombatExtended"); //Log.Message("Combat extended loaded: " + defaultNoMountedHunting); minAutoMountDistance = Settings.GetHandle <int>("minAutoMountDistance", "GU_RR_MinAutoMountDistance_Title".Translate(), "GU_RR_MinAutoMountDistance_Description".Translate(), 16, Validators.IntRangeValidator(0, 500)); noMountedHunting = Settings.GetHandle <bool>("noMountedHunting", "GU_RR_NoMountedHunting_Title".Translate(), "GU_RR_NoMountedHunting_Description".Translate(), false); minAutoMountDistanceFromAnimal = Settings.GetHandle <int>("minAutoMountDistanceFromAnimal", "GU_RR_MinAutoMountDistanceFromAnimal_Title".Translate(), "GU_RR_MinAutoMountDistanceFromAnimal_Description".Translate(), 12, Validators.IntRangeValidator(0, 500)); PawnTableDef animalsTable = PawnTableDefOf.Animals; foreach (PawnColumnDef def in from td in DefDatabase <PawnColumnDef> .AllDefsListForReading orderby td.index descending select td) { if (def.defName == "MountableByMaster" || def.defName == "MountableByAnyone") { animalsTable.columns.Add(def); } } }
static void ImpliedPawnColumnDefsForMechs() { PawnTableDef workTable = WTH_DefOf.WTH_Work_Mechanoids; bool moveWorkTypeLabelDown = false; foreach (WorkTypeDef def in (from d in WorkTypeDefsUtility.WorkTypeDefsInPriorityOrder where d.visible && allowedMechWork.Contains(d) select d).Reverse <WorkTypeDef>()) { moveWorkTypeLabelDown = !moveWorkTypeLabelDown; PawnColumnDef d2 = new PawnColumnDef(); d2.defName = "WorkPriority_" + def.defName; d2.workType = def; d2.moveWorkTypeLabelDown = moveWorkTypeLabelDown; d2.workerClass = typeof(PawnColumnWorker_WorkPriority); d2.sortable = true; d2.modContentPack = def.modContentPack; workTable.columns.Insert(workTable.columns.FindIndex((PawnColumnDef x) => x.Worker is PawnColumnWorker_CopyPasteWorkPriorities) + 1, d2); } }
public static PawnTableDef TurnCommaDelimitedStringIntoPawnTableDef(string ptd) { string[] pawnTableDef = ptd.Split(','); PawnTableDef reconstructedPCD = DefDatabase <PawnTableDef> .GetNamedSilentFail(pawnTableDef[0]); if (reconstructedPCD != null) { reconstructedPCD.columns.Clear(); for (int i = 2; i < pawnTableDef.Length; i++) { PawnColumnDef pcd = DefDatabase <PawnColumnDef> .GetNamedSilentFail(pawnTableDef[i]); if (pcd != null) { reconstructedPCD.columns.Add(pcd); } } return(reconstructedPCD); } return(WorldComponent_Numbers.PrimaryFilter.First().Key); }
public static void PawnTableOnGUI(Vector2 position, PawnTableDef ___def, List <float> ___cachedColumnWidths, Vector2 ___cachedSize, float ___cachedHeaderHeight, float ___cachedHeightNoScrollbar) { if (___def == PawnTableDefOf.Assign) { Rect outRect = new Rect((int)position.x, (int)position.y + (int)___cachedHeaderHeight, (int)___cachedSize.x, (int)___cachedSize.y - (int)___cachedHeaderHeight); Rect viewRect = new Rect(0f, 0f, outRect.width - 16f, (int)___cachedHeightNoScrollbar - (int)___cachedHeaderHeight); var createGroupRect = new Rect(viewRect.x + 10, (outRect.y + outRect.height + 5), Textures.CreateGroupIcon.width, Textures.CreateGroupIcon.height); if (Mouse.IsOver(createGroupRect)) { GUI.DrawTexture(createGroupRect, Textures.CreateGroupIconHover); } else { GUI.DrawTexture(createGroupRect, Textures.CreateGroupIcon); } TooltipHandler.TipRegion(createGroupRect, Strings.CreateGroupTooltip); TacticalColonistBar.HandleGroupingClicks(createGroupRect); Rect optionsGearRect = new Rect(createGroupRect.x + createGroupRect.width + 10f, createGroupRect.y + 5, Textures.OptionsGear.width, Textures.OptionsGear.height); if (Mouse.IsOver(optionsGearRect)) { GUI.DrawTexture(optionsGearRect, Textures.OptionsGearHover); if (Event.current.type == EventType.MouseDown && Event.current.button == 0) { TieredFloatMenu floatMenu = new OptionsMenu(null, null, optionsGearRect, Textures.OptionsMenu); Find.WindowStack.Add(floatMenu); floatMenu.windowRect.y = UI.screenHeight - (floatMenu.windowRect.height + 100); } } else { GUI.DrawTexture(optionsGearRect, Textures.OptionsGear); } TooltipHandler.TipRegion(optionsGearRect, Strings.OptionsGearTooltip); } }
public static void Postfix() { var moveLabelDown = false; PawnTableDef medicalTable = PawnTableDefOf.Medical; foreach (PawnCapacityDef capacity in DefDatabase <PawnCapacityDef> .AllDefsListForReading) { var column = new PawnColumnDef_Capacity(); column.defName = "PawnColumnDef_" + capacity.defName; column.capacity = capacity; column.description = capacity.description; column.label = capacity.label; column.moveLabelDown = moveLabelDown; column.sortable = true; column.workerClass = typeof(PawnColumnWorker_Capacity); column.PostLoad(); DefDatabase <PawnColumnDef> .Add(column); medicalTable.columns.Insert(medicalTable.columns.Count - 1, column); moveLabelDown = !moveLabelDown; } }
public PawnTable_LevelMain(PawnTableDef def, Func <IEnumerable <Pawn> > pawnsGetter, int uiWidth, int uiHeight) : base(def, pawnsGetter, uiWidth, uiHeight) { }
public PawnTable_Prisoners(PawnTableDef def, Func <IEnumerable <Pawn> > pawnsGetter, int uiWidth, int uiHeight) : base(def, pawnsGetter, uiWidth, uiHeight) { }
public PawnTable_NumbersMain(PawnTableDef def, Func <IEnumerable <Pawn> > pawnsGetter, int uiWidth, int uiHeight) : base(def, pawnsGetter, uiWidth, uiHeight) { PawnTableDef = def; this.SetMinMaxSize(def.minWidth, uiWidth, 0, (int)(uiHeight * Numbers_Settings.maxHeight)); }
public static string TurnPawnTableDefIntoCommaDelimitedString(PawnTableDef table) { return(string.Join(",", new string[] { table.defName, table.label, TurnPawnTableColumnsIntoCommaDelimitedString(table) })); }
private void PresetOptionsMaker() { List <FloatMenuOption> list = new List <FloatMenuOption>(); void Save() { string name = "NumbersTable"; //not actually saved like this, just the easiest way to pass it around PawnTableDef ptdPawnTableDef = new PawnTableDef { columns = PawnTableDef.columns, modContentPack = PawnTableDef.modContentPack, workerClass = PawnTableDef.workerClass, defName = PawnTableDef.defName, label = name + Rand.Range(0, 10000), }; Find.WindowStack.Add(new Dialog_IHaveToCreateAnEntireFuckingDialogForAGODDAMNOKAYBUTTONFFS(ref ptdPawnTableDef)); } list.Add(new FloatMenuOption("Numbers_SaveCurrentLayout".Translate(), Save)); void Load() { List <FloatMenuOption> loadOptions = new List <FloatMenuOption>(); foreach (string tableDefToBe in settings.storedPawnTableDefs) { void ApplySetting() { PawnTableDef ptD = HorribleStringParsersForSaving.TurnCommaDelimitedStringIntoPawnTableDef(tableDefToBe); pawnTableDef = DefDatabase <PawnTableDef> .GetNamed(ptD.defName); pawnTableDef.columns = ptD.columns; this.UpdateFilter(); RefreshAndStoreSessionInWorldComp(); } string label = tableDefToBe.Split(',')[1] == "Default" ? tableDefToBe.Split(',')[0].Split('_')[1] + " (" + tableDefToBe.Split(',')[1] + ")" : tableDefToBe.Split(',')[1]; loadOptions.Add(new FloatMenuOption(label, ApplySetting)); } if (loadOptions.NullOrEmpty()) { loadOptions.Add(new FloatMenuOption("Numbers_NothingSaved".Translate(), null)); } Find.WindowStack.Add(new FloatMenu(loadOptions)); } list.Add(new FloatMenuOption("Numbers_LoadSavedLayout".Translate(), Load)); void MakeThisMedical() { this.pawnTableDef = NumbersDefOf.Numbers_MainTable; PawnTableDef.columns = new List <PawnColumnDef> { DefDatabase <PawnColumnDef> .GetNamed("Label"), DefDatabase <PawnColumnDef> .GetNamed("MedicalCare"), DefDatabase <PawnColumnDef> .GetNamed("Numbers_SelfTend"), DefDatabase <PawnColumnDef> .GetNamed("Numbers_HediffList"), DefDatabase <PawnColumnDef> .GetNamed("Numbers_RimWorld_StatDef_MedicalSurgerySuccessChance"), DefDatabase <PawnColumnDef> .GetNamed("Numbers_RimWorld_StatDef_MedicalTendQuality"), DefDatabase <PawnColumnDef> .GetNamed("Numbers_RimWorld_StatDef_MedicalTendSpeed"), DefDatabase <PawnColumnDef> .GetNamed("Numbers_Bleedrate"), DefDatabase <PawnColumnDef> .GetNamed("Numbers_Pain"), }; PawnTableDef.columns.AddRange(DefDatabase <PawnColumnDef> .AllDefsListForReading //.Where(pcd => pcd.workerClass == typeof(PawnColumnWorker_WorkPriority)) //disabled for Fluffy Compat. .Where(pcd => pcd.workType != null) .Where(x => x.workType.defName == "Patient" || x.workType.defName == "Doctor" || x.workType.defName == "PatientBedRest").Reverse()); foreach (PawnCapacityDef defCurrent in DefDatabase <PawnCapacityDef> .AllDefsListForReading) { PawnColumnDef pcd = DefDatabase <PawnColumnDef> .GetNamed("Numbers_" + defCurrent.GetType().ToString().Replace('.', '_') + "_" + defCurrent.defName); PawnTableDef.columns.Add(pcd); } PawnTableDef.columns.RemoveAll(x => x.defName == "Numbers_Verse_PawnCapacityDef_Metabolism"); //I need space PawnTableDef.columns.Add(DefDatabase <PawnColumnDef> .GetNamed("Numbers_NeedsTreatment")); PawnTableDef.columns.Add(DefDatabase <PawnColumnDef> .GetNamed("Numbers_Operations")); PawnTableDef.columns.Add(DefDatabase <PawnColumnDef> .GetNamed("Numbers_DiseaseProgress")); PawnTableDef.columns.Add(DefDatabase <PawnColumnDef> .GetNamed("RemainingSpace")); this.UpdateFilter(); Notify_ResolutionChanged(); } list.Add(new FloatMenuOption("Numbers_Presets.Load".Translate("Numbers_Presets.Medical".Translate()), MakeThisMedical)); void MakeThisCombat() { this.pawnTableDef = NumbersDefOf.Numbers_MainTable; PawnTableDef.columns = new List <PawnColumnDef>(); PawnTableDef.columns.AddRange(StaticConstructorOnGameStart.combatPreset); this.UpdateFilter(); Notify_ResolutionChanged(); } list.Add(new FloatMenuOption("Numbers_Presets.Load".Translate("Numbers_Presets.Combat".Translate()), MakeThisCombat)); void MakeThisWorkTabPlus() { this.pawnTableDef = NumbersDefOf.Numbers_MainTable; PawnTableDef.columns = new List <PawnColumnDef>(); PawnTableDef.columns.AddRange(StaticConstructorOnGameStart.workTabPlusPreset); this.UpdateFilter(); Notify_ResolutionChanged(); } list.Add(new FloatMenuOption("Numbers_Presets.Load".Translate("Numbers_Presets.WorkTabPlus".Translate()), MakeThisWorkTabPlus)); void MakeThisColonistNeeds() { this.pawnTableDef = NumbersDefOf.Numbers_MainTable; PawnTableDef.columns = new List <PawnColumnDef>(); PawnTableDef.columns.AddRange(StaticConstructorOnGameStart.colonistNeedsPreset); this.UpdateFilter(); Notify_ResolutionChanged(); } list.Add(new FloatMenuOption("Numbers_Presets.Load".Translate("Numbers_Presets.ColonistNeeds".Translate()), MakeThisColonistNeeds)); void setAsDefault() { string pawnTableDeftoSave = HorribleStringParsersForSaving.TurnPawnTableDefIntoCommaDelimitedString(PawnTableDef, true); settings.StoreNewPawnTableDef(pawnTableDeftoSave); } list.Add(new FloatMenuOption("Numbers_SetAsDefault".Translate(), setAsDefault, extraPartWidth: 29f, extraPartOnGUI: (Rect rect) => Numbers_Utility.InfoCardButton(rect.x + 5f, rect.y + (rect.height - 24f) / 2, "Numbers_SetAsDefaultExplanation".Translate(PawnTableDef.LabelCap)))); void loadDefault() { bool foundSomething = false; foreach (string tableDefToBe in settings.storedPawnTableDefs) { string[] ptdToBe = tableDefToBe.Split(','); if (ptdToBe[1] == "Default" && PawnTableDef.defName == ptdToBe[0]) { foundSomething = true; PawnTableDef ptD = HorribleStringParsersForSaving.TurnCommaDelimitedStringIntoPawnTableDef(tableDefToBe); pawnTableDef = DefDatabase <PawnTableDef> .GetNamed(ptD.defName); pawnTableDef.columns = ptD.columns; this.UpdateFilter(); RefreshAndStoreSessionInWorldComp(); break; //there's only one default anyway. } } if (!foundSomething) { Messages.Message("Numbers_NoDefaultStoredForThisView".Translate(), MessageTypeDefOf.RejectInput); } } list.Add(new FloatMenuOption("Numbers_LoadDefault".Translate(), loadDefault)); Find.WindowStack.Add(new FloatMenu(list)); }
public static string TurnPawnTableDefIntoCommaDelimitedString(PawnTableDef table, bool asDefault = false) { string label = asDefault ? "Default" : table.label; return(string.Join(",", new string[] { table.defName, label, TurnPawnTableColumnsIntoCommaDelimitedString(table) })); }
public Dialog_IHaveToCreateAnEntireFuckingDialogForAGODDAMNOKAYBUTTONFFS(ref PawnTableDef pawnTableDef) { this.pawnTableDef = pawnTableDef; curName = pawnTableDef.label; }
public static bool Prefix(PawnTable __instance, Vector2 position, PawnTableDef ___def, ref Vector2 ___scrollPosition) //harmony 1.2.0.1 gives access to private fields by ___name. { if (___def != PawnTableDefOf.Work) // only apply our changes on the work tab. { return(true); } if (Event.current.type == EventType.Layout) { return(false); } _hoveredRowLabel = -1; RecacheIfDirtyMethod.Invoke(__instance, null); // get fields var cachedSize = __instance.Size; var columns = __instance.ColumnsListForReading; var cachedColumnWidths = cachedColumnWidthsField.GetValue(__instance) as List <float>; var cachedHeaderHeight = __instance.HeaderHeight; var cachedHeightNoScrollbar = __instance.HeightNoScrollbar; var headerScrollPosition = new Vector2(___scrollPosition.x, 0f); var labelScrollPosition = new Vector2(0f, ___scrollPosition.y); var cachedPawns = __instance.PawnsListForReading; var cachedRowHeights = cachedRowHeightsField.GetValue(__instance) as List <float>; var standardWindowMargin = (float)standardMarginField.GetRawConstantValue(); // this is the main change, vanilla hardcodes both outRect and viewRect to the cached size. // Instead, we want to limit outRect to the available view area, so a horizontal scrollbar can appear. var labelWidth = cachedColumnWidths[0]; var labelCol = columns[0]; var outWidth = Mathf.Min(cachedSize.x - labelWidth, UI.screenWidth - standardWindowMargin * 2f); var viewWidth = cachedSize.x - labelWidth - 16f; Rect labelHeaderRect = new Rect( position.x, position.y, labelWidth, cachedHeaderHeight); Rect headerOutRect = new Rect( position.x + labelWidth, position.y, outWidth, cachedHeaderHeight); Rect headerViewRect = new Rect( 0f, 0f, viewWidth, cachedHeaderHeight); Rect labelOutRect = new Rect( position.x, position.y + cachedHeaderHeight, labelWidth, cachedSize.y - cachedHeaderHeight); Rect labelViewRect = new Rect( 0f, 0f, labelWidth, cachedHeightNoScrollbar - cachedHeaderHeight); Rect tableOutRect = new Rect( position.x + labelWidth, position.y + cachedHeaderHeight, outWidth, cachedSize.y - cachedHeaderHeight); Rect tableViewRect = new Rect( 0f, 0f, viewWidth, cachedHeightNoScrollbar - cachedHeaderHeight); // increase height of table to accomodate scrollbar if necessary and possible. if (viewWidth > outWidth && (cachedSize.y + 16f) < UI.screenHeight) { // NOTE: this is probably optimistic about the available height, but it appears to be what vanilla uses. tableOutRect.height += 16f; } // we need to add a scroll area to the column headers to make sure they stay in sync with the rest of the table, but the first (labels) column should be frozen. labelCol.Worker.DoHeader(labelHeaderRect, __instance); // scroll area for the rest of the columns - HORIZONTAL ONLY var pos = IntVec3.Zero; Widgets.BeginScrollView(headerOutRect, ref headerScrollPosition, headerViewRect, false); for (int i = 1; i < columns.Count; i++) { int colWidth; if (i == columns.Count - 1) { colWidth = (int)(viewWidth - pos.x); } else { colWidth = (int)cachedColumnWidths[i]; } Rect rect = new Rect(pos.x, 0f, colWidth, (int)cachedHeaderHeight); // column highlight sync if (Mouse.IsOver(rect)) { _hoveredColumnLabel = i; } if (_hoveredColumnContent == i) { Widgets.DrawHighlight(rect); } columns[i].Worker.DoHeader(rect, __instance); pos.x += colWidth; } _hoveredColumnContent = -1; Widgets.EndScrollView(); ___scrollPosition.x = headerScrollPosition.x; // scrollview for label column - VERTICAL ONLY if (_hoveredColumnLabel == 0) { Widgets.DrawHighlight(labelOutRect); } Widgets.BeginScrollView(labelOutRect, ref labelScrollPosition, labelViewRect, false); var labelRect = labelOutRect.AtZero(); for (int j = 0; j < cachedPawns.Count; j++) { labelRect.height = (int)cachedRowHeights[j]; // only draw if on screen if (tableViewRect.height <= tableOutRect.height || (float)labelRect.y - ___scrollPosition.y + (int)cachedRowHeights[j] >= 0f && (float)labelRect.y - ___scrollPosition.y <= tableOutRect.height) { GUI.color = new Color(1f, 1f, 1f, 0.2f); Widgets.DrawLineHorizontal(0f, pos.z, tableViewRect.width); GUI.color = Color.white; labelCol.Worker.DoCell(labelRect, cachedPawns[j], __instance); if (_hoveredRowContent == j) { Widgets.DrawHighlight(labelRect); } if (Mouse.IsOver(labelRect)) { _hoveredRowLabel = j; } if (cachedPawns[j].Downed) { GUI.color = new Color(1f, 0f, 0f, 0.5f); Widgets.DrawLineHorizontal(0f, labelRect.center.y, labelWidth); GUI.color = Color.white; } } labelRect.y += (int)cachedRowHeights[j]; } Widgets.EndScrollView(); ___scrollPosition.y = labelScrollPosition.y; _hoveredRowContent = -1; // And finally, draw the rest of the table - SCROLLS VERTICALLY AND HORIZONTALLY Widgets.BeginScrollView(tableOutRect, ref ___scrollPosition, tableViewRect); pos.x = 0; for (int k = 1; k < columns.Count; k++) { int columnWidth; if (k == columns.Count - 1) { columnWidth = (int)(viewWidth - pos.x); } else { columnWidth = (int)cachedColumnWidths[k]; } Rect column = new Rect(pos.x, pos.y, columnWidth, (int)tableOutRect.height); if (Mouse.IsOver(column)) { Widgets.DrawHighlight(column); _hoveredColumnContent = k; } if (_hoveredColumnLabel == k) { Widgets.DrawHighlight(column); } pos.x += columnWidth; } _hoveredColumnLabel = -1; for (int j = 0; j < cachedPawns.Count; j++) { pos.x = 0; // only draw if on screen if (tableViewRect.height <= tableOutRect.height || (float)pos.y - ___scrollPosition.y + (int)cachedRowHeights[j] >= 0f && (float)pos.y - ___scrollPosition.y <= tableOutRect.height) { GUI.color = new Color(1f, 1f, 1f, 0.2f); Widgets.DrawLineHorizontal(0f, pos.y, tableViewRect.width); GUI.color = Color.white; Rect rowRect = new Rect(0f, pos.y, tableViewRect.width, (int)cachedRowHeights[j]); // synchronize row highlights if (Mouse.IsOver(rowRect)) { Widgets.DrawHighlight(rowRect); _hoveredRowContent = j; } else if (_hoveredRowLabel == j) { Widgets.DrawHighlight(rowRect); } for (int k = 1; k < columns.Count; k++) { int cellWidth; if (k == columns.Count - 1) { cellWidth = (int)(viewWidth - pos.x); } else { cellWidth = (int)cachedColumnWidths[k]; } Rect rect3 = new Rect(pos.x, pos.y, cellWidth, (int)cachedRowHeights[j]); columns[k].Worker.DoCell(rect3, cachedPawns[j], __instance); pos.x += cellWidth; } if (cachedPawns[j].Downed) { GUI.color = new Color(1f, 0f, 0f, 0.5f); Widgets.DrawLineHorizontal(0f, rowRect.center.y, tableViewRect.width); GUI.color = Color.white; } } pos.y += (int)cachedRowHeights[j]; } Widgets.EndScrollView(); return(false); }