Ejemplo n.º 1
0
        public override void DoWindowContents(Rect rect)
        {
            base.DoWindowContents(rect);

            if (IsDirty)
            {
                BuildPawnList();
            }
            var position = new Rect(0f, 0f, rect.width, 80f);

            GUI.BeginGroup(position);

            var x = 0f;

            Text.Font = GameFont.Small;

            // prisoner / colonist / Animal toggle
            var sourceButton = new Rect(0f, 0f, 200f, 35f);

            if (Widgets.ButtonText(sourceButton, Source.ToString().Translate()))
            {
                List <FloatMenuOption> options = new List <FloatMenuOption>();
                if (Source != SourceOptions.Colonists)
                {
                    options.Add(new FloatMenuOption("Colonists".Translate(), delegate {
                        Source  = SourceOptions.Colonists;
                        IsDirty = true;
                    }));
                }

                if (Source != SourceOptions.Prisoners)
                {
                    options.Add(new FloatMenuOption("Prisoners".Translate(), delegate {
                        Source  = SourceOptions.Prisoners;
                        IsDirty = true;
                    }));
                }

                if (Source != SourceOptions.Animals)
                {
                    options.Add(new FloatMenuOption("Animals".Translate(), delegate {
                        Source  = SourceOptions.Animals;
                        IsDirty = true;
                    }));
                }

                Find.WindowStack.Add(new FloatMenu(options));
            }

            // name
            var nameLabel = new Rect(x, 50f, 165f, 30f);

            Text.Anchor = TextAnchor.LowerCenter;
            Widgets.Label(nameLabel, "FluffyMedical.Name".Translate());
            if (Widgets.ButtonInvisible(nameLabel))
            {
                if (OrderBy == Order.Name)
                {
                    Asc = !Asc;
                }
                else
                {
                    OrderBy = Order.Name;
                    Asc     = true;
                }
                IsDirty = true;
            }
            TooltipHandler.TipRegion(nameLabel, "FluffyMedical.ClickToSortBy".Translate("FluffyMedical.Name".Translate()));
            Widgets.DrawHighlightIfMouseover(nameLabel);
            x += 165f;

            // care
            var careLabel = new Rect(x, 50f, 100f, 30f);

            Widgets.Label(careLabel, "FluffyMedical.Care".Translate());
            if (Widgets.ButtonInvisible(careLabel))
            {
                if (Event.current.shift)
                {
                    Utility_Medical.MedicalCareSetterAll(pawns);
                }
                else
                {
                    if (OrderBy == Order.Care)
                    {
                        Asc = !Asc;
                    }
                    else
                    {
                        OrderBy = Order.Care;
                        Asc     = true;
                    }
                    IsDirty = true;
                }
            }
            TooltipHandler.TipRegion(careLabel,
                                     "FluffyMedical.ClickToSortBy".Translate("FluffyMedical.Care".Translate()) + "\n" + "FluffyMedical.ShiftClickTo".Translate("FluffyMedical.SetCare".Translate()));
            Widgets.DrawHighlightIfMouseover(careLabel);
            x += 100f;

            // bloodloss
            var bloodLabel = new Rect(x, 50f, 50f, 30f);
            var bloodIcon  = new Rect(x + 17f, 60f, 16f, 16f);

            GUI.DrawTexture(bloodIcon, Utility_Medical.BloodTextureWhite);
            if (Widgets.ButtonInvisible(bloodLabel))
            {
                if (OrderBy == Order.BleedRate)
                {
                    Asc = !Asc;
                }
                else
                {
                    OrderBy = Order.BleedRate;
                    Asc     = true;
                }
                IsDirty = true;
            }
            TooltipHandler.TipRegion(bloodLabel, "FluffyMedical.ClickToSortBy".Translate("BleedingRate".Translate()));
            Widgets.DrawHighlightIfMouseover(bloodLabel);
            x += 50f;

            // Operations
            var opLabel = new Rect(x, 50f, 50f, 30f);
            var opIcon  = new Rect(x + 17f, 60f, 16f, 16f);

            GUI.DrawTexture(opIcon, Utility_Medical.OpTexture);
            if (Widgets.ButtonInvisible(opLabel))
            {
                if (OrderBy == Order.Operations)
                {
                    Asc = !Asc;
                }
                else
                {
                    OrderBy = Order.Operations;
                    Asc     = true;
                }
                IsDirty = true;
            }
            TooltipHandler.TipRegion(opLabel, "FluffyMedical.ClickToSortBy".Translate("FluffyMedical.CurrentOperations".Translate()));
            Widgets.DrawHighlightIfMouseover(opLabel);
            x += 50f;

            // extra 15f offset for... what? makes labels roughly align.
            var colWidth = (rect.width - x - 15f) / (CapDefs.Count + 1);
            var offset   = true;

            // Pain
            var painLabel = new Rect(x - colWidth / 2, 10f + (offset ? 10f : 40f), colWidth * 2, 30f);

            Widgets.DrawLine(new Vector2(x + colWidth - colWidth / 2, 40f + (offset ? 5f : 35f)),
                             new Vector2(x + colWidth - colWidth / 2, 80f), Color.gray, 1);
            Widgets.Label(painLabel, "PainLevel".Translate());
            if (Widgets.ButtonInvisible(painLabel))
            {
                if (OrderBy == Order.Pain)
                {
                    Asc = !Asc;
                }
                else
                {
                    OrderBy = Order.Pain;
                    Asc     = true;
                }
                IsDirty = true;
            }
            TooltipHandler.TipRegion(painLabel, "FluffyMedical.ClickToSortBy".Translate("PainLevel".Translate()));
            Widgets.DrawHighlightIfMouseover(painLabel);
            offset = !offset;
            x     += colWidth;

            // Efficiency
            foreach (PawnCapacityDef capDef in CapDefs)
            {
                var defLabel = new Rect(x - colWidth / 2, 10f + (offset ? 10f : 40f), colWidth * 2, 30f);
                Widgets.DrawLine(new Vector2(x + colWidth - colWidth / 2, 40f + (offset ? 5f : 35f)),
                                 new Vector2(x + colWidth - colWidth / 2, 80f), Color.gray, 1);
                Widgets.Label(defLabel, capDef.LabelCap);
                if (Widgets.ButtonInvisible(defLabel))
                {
                    if (OrderBy == Order.Efficiency && OrderByCapDef == capDef)
                    {
                        Asc = !Asc;
                    }
                    else
                    {
                        OrderBy       = Order.Efficiency;
                        OrderByCapDef = capDef;
                        Asc           = true;
                    }
                    IsDirty = true;
                }
                TooltipHandler.TipRegion(defLabel, "FluffyMedical.ClickToSortBy".Translate(capDef.LabelCap));
                Widgets.DrawHighlightIfMouseover(defLabel);

                offset = !offset;
                x     += colWidth;
            }

            GUI.EndGroup();

            var content = new Rect(0f, position.yMax, rect.width, rect.height - position.yMax);

            GUI.BeginGroup(content);
            DrawRows(new Rect(0f, 0f, content.width, content.height));
            GUI.EndGroup();
        }
        private void DisplayDetailedListPage(Rect rect)
        {
            GUI.BeginGroup(rect); // TODO: figure out how to do scroll view below titles
            var x            = 0;
            var sourceButton = new Rect(0f, 6f, 200f, 35f);

            if (Widgets.ButtonText(sourceButton, Source.ToString().Translate()))
            {
                List <FloatMenuOption> options = new List <FloatMenuOption>();
                if (Source != SourceOptions.Plants)
                {
                    options.Add(new FloatMenuOption("Plants", delegate {
                        Source  = SourceOptions.Plants;
                        IsDirty = true;
                    }));
                }

                if (Source != SourceOptions.Animals)
                {
                    options.Add(new FloatMenuOption("Animals", delegate {
                        Source  = SourceOptions.Animals;
                        IsDirty = true;
                    }));
                }

                Find.WindowStack.Add(new FloatMenu(options));
            }
            var offset = true;
            List <PawnKindDef> pawnTypeList = DefDatabase <PawnKindDef> .AllDefs.Where(a => a.RaceProps.Animal).ToList();

            var nameRect = new Rect(x, sourceButton.height + 50f, 175f, 30f);

            Text.Anchor = TextAnchor.MiddleCenter;
            Widgets.Label(nameRect, "Name");

            TooltipHandler.TipRegion(nameRect, "ClickToSortByName");
            Widgets.DrawHighlightIfMouseover(nameRect);

            Listing_Standard listing = new Listing_Standard(new Rect(nameRect.x, nameRect.yMax, nameRect.width, consList.Count() * 30));

            foreach (var c in consList.Where(cc => cc.numTotal > 0))
            {
                listing.Label(c.label.ToString());
            }
            listing.Label("Total");
            listing.End();

            x += 175;
            List <String> headerNames = new List <String>()
            {
                "Total", "Adult", "Teen", "Baby", "Daily Consumption[nut]", "Daily Meals/Hay/Kibbles"
            };
            var colWidth = (rect.width - x) / headerNames.Count;

            // loop from left column to rightmost column
            for (var i = 0; i < headerNames.Count; i++)
            {
                // draw title in each column
                var labelRect = new Rect(x + colWidth * i - colWidth / 2, sourceButton.height + 10 + (offset ? 10f : 40f), colWidth * 2, 30f);
                Widgets.DrawLine(new Vector2(x + colWidth * (i + 1) - colWidth / 2, sourceButton.height + 40f + (offset ? 5f : 35f)),
                                 new Vector2(x + colWidth * (i + 1) - colWidth / 2, sourceButton.height + 80f), Color.gray, 1);

                Widgets.Label(labelRect, headerNames[i]);

                // setting drawing rect for each column
                //listing = new Listing_Standard(new Rect(labelRect.x, nameRect.yMax, labelRect.width, consList.Count() * (Text.LineHeight + listing.verticalSpacing)));
                switch (i)
                {
                case 0:
                    ///listing.End();
                    listing = new Listing_Standard(new Rect(
                                                       labelRect.x + labelRect.width / 2f,
                                                       nameRect.yMax,
                                                       consList.Max(ccc => GUI.skin.label.CalcSize(new GUIContent(ccc.numTotal.ToString())).x) + 30, // 24 + 6
                                                       consList.Count() * (Text.LineHeight + listing.verticalSpacing)));
                    break;

                case 1:
                    //listing.Label(c.numAdult.ToString());
                    listing = new Listing_Standard(new Rect(
                                                       labelRect.x + labelRect.width / 2f,
                                                       nameRect.yMax,
                                                       consList.Max(ccc => GUI.skin.label.CalcSize(new GUIContent(ccc.numAdult.ToString())).x) + 30, // 24 + 6
                                                       consList.Count() * (Text.LineHeight + listing.verticalSpacing)));
                    break;

                case 2:
                    //listing.Label(c.numTeen.ToString());
                    listing = new Listing_Standard(new Rect(
                                                       labelRect.x + labelRect.width / 2f,
                                                       nameRect.yMax,
                                                       consList.Max(ccc => GUI.skin.label.CalcSize(new GUIContent(ccc.numTeen.ToString())).x) + 30, // 24 + 6
                                                       consList.Count() * (Text.LineHeight + listing.verticalSpacing)));
                    break;

                case 3:
                    //listing.Label(c.numInfant.ToString());
                    listing = new Listing_Standard(new Rect(
                                                       labelRect.x + labelRect.width / 2f,
                                                       nameRect.yMax,
                                                       consList.Max(ccc => GUI.skin.label.CalcSize(new GUIContent(ccc.numInfant.ToString())).x) + 30, // 24 + 6
                                                       consList.Count() * (Text.LineHeight + listing.verticalSpacing)));
                    break;

                case 4:
                    //listing.Label(String.Format("{0:0.00}", c.totalNutr));
                    listing = new Listing_Standard(new Rect(
                                                       labelRect.x + labelRect.width / 2f,
                                                       nameRect.yMax,
                                                       consList.Max(ccc => GUI.skin.label.CalcSize(new GUIContent(String.Format("{0:0.00}", ccc.numAdult))).x) + 30, // 24 + 6
                                                       consList.Count() * (Text.LineHeight + listing.verticalSpacing)));
                    break;

                case 5:
                    //listing.Label(String.Format("{0:0.0}", c.numFood));
                    listing = new Listing_Standard(new Rect(
                                                       labelRect.x + labelRect.width / 2f,
                                                       nameRect.yMax,
                                                       consList.Max(ccc => GUI.skin.label.CalcSize(new GUIContent(String.Format("{0:0.0}", ccc.numFood))).x) + 30, // 24 + 6
                                                       consList.Count() * (Text.LineHeight + listing.verticalSpacing)));
                    break;

                default:
                    break;
                }

                // draw stats in each column below the title
                bool buf = false;
                foreach (var c in consList.Where(cc => cc.numTotal > 0))
                {
                    GUI.color = Color.white;
                    switch (i)
                    {
                    case 0:
                        listing.CheckboxLabeled(c.numTotal.ToString(), ref buf);
                        break;

                    case 1:
                        listing.CheckboxLabeled(c.numAdult.ToString(), ref buf);
                        break;

                    case 2:
                        listing.CheckboxLabeled(c.numTeen.ToString(), ref buf);
                        break;

                    case 3:
                        listing.CheckboxLabeled(c.numInfant.ToString(), ref buf);
                        break;

                    case 4:
                        listing.CheckboxLabeled(String.Format("{0:0.00}", c.totalNutr), ref buf);
                        break;

                    case 5:
                        listing.CheckboxLabeled(String.Format("{0:0.0}", c.numFood), ref buf);
                        break;
                    }
                }
                // last row of total values
                switch (i)
                {
                case 0:
                    listing.Label(consList.Sum(c => c.numTotal).ToString());
                    break;

                case 1:
                    listing.Label(consList.Sum(c => c.numAdult).ToString());
                    break;

                case 2:
                    listing.Label(consList.Sum(c => c.numTeen).ToString());
                    break;

                case 3:
                    listing.Label(consList.Sum(c => c.numInfant).ToString());
                    break;

                case 4:
                    listing.Label(String.Format("{0:0.00}", consList.Sum(c => c.totalNutr)));
                    break;

                case 5:
                    listing.Label(String.Format("{0:0.0}", consList.Sum(c => c.numFood)));
                    break;
                }
                listing.End();

                /*
                 * if (Widgets.ButtonInvisible(defLabel))
                 * {
                 *  if (OrderBy == Order.Efficiency && OrderByCapDef == CapDefs[i])
                 *  {
                 *      Asc = !Asc;
                 *  }
                 *  else
                 *  {
                 *      OrderBy = Order.Efficiency;
                 *      OrderByCapDef = CapDefs[i];
                 *      Asc = true;
                 *  }
                 *  IsDirty = true;
                 * }
                 * //*/

                TooltipHandler.TipRegion(labelRect, "ClickToSortBy" + (headerNames[i]));
                Widgets.DrawHighlightIfMouseover(labelRect);

                offset = !offset;
            }
            GUI.color = Color.gray;
            for (int k = 0; k < consList.Where(c => c.numTotal > 0).Count() + 1; k++)
            {
                Widgets.DrawLineHorizontal(0f, nameRect.yMax + k * (Text.LineHeight + listing.verticalSpacing), rect.width);
            }
            GUI.EndGroup();
        }