protected override void SetValue(Pawn pawn, bool value, PawnTable table)
 {
     pawn.GetTenantComponent().IsTerminated = value;
 }
 //slight issue with job strings. Meh.
 private static TextAnchor TranspilerHelper(PawnTable table) => table is PawnTable_NumbersMain ? TextAnchor.MiddleCenter : TextAnchor.MiddleLeft;
        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);
            }

            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);
                columns[i].Worker.DoHeader(rect, __instance);
                pos.x += colWidth;
            }
            Widgets.EndScrollView();
            ___scrollPosition.x = headerScrollPosition.x;

            // scrollview for label column - VERTICAL ONLY
            Widgets.BeginScrollView(labelOutRect, ref labelScrollPosition, labelViewRect, false);
            var labelRect = labelOutRect.AtZero();

            for (int j = 0; j < cachedPawns.Count; 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 (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;

            // And finally, draw the rest of the table - SCROLLS VERTICALLY AND HORIZONTALLY
            Widgets.BeginScrollView(tableOutRect, ref ___scrollPosition, tableViewRect);
            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.z, tableViewRect.width);
                    GUI.color = Color.white;
                    Rect rowRect = new Rect(0f, pos.z, tableViewRect.width, (int)cachedRowHeights[j]);
                    Widgets.DrawHighlightIfMouseover(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);
        }
        public override void DoCell(Rect rect, Pawn pawn, PawnTable table)
        {
            if (pawn.Dead || pawn.health?.hediffSet == null || !pawn.health.hediffSet.HasImmunizableNotImmuneHediff())
            {
                return;
            }

            HediffWithComps mostSevere = FindMostSevereHediff(pawn);

            if (mostSevere == null)
            {
                return;
            }

            float deltaSeverity = GetTextFor(mostSevere);

            GUI.color = GetPrettyColorFor(deltaSeverity);

            Rect rect2 = new Rect(rect.x, rect.y, rect.width, Mathf.Min(rect.height, 30f));

            Text.Font     = GameFont.Small;
            Text.Anchor   = TextAnchor.MiddleCenter;
            Text.WordWrap = false;
            Widgets.Label(rect2, GetTextFor(mostSevere).ToStringPercent());
            Text.WordWrap = true;
            Text.Anchor   = TextAnchor.UpperLeft;
            string tip = GetTip(pawn, mostSevere);

            if (!tip.NullOrEmpty())
            {
                TooltipHandler.TipRegion(rect2, tip);
            }

            float severityChangePerDayFromImmu = (float)AccessTools.Method(typeof(HediffComp_Immunizable), "SeverityChangePerDay")
                                                 .Invoke(mostSevere.TryGetComp <HediffComp_Immunizable>(), null);

            float severityChangePerDayFromTendD = 0f;

            if (mostSevere.TryGetComp <HediffComp_TendDuration>()?.IsTended ?? false)
            {
                severityChangePerDayFromTendD =
                    mostSevere.TryGetComp <HediffComp_TendDuration>().TProps.severityPerDayTended *
                    mostSevere.TryGetComp <HediffComp_TendDuration>().tendQuality;
            }

            float immunityPerDay = 0f;

            ImmunityRecord immunityRecord = pawn.health.immunity.GetImmunityRecord(mostSevere.def);

            if (immunityRecord != null)
            {
                immunityPerDay = immunityRecord.ImmunityChangePerTick(pawn, true, mostSevere) * GenDate.TicksPerDay;
            }

            GUI.color = Color.white;

            bool redFlag = !(severityChangePerDayFromTendD + severityChangePerDayFromImmu > immunityPerDay);

            Texture2D texture2D = redFlag ? StaticConstructorOnGameStart.SortingIcon : StaticConstructorOnGameStart.SortingDescendingIcon;

            GUI.color = redFlag ? HealthUtility.GoodConditionColor : HealthUtility.DarkRedColor;
            Rect position2 = new Rect(rect.xMax - texture2D.width - 1f, rect.yMax - texture2D.height - 1f, texture2D.width, texture2D.height);

            GUI.DrawTexture(position2, texture2D);
            GUI.color = Color.white;
        }
 public override int GetMinWidth(PawnTable table)
 => base.GetMinWidth(table) + 20;
 public override int GetMinWidth(PawnTable table)
 => Mathf.Max(base.GetMinWidth(table), 200);
 public override void DoCell(Rect rect, Pawn pawn, PawnTable table)
 {
     MedicalCareUtility.MedicalCareSetter(rect, ref pawn.playerSettings.medCare);
 }
 public override int GetMinWidth(PawnTable table)
 {
     return(70);
 }
Beispiel #9
0
 public override int GetMinHeaderHeight(PawnTable table)
 {
     return(TopAreaHeight);
 }
Beispiel #10
0
 public override void DoHeader(Rect rect, PawnTable table)
 {
     def.headerIconSize = new Vector2(Constants.HeaderIconSize, Constants.HeaderIconSize);
     base.DoHeader(rect, table);
 }
Beispiel #11
0
 public override int GetMaxWidth(PawnTable table)
 {
     return(Width);
 }
Beispiel #12
0
 public override int GetMinWidth(PawnTable table) => 80;
 public override int GetMinHeaderHeight(PawnTable table) => Mathf.CeilToInt(Text.CalcSize(Numbers_Utility.WordWrapAt(def.LabelCap, GetMinWidth(table))).y); //not messy at all.
 public override int GetMinWidth(PawnTable table) => Mathf.Max(50, Mathf.CeilToInt(Text.CalcSize(Numbers_Utility.WordWrapAt(def.LabelCap, 150)).x));
 public override int GetOptimalWidth(PawnTable table)
 {
     return(Mathf.Clamp(273, GetMinWidth(table), GetMaxWidth(table)));
 }
Beispiel #16
0
 public override void DoCell(Rect rect, Pawn pawn, PawnTable table)
 {
 }
 public override int GetMinHeaderHeight(PawnTable table)
 {
     return(Mathf.Max(base.GetMinHeaderHeight(table), TopAreaHeight));
 }
Beispiel #18
0
 public override int GetOptimalWidth(PawnTable table)
 {
     return(ManageRulesetButtonWidth);
 }
 public override int GetMinWidth(PawnTable table) => Constants.MedicalCareSetterWidth;
Beispiel #20
0
 public override int GetMinHeaderHeight(PawnTable table)
 {
     return(50);
 }
 public override int GetMinWidth(PawnTable table)
 => def.width;
Beispiel #22
0
 public override int GetMaxWidth(PawnTable table)
 {
     return(Mathf.Min(base.GetMaxWidth(table), 80));
 }
 public override int GetMinHeaderHeight(PawnTable table)
 => Mathf.CeilToInt(Text.CalcSize(def.LabelCap.RawText.WordWrapAt(GetMinWidth(table))).y);
Beispiel #24
0
        //private bool IsIncapableOfWholeWorkType(Pawn p, WorkTypeDef work)
        //{
        //    for (int i = 0; i < work.workGiversByPriority.Count; i++)
        //    {
        //        bool flag = true;
        //        for (int j = 0; j < work.workGiversByPriority[i].requiredCapacities.Count; j++)
        //        {
        //            PawnCapacityDef capacity = work.workGiversByPriority[i].requiredCapacities[j];
        //            if (!p.health.capacities.CapableOf(capacity))
        //            {
        //                flag = false;
        //                break;
        //            }
        //        }
        //        if (flag)
        //        {
        //            return false;
        //        }
        //    }
        //    return true;
        //}

        protected override Rect GetInteractableHeaderRect(Rect headerRect, PawnTable table)
        {
            return(GetLabelRect(headerRect));
        }
Beispiel #25
0
 protected override string GetHeaderTip(PawnTable table) => base.GetHeaderTip(table) + "\n\n" + "Numbers_ColumnHeader_Tooltip".Translate();
 protected override string GetHeaderTip(PawnTable table)
 {
     return(base.GetHeaderTip(table) + "\n" + "AllowedAreaShiftClickTip".Translate());
 }
Beispiel #27
0
        private static bool RightClickToRemoveHeader(PawnColumnWorker __instance, Rect headerRect, PawnTable table)
        {
            if (Event.current.shift)
            {
                return(true);
            }

            if (!(table is PawnTable_NumbersMain numbersTable))
            {
                return(true);
            }

            if (!Mouse.IsOver(headerRect))
            {
                return(true);
            }

            if (Event.current.button != 1)
            {
                return(true);
            }

            numbersTable.ColumnsListForReading.RemoveAll(x => ReferenceEquals(__instance, x.Worker));

            if (Find.WindowStack.currentlyDrawnWindow is MainTabWindow_Numbers numbers)
            {
                numbers.RefreshAndStoreSessionInWorldComp();
            }

            return(false);
        }
 public override int GetMinWidth(PawnTable table)
 {
     return(Mathf.Max(base.GetMinWidth(table), 200));
 }
 public override int GetMinWidth(PawnTable table)
 {
     return(base.GetMinWidth(table) + 30);
 }
Beispiel #30
0
 protected override void SetValue(Pawn pawn, bool value, PawnTable table)
 {
     pawn.GetTenantComponent().AutoRenew = value;
 }