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);
                }
            }
        }
Example #3
0
        //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();
        }
Example #4
0
 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");
     }
 }
Example #5
0
        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);
            }
        }
Example #6
0
 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>());
 }
Example #7
0
        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());
        }
Example #9
0
        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);
            }
        }
Example #11
0
        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;
        }
Example #12
0
        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;
            }
        }
Example #13
0
        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;
            }
        }
Example #18
0
        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);
                }
            }
        }
Example #19
0
        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);
        }
Example #21
0
        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);
            }
        }
Example #22
0
        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;
            }
        }
Example #23
0
 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)
 {
 }
Example #25
0
 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);
        }