public string GetTooltip(Pawn pawn = null) { if (cachedTooltip == null) { cachedTooltip = base.LabelCap + ((level > 0) ? ((string)("\n" + "Level".Translate() + " ") + level) : "") + "\n\n" + description; string text = StatSummary.ToLineList(); if (!text.NullOrEmpty()) { cachedTooltip = cachedTooltip + "\n\n" + text; } } if (pawn != null && ModsConfig.RoyaltyActive && abilityClass == typeof(Psycast) && level > 0) { Faction first = Faction.GetMinTitleForImplantAllFactions(HediffDefOf.PsychicAmplifier).First; if (first != null) { RoyalTitleDef minTitleForImplant = first.GetMinTitleForImplant(HediffDefOf.PsychicAmplifier, level); RoyalTitleDef currentTitle = pawn.royalty.GetCurrentTitle(first); if (minTitleForImplant != null && (currentTitle == null || currentTitle.seniority < minTitleForImplant.seniority) && DetectionChance > 0f) { return(cachedTooltip + "\n\n" + ColoredText.Colorize("PsycastIsIllegal".Translate(pawn.Named("PAWN"), minTitleForImplant.GetLabelCapFor(pawn).Named("TITLE")), ColoredText.WarningColor)); } } } return(cachedTooltip); }
void ChangeText() { stringToRaceIndex = GetNextStringToRaceIndex(); coloredStringToRace = GetNextColoredText(); index = 0; UpdateColoredText(); }
public static IEnumerable <TraitItem> ToTraitItems([NotNull] this TraitDef trait) { if (trait.degreeDatas == null) { return(new[] { new TraitItem { DefName = trait.defName, Degree = 0, CanAdd = true, CanRemove = true, Name = ColoredText.StripTags(trait.label).ToToolkit(), CostToAdd = 3500, CostToRemove = 5500 } }); } return(trait.degreeDatas.Select( t => new TraitItem { DefName = trait.defName, Degree = t.degree, CostToAdd = 3500, CostToRemove = 5500, CanAdd = true, CanRemove = true, Name = ColoredText.StripTags(t.label).ToToolkit() } ) .ToArray()); }
private static string MakeBodyPartText(Pawn pawn, BodyPartRecord part, Hediff replacingPart) { string bodyPartText; if (part == null) { bodyPartText = ColoredText.Colorize("WholeBody".Translate(), Color.grey); } else { Color healthColor = GetHealthColorForBodypart(pawn, part); if (replacingPart != null) { //diffs = diffs.Where(x => x != replacingPart); //do not list this hediff var replacingPartColorLabel = ColoredText.Colorize(replacingPart.Label, replacingPart.def.defaultLabelColor); var regex = new Regex(@"\b" + part.def.label + @"\b"); if (regex.IsMatch(replacingPart.Label) && regex.IsMatch(part.Label)) { replacingPartColorLabel = replacingPartColorLabel.Replace(part.def.label, ColoredText.Colorize(part.def.label, healthColor)); bodyPartText = ColoredText.Colorize(part.Label.Replace(part.def.label, replacingPartColorLabel), healthColor); } else { bodyPartText = ColoredText.Colorize(part.Label + ", ", healthColor) + replacingPartColorLabel; } } else { bodyPartText = ColoredText.Colorize(part.Label, healthColor); } } bodyPartText = bodyPartText.CapitalizeFirstNestingAware(); return(bodyPartText); }
private void Previous() { for (int i = 0; i < menuEntries.Count; i++) { if (menuEntries[i] is ColoredText) { if (i == 0) { menuEntries[0] = new SimpleText(Game, menuEntries[0].Text, false, menuEntries[0].Name); menuEntries[menuEntries.Count - 1] = new ColoredText(Game, menuEntries[menuEntries.Count - 1].Text, false, menuEntries[menuEntries.Count - 1].Name); } else { menuEntries[i] = new SimpleText(Game, menuEntries[i].Text, false, menuEntries[i].Name); menuEntries[i - 1] = new ColoredText(Game, menuEntries[i - 1].Text, false, menuEntries[i - 1].Name); } SetPositionsAfterEntarence(); return; } } }
private static void DrawRow(Rect givenArea, HopeWorker worker) { Text.Font = GameFont.Small; Text.Anchor = TextAnchor.MiddleLeft; GUI.BeginGroup(givenArea); // Main stuff Rect boundingRect = new Rect(0, 0, givenArea.width, EntryHeight); Widgets.DrawHighlightIfMouseover(boundingRect); // Tooltip sharedStringBuilder.Clear(); sharedStringBuilder.AppendLine(worker.HopeDescription); sharedStringBuilder.AppendLine("\n"); sharedStringBuilder.AppendLine(worker.HopeFlavorText); sharedStringBuilder.AppendLine("\n"); sharedStringBuilder.AppendLine(worker.Hint); string descriptionString = worker.HopeDescription; TaggedString flavorString = ColoredText.Colorize(worker.HopeFlavorText, GenColor.FromHex("a0a0a0")); TaggedString hintString = ColoredText.Colorize("Hint: ", ColoredText.CurrencyColor) + worker.Hint; TaggedString overallString = descriptionString + "\n\n" + flavorString + "\n\n" + hintString; TooltipHandler.TipRegion(boundingRect, overallString); int valueWidth = 40; // Label stuff Rect textRect = new Rect(0, 0, boundingRect.width - valueWidth, boundingRect.height); textRect.xMin += 10; textRect.xMax -= 10; Widgets.Label(textRect, worker.HopeName.CapitalizeFirst()); // Value stuff Text.WordWrap = false; Rect valueRect = new Rect(boundingRect.width - valueWidth, 0, valueWidth, boundingRect.height); Text.Anchor = TextAnchor.MiddleRight; float value = worker.CurrentHopeLevel; if (value >= 0) { GUI.color = PositiveColor; } else { GUI.color = NegativeColor; } Widgets.Label(valueRect, value.ToString("##0.0")); // Reset stuff Text.Anchor = TextAnchor.UpperLeft; GUI.color = Color.white; Text.WordWrap = true; // End group GUI.EndGroup(); }
public static ColoredText Apply(ColoredText targetColor) { var old = targetColor.ForegroundRgb; var top = old .OrderByDescending(a => a) .GroupToArrayDictionary(a => a) .First();
void Start() { if (useDebug) { dictionary = debugDictionary; } stringToRaceIndex = GetNextStringToRaceIndex(); coloredStringToRace = GetNextColoredText(); UpdateColoredText(); }
public IEnumerable <ColoredText> Highlight(string text) { var isFirst = true; byte[] bg = null, fg = null; var sb = new StringBuilder(); foreach (var t in HighlightCore(text)) { if (isFirst) { sb.Append(t.Text); fg = t.ForegroundRgb; bg = t.BackgroundRgb; isFirst = false; } else { if ((fg == null && t.ForegroundRgb != null) || (bg == null && t.BackgroundRgb != null) || (fg != null && (fg[0] != t.ForegroundRgb[0] || fg[1] != t.ForegroundRgb[1] || fg[2] != t.ForegroundRgb[2])) || (bg != null && (bg[0] != t.BackgroundRgb[0] || bg[1] != t.BackgroundRgb[1] || bg[2] != t.BackgroundRgb[2]))) { var ct = new ColoredText(fg, bg, sb.ToString()); sb.Clear(); sb.Append(t.Text); fg = t.ForegroundRgb; bg = t.BackgroundRgb; yield return(ct); } else { sb.Append(t.Text); } } } if (!isFirst) { yield return(new ColoredText(fg, bg, sb.ToString())); } }
/// <summary> /// Performs logic when the <see cref="Scene"/> is initialized. /// </summary> /// <remarks>All UI elements created in DataContextScene.sml.</remarks> protected override void OnInitialized() { View.SetValue(TextBlock.FontFamilyProperty, "PF Square Sans Pro"); ParentBorder.DataContext = new ColoredText("Default Data", Colors.Black); _coloredText = new ColoredText("ColoredText", Colors.Red); _resizeableText = new ResizeableText("ResizeableText", 50, Dock.Bottom, 280f); text3.SetBinding(DockPanel.DockProperty, "Dock"); text3.SetBinding(CatWidthManager.AttachedWidthProperty, "AttachedWidth"); btnAddColoredText.Click += (sender, args) => ParentStackPanel.DataContext = _coloredText; btnAddResizeableText.Click += (sender, args) => ChildThirdStackPanel.DataContext = _resizeableText; btnChangeColoredText.Click += (sender, args) => _coloredText.Content += Environment.NewLine + "1st changed"; btnChangeResizeableText.Click += (sender, args) => _resizeableText.Content += Environment.NewLine + "2nd changed"; btnDeleteAllColoredText.Click += (sender, args) => ParentStackPanel.ClearValue(UIElement.DataContextProperty); btnDeleteResizeableText.Click += (sender, args) => ChildThirdStackPanel.ClearValue(UIElement.DataContextProperty); }
public static string TipForPawnWorker(Pawn p, WorkTypeDef wDef, bool incapableBecauseOfCapacities) { StringBuilder stringBuilder = new StringBuilder(); string str = wDef.gerundLabel.CapitalizeFirst(); int priority = p.workSettings.GetPriority(wDef); str = str + ": " + ColoredText.Colorize(("Priority" + priority).Translate(), ColorOfPriority(priority)); stringBuilder.AppendLine(str); if (p.WorkTypeIsDisabled(wDef)) { stringBuilder.Append("CannotDoThisWork".Translate(p.LabelShort, p)); } else { float num = p.skills.AverageOfRelevantSkillsFor(wDef); if (wDef.relevantSkills.Any()) { string text = ""; foreach (SkillDef relevantSkill in wDef.relevantSkills) { text = text + relevantSkill.skillLabel.CapitalizeFirst() + ", "; } text = text.Substring(0, text.Length - 2); stringBuilder.AppendLine("RelevantSkills".Translate(text, num.ToString("0.#"), 20)); } stringBuilder.AppendLine(); stringBuilder.Append(wDef.description); if (incapableBecauseOfCapacities) { stringBuilder.AppendLine(); stringBuilder.AppendLine(); stringBuilder.Append("IncapableOfWorkTypeBecauseOfCapacities".Translate()); } if (wDef.relevantSkills.Any() && num <= 2f && p.workSettings.WorkIsActive(wDef)) { stringBuilder.AppendLine(); stringBuilder.AppendLine(); stringBuilder.Append("SelectedWorkTypeWithVeryBadSkill".Translate()); } } return(stringBuilder.ToString()); }
//TODO: Add Warning message public override string GetInspectString() { StringBuilder sb = new StringBuilder(); sb.AppendLine(base.GetInspectString()); string obstructedDirs = ""; foreach (var charge in Charges) { if (charge.Obstructed) { obstructedDirs += (obstructedDirs.NullOrEmpty() ? "" : ", ") + charge.direction.ToStringHuman(); } } if (!obstructedDirs.NullOrEmpty()) { sb.AppendLine(ColoredText.Colorize("RWC_Obstructed".Translate(obstructedDirs), Color.red)); } return(sb.ToString().TrimEndNewlines()); }
public static ColoredText Apply(ColoredText x) { if (x.BackgroundRgb == null) { x.BackgroundRgb = x.ForegroundRgb; x.ForegroundRgb = SystemColor.Black; } else if (x.ForegroundRgb == null) { x.ForegroundRgb = x.BackgroundRgb; x.BackgroundRgb = SystemColor.White; } else { var bg = x.BackgroundRgb; x.BackgroundRgb = x.ForegroundRgb; x.ForegroundRgb = bg; } return(x); }
public void SetPositions() { title.Position = new Vector2(Game.GraphicsDevice.Viewport.Width / 2 - 200, -40); Vector2 pos = new Vector2(Game.GraphicsDevice.Viewport.Width - 306, 250); int count = 0; foreach (SimpleText text in menuEntries) { if (text is ColoredText) { count++; } text.Position = pos; pos.Y += OFFSET; } if (count == 0) { Vector2 tempPos = menuEntries[0].Position; menuEntries[0] = new ColoredText(Game, menuEntries[0].Text, true, menuEntries[0].Name) { Position = tempPos }; } }
private void FillTabGuest(Rect rect) { //ConceptDatabase.KnowledgeDemonstrated(ConceptDefOf.PrisonerTab, KnowledgeAmount.GuiFrame); var title = SelPawn.royalty?.MostSeniorTitle; var isRoyal = title != null; var friends = isRoyal ? SelPawn.GetFriendsSeniorityInColony() : SelPawn.GetFriendsInColony(); var friendsRequired = isRoyal ? RequiredSeniority : RequiredFriends; var friendPercentage = 100f * friends / friendsRequired; var tryImprove = SelPawn.ImproveRelationship(); var tryMakeFriends = SelPawn.MakeFriends(); listingStandard.ColumnWidth = size.x - 20; var comp = SelPawn.GetComp <CompGuest>(); // If the lord is not on the map it's invalid! if (comp?.lord != null && comp.lord.ownedPawns.Contains(SelPawn) && SelPawn.Map.lordManager.lords.Contains(comp.lord)) { listingStandard.Gap(); string labelStay = "AreaToStay".Translate(); string labelBuy = "AreaToBuy".Translate(); var rectStayLabel = listingStandard.GetRect(Text.CalcHeight(labelStay, listingStandard.ColumnWidth)); var rectStay = listingStandard.GetRect(24); var rectBuyLabel = listingStandard.GetRect(Text.CalcHeight(labelBuy, listingStandard.ColumnWidth)); var rectBuy = listingStandard.GetRect(24); LabelWithTooltip(labelStay, "AreaToStayTooltip".Translate(), rectStayLabel); GenericUtility.DoAreaRestriction(SelPawn, rectStay, comp.GuestArea, SetAreaRestriction, AreaUtility.AreaAllowedLabel_Area); LabelWithTooltip(labelBuy, "AreaToBuyTooltip".Translate(), rectBuyLabel); GenericUtility.DoAreaRestriction(SelPawn, rectBuy, comp.ShoppingArea, SetAreaShopping, GenericUtility.GetShoppingLabel); var rectImproveRelationship = listingStandard.GetRect(Text.LineHeight); CheckboxLabeled(listingStandard, "ImproveRelationship".Translate(), ref tryImprove, rectImproveRelationship, false, txtImproveTooltip); var rectMakeFriends = listingStandard.GetRect(Text.LineHeight); CheckboxLabeled(listingStandard, "MakeFriends".Translate(), ref tryMakeFriends, rectMakeFriends, false, txtMakeFriendsTooltip); comp.SetEntertain(tryImprove); comp.SetMakeFriends(tryMakeFriends); listingStandard.Gap(50); var mayRecruitAtAll = !SelPawn.InMentalState && comp.arrived; var rectSetDefault = new Rect(rect.xMax - buttonSize.x - 10, 160, buttonSize.x, buttonSize.y); var rectSendHome = new Rect(rect.xMin - 10, 160, buttonSize.x, buttonSize.y); DrawButton(() => SetAllDefaults(SelPawn), txtMakeDefault, rectSetDefault, txtMakeDefaultTooltip); DrawButton(() => SendHomeDialog(SelPawn.GetLord()), txtSendAway, rectSendHome, txtSendAwayTooltip); if (mayRecruitAtAll) { var rectRecruitButton = new Rect(rect.xMin - 10 + 10 + buttonSize.x, 160, buttonSize.x, buttonSize.y); if (friends >= friendsRequired) { DrawButton(() => RecruitDialog(SelPawn, false), txtRecruit, rectRecruitButton, txtRecruitTooltip); } else if (!isRoyal) { DrawButton(() => RecruitDialog(SelPawn, true), txtForceRecruit, rectRecruitButton, txtForceRecruitTooltip); } } // Highlight defaults if (Mouse.IsOver(rectSetDefault)) { Widgets.DrawHighlight(rectStay); Widgets.DrawHighlight(rectStayLabel); Widgets.DrawHighlight(rectBuy); Widgets.DrawHighlight(rectBuyLabel); Widgets.DrawHighlight(rectImproveRelationship); Widgets.DrawHighlight(rectMakeFriends); } } if (SelPawn.Faction != null) { listingStandard.Label(txtRecruitmentPenalty.Translate(SelPawn.RecruitPenalty().ToString("##0"), SelPawn.ForcedRecruitPenalty().ToString("##0"))); listingStandard.Label(txtFactionGoodwill + ": " + SelPawn.Faction.PlayerGoodwill.ToString("##0")); } listingStandard.Gap(); if (isRoyal) { listingStandard.Label($"{"SeniorityRequirement".Translate(friends / 100, friendsRequired / 100)}:"); } else { listingStandard.Label($"{"FriendsRequirement".Translate(friends, friendsRequired)}:"); } listingStandard.Slider(Mathf.Clamp(friendPercentage, 0, 100), 0, 100); if (friendPercentage <= 99) { // Remove color from AdjustedFor and then Colorize listingStandard.Label(ColoredText.StripTags("NotEnoughFriends".Translate(SelPawn.GetMinRecruitOpinion()).AdjustedFor(SelPawn)).Colorize(Color.red)); } else { listingStandard.Label("CanNowBeRecruited".Translate().AdjustedFor(SelPawn)); } // Will only have score while "checked in", becomes 0 again when guest leaves if (SelPawn.GetVisitScore(out var score)) { listingStandard.Label(txtHospitality + ":"); listingStandard.Slider(score, 0f, 1f); } }
public static void RecruitDialog(Pawn pawn, bool forced) { var penalty = forced ? pawn.ForcedRecruitPenalty() : pawn.RecruitPenalty(); int finalGoodwill = Mathf.Clamp(pawn.Faction.PlayerGoodwill - penalty, -100, 100); var warning = finalGoodwill <= DiplomacyTuning.BecomeHostileThreshold ? "ForceRecruitWarning".Translate() : TaggedString.Empty; var text = (forced ? "ForceRecruitQuestion" : "RecruitQuestion").Translate(penalty.ToString("##0"), ColoredText.Colorize(warning, ColoredText.FactionColor_Hostile), new NamedArgument(pawn, "PAWN")); Find.WindowStack.Add(Dialog_MessageBox.CreateConfirmation(text, () => GuestUtility.Recruit(pawn, penalty, forced))); }
public string Resolve() { return(ColoredText.Resolve(this)); }
public void Notify_RelationKindChanged(Faction other, FactionRelationKind previousKind, bool canSendLetter, string reason, GlobalTargetInfo lookTarget, out bool sentLetter) { if (Current.ProgramState != ProgramState.Playing || other != OfPlayer) { canSendLetter = false; } sentLetter = false; ColoredText.ClearCache(); FactionRelationKind factionRelationKind = RelationKindWith(other); if (factionRelationKind == FactionRelationKind.Hostile) { if (Current.ProgramState == ProgramState.Playing) { foreach (Pawn item in PawnsFinder.AllMapsWorldAndTemporary_Alive.ToList()) { if ((item.Faction == this && item.HostFaction == other) || (item.Faction == other && item.HostFaction == this)) { item.guest.SetGuestStatus(item.HostFaction, prisoner: true); } } } if (other == OfPlayer) { QuestUtility.SendQuestTargetSignals(questTags, "BecameHostileToPlayer", this.Named("SUBJECT")); } } if (other == OfPlayer && !this.HostileTo(OfPlayer)) { List <Site> list = new List <Site>(); List <Site> sites = Find.WorldObjects.Sites; for (int i = 0; i < sites.Count; i++) { if (sites[i].factionMustRemainHostile && sites[i].Faction == this && !sites[i].HasMap) { list.Add(sites[i]); } } if (list.Any()) { string str; string str2; if (list.Count == 1) { str = "LetterLabelSiteNoLongerHostile".Translate(); str2 = "LetterSiteNoLongerHostile".Translate(NameColored, list[0].Label); } else { StringBuilder stringBuilder = new StringBuilder(); for (int j = 0; j < list.Count; j++) { if (stringBuilder.Length != 0) { stringBuilder.AppendLine(); } stringBuilder.Append(" - " + list[j].LabelCap); ImportantPawnComp component = list[j].GetComponent <ImportantPawnComp>(); if (component != null && component.pawn.Any) { stringBuilder.Append(" (" + component.pawn[0].LabelCap + ")"); } } str = "LetterLabelSiteNoLongerHostileMulti".Translate(); str2 = (string)("LetterSiteNoLongerHostileMulti".Translate(NameColored) + ":\n\n") + stringBuilder; } Find.LetterStack.ReceiveLetter(str, str2, LetterDefOf.NeutralEvent, new LookTargets(list.Select((Site x) => new GlobalTargetInfo(x.Tile)))); for (int k = 0; k < list.Count; k++) { list[k].Destroy(); } } } if (other == OfPlayer && this.HostileTo(OfPlayer)) { List <WorldObject> allWorldObjects = Find.WorldObjects.AllWorldObjects; for (int l = 0; l < allWorldObjects.Count; l++) { if (allWorldObjects[l].Faction == this) { TradeRequestComp component2 = allWorldObjects[l].GetComponent <TradeRequestComp>(); if (component2 != null && component2.ActiveRequest) { component2.Disable(); } } } foreach (Map map in Find.Maps) { map.passingShipManager.RemoveAllShipsOfFaction(this); } } if (canSendLetter) { TaggedString text = ""; TryAppendRelationKindChangedInfo(ref text, previousKind, factionRelationKind, reason); switch (factionRelationKind) { case FactionRelationKind.Hostile: Find.LetterStack.ReceiveLetter("LetterLabelRelationsChange_Hostile".Translate(Name), text, LetterDefOf.NegativeEvent, lookTarget, this); sentLetter = true; break; case FactionRelationKind.Ally: Find.LetterStack.ReceiveLetter("LetterLabelRelationsChange_Ally".Translate(Name), text, LetterDefOf.PositiveEvent, lookTarget, this); sentLetter = true; break; case FactionRelationKind.Neutral: if (previousKind == FactionRelationKind.Hostile) { Find.LetterStack.ReceiveLetter("LetterLabelRelationsChange_NeutralFromHostile".Translate(Name), text, LetterDefOf.PositiveEvent, lookTarget, this); sentLetter = true; } else { Find.LetterStack.ReceiveLetter("LetterLabelRelationsChange_NeutralFromAlly".Translate(Name), text, LetterDefOf.NeutralEvent, lookTarget, this); sentLetter = true; } break; } } if (Current.ProgramState != ProgramState.Playing) { return; } List <Map> maps = Find.Maps; for (int m = 0; m < maps.Count; m++) { maps[m].attackTargetsCache.Notify_FactionHostilityChanged(this, other); LordManager lordManager = maps[m].lordManager; for (int n = 0; n < lordManager.lords.Count; n++) { Lord lord = lordManager.lords[n]; if (lord.faction == other) { lord.Notify_FactionRelationsChanged(this, previousKind); } else if (lord.faction == this) { lord.Notify_FactionRelationsChanged(other, previousKind); } } } }
/// <inheritdoc /> public override void DoWindowContents(Rect inRect) { Rect titleRect = new Rect(inRect.x, inRect.y, inRect.width, 42f).Rounded(); Text.Font = GameFont.Medium; Widgets.Label(titleRect, "ColorPicker_Title".Translate(this.targetPawn.LabelCap)); Text.Font = GameFont.Small; Rect contentRect = new Rect(inRect.x, 45f, inRect.width, inRect.height - 45f).ContractedBy(5f).Rounded(); var hintText = "<i>" + "ColorPicker_RemovalHint".Translate() + "</i>"; var hintTextSize = Text.CalcSize(hintText); Rect hintRect = new Rect(contentRect.center.x - (hintTextSize.x / 2), contentRect.y, hintTextSize.x, hintTextSize.y).Rounded(); Widgets.Label(hintRect, hintText); contentRect.y += hintRect.height; contentRect.height -= hintRect.height; Rect skinRect = new Rect(contentRect.x, contentRect.y, contentRect.width / 2, 30f).Rounded(); Widgets.DrawBoxSolid(skinRect.ContractedBy(5f), customSkinColor ? skinFirstColor : getOriginalColor(PawnColorSlot.SkinFirst)); skinRect.y += 30f; Widgets.CheckboxLabeled(skinRect.Rounded(), "ColorPicker_CustomSkinColorCheckbox".Translate(), ref customSkinColor); if (customSkinColor) { skinRect.width -= 60f; skinRect.x += 30f; skinRect.y += 30f; float r = Widgets.HorizontalSlider(skinRect, skinFirstColor.r, 0f, 1f, label: ColoredText.Colorize("ColorPicker_r".Translate(), Color.red)); skinRect.y += 30f; float g = Widgets.HorizontalSlider(skinRect, skinFirstColor.g, 0f, 1f, label: ColoredText.Colorize("ColorPicker_g".Translate(), Color.green)); skinRect.y += 30f; float b = Widgets.HorizontalSlider(skinRect, skinFirstColor.b, 0f, 1f, label: ColoredText.Colorize("ColorPicker_b".Translate(), Color.blue)); skinFirstColor = new Color(r, g, b); } Rect hairRect = new Rect(contentRect.x + (contentRect.width / 2), contentRect.y, contentRect.width / 2, 30f).Rounded(); Widgets.DrawBoxSolid(hairRect.ContractedBy(5f), customHairColor ? hairFirstColor : getOriginalColor(PawnColorSlot.HairFirst)); hairRect.y += 30f; Widgets.CheckboxLabeled(hairRect.TopPartPixels(30f).Rounded(), "ColorPicker_CustomHairColorCheckbox".Translate(), ref customHairColor); if (customHairColor) { hairRect.width -= 60f; hairRect.x += 30f; hairRect.y += 30f; float r = Widgets.HorizontalSlider(hairRect, hairFirstColor.r, 0f, 1f, label: ColoredText.Colorize("ColorPicker_r".Translate(), Color.red)); hairRect.y += 30f; float g = Widgets.HorizontalSlider(hairRect, hairFirstColor.g, 0f, 1f, label: ColoredText.Colorize("ColorPicker_g".Translate(), Color.green)); hairRect.y += 30f; float b = Widgets.HorizontalSlider(hairRect, hairFirstColor.b, 0f, 1f, label: ColoredText.Colorize("ColorPicker_b".Translate(), Color.blue)); hairFirstColor = new Color(r, g, b); } Rect confirmRect = new Rect(contentRect.x + ((contentRect.width / 6) * 2), contentRect.yMax - 40f, (contentRect.width / 6) * 2, 40f).Rounded(); if (Widgets.ButtonText(confirmRect, "ColorPicker_Confirm".Translate())) { this.Close(true); } }
public BasicFileNameParser(string e) { // rule #1 - dots, underspaces are spaces // rule #2 - there may be season (Season 3, S03) and/or episode tag // rule #3 - there may be a year // rule #4 - words with two or more upper case chars may be tags // if they do not represent roman numbers // if they do not appear before season/episode tag (CSI) // rule #5 - a year may come after a tag // rule #6 - a year may be enclosed within brackets // rule #7 - name may start or container a number // rule #8 - name does not span beyond year or tag, or a bracket // rule #9 - imdb may not know about the name // rule #10 - episode title may appear after episode tag var c = new ColoredText(e); this.ColoredText = c; var BackgroundToGray = "#c0c0c0".FixLastParam <int, int, string>(c.SetBackground); var BackgroundToRed = "red".FixLastParam <int, int, string>(c.SetBackground); var BackgroundToYellow = "yellow".FixLastParam <int, int, string>(c.SetBackground); var BackgroundToCyan = "cyan".FixLastParam <int, int, string>(c.SetBackground); #region rule # 1 e.FindSubstrings(".", (offset, length) => { BackgroundToYellow(offset, length); return(offset + length); } ); e.FindSubstrings("_", (offset, length) => { BackgroundToYellow(offset, length); return(offset + length); } ); #endregion Func <int, int, int> Discard = (offset, length) => { BackgroundToGray(offset, e.Length - offset); return(e.Length); }; // rule #3 // rule #8 e.FindDigits(4, (offset, length) => { BackgroundToCyan(offset, length); this.Year = e.Substring(offset, length); Discard(offset + length, length); } ); #region FindEpisodeInfo Action <string, Action <string, int, int> > FindEpisodeInfo = (prefix, handler) => e.FindSubstrings(prefix, (offset, length) => { int i = 1; for (; i + offset < e.Length; i++) { if (!char.IsNumber(e[offset + i])) { break; } } if (i > 1) { handler(prefix, offset, i); } return(offset + i); } ); #endregion #region season tag var SeasonEndOffset = -1; FindEpisodeInfo("S", (prefix, offset, length) => { Season = e.Substring(offset + prefix.Length, length - prefix.Length); SeasonEndOffset = offset; BackgroundToRed(offset, length); } ); var EpisodeEndOffset = -1; FindEpisodeInfo("E", (prefix, offset, length) => { Episode = e.Substring(offset + prefix.Length, length - prefix.Length); EpisodeEndOffset = offset; BackgroundToRed(offset, length); } ); var SeasonTagEndOffset = EpisodeEndOffset.Max(SeasonEndOffset); #endregion // rule #4 // rule #8 e.FindUpperCase(2, (offset, length) => { // http://en.wikipedia.org/wiki/Roman_numerals // roman numbers may be part of the name if (e.EnsureChars(offset, length, "IVXLCDM")) { return(offset + length); } if (SeasonTagEndOffset >= 0) { if (offset < SeasonTagEndOffset) { return(offset + length); } } return(Discard(offset, length)); } ); e.FindSubstrings("[", Discard); e.FindSubstrings("(", Discard); var TitleBuilder = new StringBuilder(); var SubTitleBuilder = new StringBuilder(); Func <int, StringBuilder> GetStream = offset => { if (SeasonTagEndOffset < 0) { return(TitleBuilder); } if (offset < SeasonTagEndOffset) { return(TitleBuilder); } return(SubTitleBuilder); }; for (int i = 0; i < this.ColoredText.Source.Length; i++) { if (!string.IsNullOrEmpty(this.ColoredText.Background[i])) { GetStream(i).Append(" "); } else { GetStream(i).Append(this.ColoredText.Source[i]); } } this.Title = TitleBuilder.ToString().Trim(); this.SubTitle = SubTitleBuilder.ToString().Trim(); }