public override int GetMinHeaderHeight(PawnTable table)
 => Mathf.CeilToInt(Text.CalcSize(Numbers_Utility.WordWrapAt(def.LabelCap.RawText, GetMinWidth(table))).y);
        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 override int GetMinWidth(PawnTable table)
 => Mathf.Max(minWidthBasedOnNarrowestColumnThatColumnBeingMass,
              Mathf.CeilToInt(Text.CalcSize(Numbers_Utility.WordWrapAt(def.LabelCap, maxWidthBasedOnColumnsWithALongAssNameLikeThisInt)).x))
 + margin;
 public override int GetMinWidth(PawnTable table) => Mathf.Max(50, Mathf.CeilToInt(Text.CalcSize(Numbers_Utility.WordWrapAt(def.LabelCap, 150)).x));