private static bool StillValid(FloatMenuOption opt, List <FloatMenuOption> curOpts) { if (opt.revalidateClickTarget == null) { for (int i = 0; i < curOpts.Count; i++) { if (FloatMenuMap.OptionsMatch(opt, curOpts[i])) { return(true); } } } else { if (!opt.revalidateClickTarget.Spawned) { return(false); } List <FloatMenuOption> list = FloatMenuMakerMap.ChoicesAtFor(opt.revalidateClickTarget.Position.ToVector3Shifted(), Find.Selector.SingleSelectedThing as Pawn); for (int j = 0; j < list.Count; j++) { if (FloatMenuMap.OptionsMatch(opt, list[j])) { return(true); } } } return(false); }
public override void DoWindowContents(Rect inRect) { Pawn pawn = Find.Selector.SingleSelectedThing as Pawn; if (pawn == null) { Find.WindowStack.TryRemove(this, true); } else { if (Time.frameCount % 3 == 0) { Profiler.BeginSample("Float menu ChoicesAtFor()"); List <FloatMenuOption> list = FloatMenuMakerMap.ChoicesAtFor(this.clickPos, pawn); Profiler.EndSample(); List <FloatMenuOption> list2 = list; Vector3 vector = this.clickPos; Profiler.BeginSample("StillValid()"); for (int i = 0; i < this.options.Count; i++) { if (!this.options[i].Disabled && !FloatMenuMap.StillValid(this.options[i], list, pawn, ref list2, ref vector)) { this.options[i].Disabled = true; } } Profiler.EndSample(); } base.DoWindowContents(inRect); } }
private static bool StillValid( FloatMenuOption opt, IEnumerable <FloatMenuOption> curOpts, Pawn forPawn, ref List <FloatMenuOption> cachedChoices, ref Vector3 cachedChoicesForPos) { if (opt.revalidateClickTarget == null) { return(curOpts.Any(t => OptionsMatch(opt, t))); } { if (!opt.revalidateClickTarget.Spawned) { return(false); } var vector3Shifted = opt.revalidateClickTarget.Position.ToVector3Shifted(); List <FloatMenuOption> floatMenuOptionList; if (vector3Shifted == cachedChoicesForPos) { floatMenuOptionList = cachedChoices; } else { cachedChoices = FloatMenuMakerMap.ChoicesAtFor(vector3Shifted, forPawn); cachedChoicesForPos = vector3Shifted; floatMenuOptionList = cachedChoices; } return((from t in floatMenuOptionList where OptionsMatch(opt, t) select !t.Disabled).FirstOrDefault()); } }
private static bool StillValid(FloatMenuOption opt, List <FloatMenuOption> curOpts, Pawn forPawn) { if (opt.revalidateClickTarget == null) { for (int i = 0; i < curOpts.Count; i++) { if (OptionsMatch(opt, curOpts[i])) { return(true); } } } else { if (!opt.revalidateClickTarget.Spawned) { return(false); } Vector3 key = opt.revalidateClickTarget.Position.ToVector3Shifted(); if (!cachedChoices.TryGetValue(key, out var value)) { List <FloatMenuOption> list = FloatMenuMakerMap.ChoicesAtFor(key, forPawn); cachedChoices.Add(key, list); value = list; } for (int j = 0; j < value.Count; j++) { if (OptionsMatch(opt, value[j])) { return(!value[j].Disabled); } } } return(false); }
public override void DoWindowContents(Rect inRect) { Pawn pawn = Find.Selector.SingleSelectedThing as Pawn; if (pawn == null) { Find.WindowStack.TryRemove(this); } else { if (Time.frameCount % 3 == 0) { List <FloatMenuOption> list = FloatMenuMakerMap.ChoicesAtFor(clickPos, pawn); List <FloatMenuOption> cachedChoices = list; Vector3 cachedChoicesForPos = clickPos; for (int i = 0; i < options.Count; i++) { if (!options[i].Disabled && !StillValid(options[i], list, pawn, ref cachedChoices, ref cachedChoicesForPos)) { options[i].Disabled = true; } } } base.DoWindowContents(inRect); } }
public override void PreOptionChosen(FloatMenuOption opt) { base.PreOptionChosen(opt); Pawn pawn = Find.Selector.SingleSelectedThing as Pawn; if (!opt.Disabled && (pawn == null || !FloatMenuMap.StillValid(opt, FloatMenuMakerMap.ChoicesAtFor(this.clickPos, pawn), pawn))) { opt.Disabled = true; } }
public override void DoWindowContents(Rect inRect) { Pawn selPawn = Find.Selector.SingleSelectedThing as Pawn; if (selPawn == null) { Find.WindowStack.TryRemove(this); return; } bool flag = options.Count >= 3; if (Time.frameCount % 4 == 0 || lastOptionsForRevalidation == null) { lastOptionsForRevalidation = FloatMenuMakerMap.ChoicesAtFor(clickPos, selPawn); cachedChoices.Clear(); cachedChoices.Add(clickPos, lastOptionsForRevalidation); if (!flag) { for (int i = 0; i < options.Count; i++) { RevalidateOption(options[i]); } } } else if (flag) { if (nextOptionToRevalidate >= options.Count) { nextOptionToRevalidate = 0; } int num = Mathf.CeilToInt((float)options.Count / 3f); int num2 = nextOptionToRevalidate; int num3 = 0; while (num2 < options.Count && num3 < num) { RevalidateOption(options[num2]); nextOptionToRevalidate++; num2++; num3++; } } base.DoWindowContents(inRect); void RevalidateOption(FloatMenuOption option) { if (!option.Disabled && !StillValid(option, lastOptionsForRevalidation, selPawn)) { option.Disabled = true; } } }
public override void DoWindowContents(Rect inRect) { Pawn pawn = Find.Selector.SingleSelectedThing as Pawn; if (pawn == null) { Find.WindowStack.TryRemove(this, true); return; } List <FloatMenuOption> curOpts = FloatMenuMakerMap.ChoicesAtFor(this.clickPos, pawn); for (int i = 0; i < this.options.Count; i++) { if (!this.options[i].Disabled && !FloatMenuMap.StillValid(this.options[i], curOpts)) { this.options[i].Disabled = true; } } base.DoWindowContents(inRect); }
private static bool StillValid(FloatMenuOption opt, List <FloatMenuOption> curOpts, Pawn forPawn, ref List <FloatMenuOption> cachedChoices, ref Vector3 cachedChoicesForPos) { if (opt.revalidateClickTarget == null) { for (int i = 0; i < curOpts.Count; i++) { if (FloatMenuMap.OptionsMatch(opt, curOpts[i])) { return(true); } } } else { if (!opt.revalidateClickTarget.Spawned) { return(false); } Vector3 vector = opt.revalidateClickTarget.Position.ToVector3Shifted(); List <FloatMenuOption> list; if (vector == cachedChoicesForPos) { list = cachedChoices; } else { cachedChoices = FloatMenuMakerMap.ChoicesAtFor(vector, forPawn); cachedChoicesForPos = vector; list = cachedChoices; } for (int j = 0; j < list.Count; j++) { if (FloatMenuMap.OptionsMatch(opt, list[j])) { return(!list[j].Disabled); } } } return(false); }
public static void UseIndexedFloatMenuEntryAt(Vector3 clickPos, Pawn pawn, int index, int totalCount, string delegateName) { var entries = FloatMenuMakerMap.ChoicesAtFor(clickPos, pawn); if (totalCount == entries.Count) { Action a = entries[index].action; if (a != null && (a.Method.Name + "::" + a.Method.DeclaringType.Name).SequenceEqual(delegateName)) { a(); } else { Utilities.RimLog.Message("Warning! Different methods for float menu entry! But this might be fine"); } } else { Utilities.RimLog.Message("Warning! Different method count for float menu entry! But this might be fine"); } }
private void HandleColonistClicks(Rect rect, Pawn colonist) { if (Mouse.IsOver(rect) && Event.current.type == EventType.MouseDown) { if (clickedColonist == colonist && Time.time - clickedAt < ColBarSettings.DoubleClickTime) { // use event so it doesn't bubble through Event.current.Use(); JumpToTargetUtility.TryJump(colonist); clickedColonist = null; } else { clickedColonist = colonist; clickedAt = Time.time; } } if (Mouse.IsOver(rect) && Event.current.button == 1) { if (Event.current.type == EventType.MouseDown) { List <FloatMenuOption> floatOptionList = new List <FloatMenuOption>(); if (clickedColonist != null && SelPawn != null && SelPawn != clickedColonist) { foreach (FloatMenuOption choice in FloatMenuMakerMap.ChoicesAtFor(clickedColonist.TrueCenter(), SelPawn)) { floatOptionList.Add(choice); } floatOptionList.Add(new FloatMenuOption("--------------------", delegate { })); } floatOptionList.Add(new FloatMenuOption("CBKF.Settings.Vanilla".Translate(), delegate { ColBarSettings.SortBy = vanilla; ((UIRootMap)Find.UIRoot).colonistBar.MarkColonistsListDirty(); })); floatOptionList.Add(new FloatMenuOption("CBKF.Settings.ByName".Translate(), delegate { ColBarSettings.SortBy = byName; ((UIRootMap)Find.UIRoot).colonistBar.MarkColonistsListDirty(); })); floatOptionList.Add(new FloatMenuOption("CBKF.Settings.SexAge".Translate(), delegate { ColBarSettings.SortBy = sexage; ((UIRootMap)Find.UIRoot).colonistBar.MarkColonistsListDirty(); })); floatOptionList.Add(new FloatMenuOption("CBKF.Settings.Mood".Translate(), delegate { ColBarSettings.SortBy = mood; ((UIRootMap)Find.UIRoot).colonistBar.MarkColonistsListDirty(); })); floatOptionList.Add(new FloatMenuOption("CBKF.Settings.Health".Translate(), delegate { ColBarSettings.SortBy = health; ((UIRootMap)Find.UIRoot).colonistBar.MarkColonistsListDirty(); })); floatOptionList.Add(new FloatMenuOption("CBKF.Settings.Medic".Translate(), delegate { ColBarSettings.SortBy = medic; ((UIRootMap)Find.UIRoot).colonistBar.MarkColonistsListDirty(); })); floatOptionList.Add(new FloatMenuOption("CBKF.Settings.Weapons".Translate(), delegate { ColBarSettings.SortBy = weapons; ((UIRootMap)Find.UIRoot).colonistBar.MarkColonistsListDirty(); })); floatOptionList.Add(new FloatMenuOption("CBKF.Settings.SettingsColonistBar".Translate(), delegate { Find.WindowStack.Add(new ColonistBarKF_Settings()); })); FloatMenu window = new FloatMenu(floatOptionList, "CBKF.Settings.SortingOptions".Translate()); Find.WindowStack.Add(window); // use event so it doesn't bubble through Event.current.Use(); } } }