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); }
public override int GetMinHeaderHeight(PawnTable table) { return(TopAreaHeight); }
public override void DoHeader(Rect rect, PawnTable table) { def.headerIconSize = new Vector2(Constants.HeaderIconSize, Constants.HeaderIconSize); base.DoHeader(rect, table); }
public override int GetMaxWidth(PawnTable table) { return(Width); }
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))); }
public override void DoCell(Rect rect, Pawn pawn, PawnTable table) { }
public override int GetMinHeaderHeight(PawnTable table) { return(Mathf.Max(base.GetMinHeaderHeight(table), TopAreaHeight)); }
public override int GetOptimalWidth(PawnTable table) { return(ManageRulesetButtonWidth); }
public override int GetMinWidth(PawnTable table) => Constants.MedicalCareSetterWidth;
public override int GetMinHeaderHeight(PawnTable table) { return(50); }
public override int GetMinWidth(PawnTable table) => def.width;
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);
//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)); }
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()); }
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); }
protected override void SetValue(Pawn pawn, bool value, PawnTable table) { pawn.GetTenantComponent().AutoRenew = value; }