private void DrawThingRowModded(ref float y, float width, Apparel apparel) { if (apparel == null) { DrawThingRowVanilla(ref y, width, null); return; } var rect = new Rect(0f, y, width, ThingRowHeight); if (Mouse.IsOver(rect)) { GUI.color = HighlightColor; GUI.DrawTexture(rect, TexUI.HighlightTex); } GUI.color = ThingLabelColor; // LMB doubleclick if (Widgets.ButtonInvisible(rect)) { // Left Mouse Button Menu if (Event.current.button == 0) { Find.WindowStack.Add(new Window_Pawn_ApparelDetail(SelPawn, apparel)); } // RMB menu if (Event.current.button == 1) { var floatOptionList = new List <FloatMenuOption> { new FloatMenuOption( "ThingInfo".Translate(), delegate { Find.WindowStack.Add(new Dialog_InfoCard(apparel)); }) }; if (CanControl) { floatOptionList.Add( new FloatMenuOption( "OutfitterComparer".Translate(), delegate { Find.WindowStack.Add( new Dialog_PawnApparelComparer(SelPawnForGear, apparel)); })); void DropApparel() { SoundDefOf.Tick_High.PlayOneShotOnCamera(); InterfaceDrop(apparel); } void DropApparelHaul() { SoundDefOf.Tick_High.PlayOneShotOnCamera(); InterfaceDropHaul(apparel); } floatOptionList.Add(new FloatMenuOption("DropThing".Translate(), DropApparel)); floatOptionList.Add(new FloatMenuOption("DropThingHaul".Translate(), DropApparelHaul)); } var window = new FloatMenu(floatOptionList, string.Empty); Find.WindowStack.Add(window); } } if (apparel.def.DrawMatSingle != null && apparel.def.DrawMatSingle.mainTexture != null) { Widgets.ThingIcon(new Rect(4f, y + 5f, ThingIconSize, ThingIconSize), apparel); } Text.Anchor = TextAnchor.MiddleLeft; GUI.color = ThingLabelColor; var textRect = new Rect(ThingLeftX, y, width - ThingLeftX, ThingRowHeight - Text.LineHeight); var scoreRect = new Rect(ThingLeftX, textRect.yMax, width - ThingLeftX, Text.LineHeight); var conf = SelPawn.GetApparelStatCache(); var text = apparel.LabelCap; var textScore = Math.Round(conf.ApparelScoreRaw(apparel), 2).ToString("N2"); if (SelPawn.outfits != null && SelPawn.outfits.forcedHandler.IsForced(apparel)) { text = text + ", " + "ApparelForcedLower".Translate(); Widgets.Label(textRect, text); } else { GUI.color = new Color(0.75f, 0.75f, 0.75f); if (apparel.def.useHitPoints) { var x = apparel.HitPoints / (float)apparel.MaxHitPoints; if (x < 0.5f) { GUI.color = Color.yellow; } if (x < 0.2f) { GUI.color = Color.red; } } Widgets.Label(textRect, text); GUI.color = Color.white; Widgets.Label(scoreRect, textScore); } y += ThingRowHeight; }
protected override void FillTab() { // main canvas Rect canvas = new Rect(0f, 0f, size.x, size.y).ContractedBy(20f); GUI.BeginGroup(canvas); Vector2 cur = Vector2.zero; // header Rect tempHeaderRect = new Rect(cur.x, cur.y, canvas.width, 30f); cur.y += 30f; Text.Anchor = TextAnchor.LowerLeft; Widgets.Label(tempHeaderRect, "PreferedTemperature".Translate()); Text.Anchor = TextAnchor.UpperLeft; // line GUI.color = Color.grey; Widgets.DrawLineHorizontal(cur.x, cur.y, canvas.width); GUI.color = Color.white; // some padding cur.y += 10f; // temperature slider ApparelStatCache pawnStatCache = SelPawn.GetApparelStatCache(); FloatRange targetTemps = pawnStatCache.TargetTemperatures; FloatRange minMaxTemps = ApparelStatsHelper.MinMaxTemperatureRange; Rect sliderRect = new Rect(cur.x, cur.y, canvas.width - 20f, 40f); Rect tempResetRect = new Rect(sliderRect.xMax + 4f, cur.y + 10f, 16f, 16f); cur.y += 60f; // includes padding // current temperature settings GUI.color = pawnStatCache.targetTemperaturesOverride ? Color.white : Color.grey; Widgets_FloatRange.FloatRange(sliderRect, 123123123, ref targetTemps, minMaxTemps, ToStringStyle.Temperature); GUI.color = Color.white; if (Math.Abs(targetTemps.min - SelPawn.GetApparelStatCache().TargetTemperatures.min) > 1e-4 || Math.Abs(targetTemps.max - SelPawn.GetApparelStatCache().TargetTemperatures.max) > 1e-4) { SelPawn.GetApparelStatCache().TargetTemperatures = targetTemps; } if (pawnStatCache.targetTemperaturesOverride) { if (Widgets.ImageButton(tempResetRect, resetButton)) { pawnStatCache.targetTemperaturesOverride = false; pawnStatCache.UpdateTemperatureIfNecessary(true); } TooltipHandler.TipRegion(tempResetRect, "TemperatureRangeReset".Translate()); } // header Rect statsHeaderRect = new Rect(cur.x, cur.y, canvas.width, 30f); cur.y += 30f; Text.Anchor = TextAnchor.LowerLeft; Text.Font = GameFont.Small; Widgets.Label(statsHeaderRect, "PreferredStats".Translate()); Text.Anchor = TextAnchor.UpperLeft; // add button Rect addStatRect = new Rect(statsHeaderRect.xMax - 16f, statsHeaderRect.yMin + 10f, 16f, 16f); if (Widgets.ImageButton(addStatRect, addButton)) { List <FloatMenuOption> options = new List <FloatMenuOption>(); foreach (StatDef def in SelPawn.NotYetAssignedStatDefs()) { options.Add(new FloatMenuOption(def.LabelCap, delegate { SelPawn.GetApparelStatCache() .StatCache.Insert(0, new ApparelStatCache.StatPriority(def, 0f, StatAssignment.Manual)); })); } Find.WindowStack.Add(new FloatMenu(options)); } TooltipHandler.TipRegion(addStatRect, "StatPriorityAdd".Translate()); // line GUI.color = Color.grey; Widgets.DrawLineHorizontal(cur.x, cur.y, canvas.width); GUI.color = Color.white; // some padding cur.y += 10f; // main content in scrolling view Rect contentRect = new Rect(cur.x, cur.y, canvas.width, canvas.height - cur.y); Rect viewRect = contentRect; viewRect.height = SelPawn.GetApparelStatCache().StatCache.Count * 30f + 10f; if (viewRect.height > contentRect.height) { viewRect.width -= 20f; } Widgets.BeginScrollView(contentRect, ref _scrollPosition, viewRect); GUI.BeginGroup(viewRect); cur = Vector2.zero; // none label if (!SelPawn.GetApparelStatCache().StatCache.Any()) { Rect noneLabel = new Rect(cur.x, cur.y, viewRect.width, 30f); GUI.color = Color.grey; Text.Anchor = TextAnchor.MiddleCenter; Widgets.Label(noneLabel, "None".Translate()); Text.Anchor = TextAnchor.UpperLeft; GUI.color = Color.white; cur.y += 30f; } else { // legend kind of thingy. Rect legendRect = new Rect(cur.x + (viewRect.width - 24) / 2, cur.y, (viewRect.width - 24) / 2, 20f); Text.Font = GameFont.Tiny; GUI.color = Color.grey; Text.Anchor = TextAnchor.LowerLeft; Widgets.Label(legendRect, "-10"); Text.Anchor = TextAnchor.LowerRight; Widgets.Label(legendRect, "10"); Text.Anchor = TextAnchor.UpperLeft; Text.Font = GameFont.Small; GUI.color = Color.white; cur.y += 15f; // stat weight sliders foreach (ApparelStatCache.StatPriority stat in SelPawn.GetApparelStatCache().StatCache) { bool stop_UI; ApparelStatCache.DrawStatRow(ref cur, viewRect.width, stat, SelPawn, out stop_UI); if (stop_UI) { // DrawStatRow can change the StatCache, invalidating the loop. So if it does that, stop looping - we'll redraw on the next tick. break; } } } GUI.EndGroup(); Widgets.EndScrollView(); GUI.EndGroup(); }