From a6a7cdb9543c0fb1b15550644eca25ff12181528 Mon Sep 17 00:00:00 2001 From: UnlimitedHugs Date: Thu, 1 Jun 2017 17:23:06 +0400 Subject: [PATCH] 3.1.2: Tool fix, usability improvements - "Select similar" will now work properly after loading a game twice - Tools on selected items can now be individually hidden - The context action hotkey will now activate the first tool on selected items, if no tool is held - Shift-clicking a tool on selected items will pick that tool up --- AllowTool.csproj | 2 + AllowTool.csproj.DotSettings | 3 +- Mods/AllowTool/About/About.xml | 2 +- Mods/AllowTool/Assemblies/AllowTool.dll | Bin 62464 -> 66560 bytes .../ReverseDesignators.xml | 18 +++++ .../English/Keyed/AllowToolStrings.xml | 7 ++ .../Russian/Keyed/AllowToolStrings.xml | 29 ++++--- Properties/AssemblyInfo.cs | 4 +- Source/AllowToolController.cs | 64 +++++++++++++--- Source/AllowToolEarlyInit.cs | 12 ++- Source/Context/BaseDesignatorMenuProvider.cs | 4 +- .../DesignatorContextMenuController.cs | 71 ++++++++++++++---- Source/Context/MenuProvider_HaulUrgently.cs | 13 +++- Source/Context/MenuProvider_SelectSimilar.cs | 5 +- .../Designators/Designator_SelectSimilar.cs | 54 ++++--------- .../Patches/Designator_ProcessInput_Patch.cs | 2 +- .../Designator_SelectSimilarReverse.cs | 36 +++++++++ Source/Reverse/ReverseDesignatorDef.cs | 13 ++++ Source/ReverseDesignatorProvider.cs | 18 ++--- 19 files changed, 257 insertions(+), 100 deletions(-) create mode 100644 Mods/AllowTool/Defs/ReverseDesignatorDefs/ReverseDesignators.xml create mode 100644 Source/Reverse/Designator_SelectSimilarReverse.cs create mode 100644 Source/Reverse/ReverseDesignatorDef.cs diff --git a/AllowTool.csproj b/AllowTool.csproj index bf2575b..53ae930 100644 --- a/AllowTool.csproj +++ b/AllowTool.csproj @@ -77,12 +77,14 @@ + + diff --git a/AllowTool.csproj.DotSettings b/AllowTool.csproj.DotSettings index 6bf57c2..71d87e5 100644 --- a/AllowTool.csproj.DotSettings +++ b/AllowTool.csproj.DotSettings @@ -1,4 +1,5 @@  True True - True \ No newline at end of file + True + True \ No newline at end of file diff --git a/Mods/AllowTool/About/About.xml b/Mods/AllowTool/About/About.xml index 71ff411..25efb40 100644 --- a/Mods/AllowTool/About/About.xml +++ b/Mods/AllowTool/About/About.xml @@ -4,7 +4,7 @@ UnlimitedHugs 0.17.0 https://ludeon.com/forums/index.php?topic=17218.0 - Version: 3.1.1 + Version: 3.1.2 A set of tools to make your life on the Rim a bit easier. Easily forbid and unforbid items, select similar things, have things hauled urgently and affect the entire map with powerful new tool extensions. diff --git a/Mods/AllowTool/Assemblies/AllowTool.dll b/Mods/AllowTool/Assemblies/AllowTool.dll index 1309eed1b38d8254edd44cb142810383449ed25b..52b9a14b56c8a76b2c7202bee5e7d740813834ed 100644 GIT binary patch literal 66560 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 literal 62464 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 z zO9Y(V)hnF3UM}X(9RH{(_LSaQ)>@Ewt;AJt^`jtg>~>2wAa+Khy9hnl_^sWjhvBz| ziL&A8<4L}?n=1)b>555foFP++JyW?;1+ zH0{PZmV)f=#&1xNrM$6ECS%>~o44JdkPwz@H>@0xkbI&UE=@EOd|MR*y{DY@HiK*1hZtY zUkT0!*C=I4>Au8umd^{6_2*Cf{_}qnI85;CGwt7>wY&Ol`OaUlQS~|gCm2;ZwhLrH zbnZa866L`3=YaLnfp49v;B5nzH*q;PYY=>=?;x-yfXU_Tl|$(si62a)&1CcMaq?}@ zfYbcL)cf`>z`e+9%KiJ?p60nm&1!tkPQOOAIrE`5{H{{lSg%;-N?A7Lq4eh%Io>Jz z&rjj-`)vus)Md5waKH+*%rQ%zw%s#KkTbH=Ijm7c-xq0j$9gGKx<<}aP%CdmhR^c+ zopqVuJvMZPlYWyxfz*Wdg5gTsPuVBI;Ax?&N5gW?=y#Pd^l*aC+g01J=#6fZMz_u} zHdC*ib}t~f6HrL`PIt&uNAELmk$YgmQ@qt@!qys;f6V`2uz}&#pZ_sO^C#$SNrC?b D=`R%> diff --git a/Mods/AllowTool/Defs/ReverseDesignatorDefs/ReverseDesignators.xml b/Mods/AllowTool/Defs/ReverseDesignatorDefs/ReverseDesignators.xml new file mode 100644 index 0000000..9c72089 --- /dev/null +++ b/Mods/AllowTool/Defs/ReverseDesignatorDefs/ReverseDesignators.xml @@ -0,0 +1,18 @@ + + + + + ReverseHaulUrgently + + HaulUrgentlyDesignator + + AllowTool.Designator_HaulUrgently + + + + ReverseSelectSimilar + AllowTool.Designator_SelectSimilarReverse + SelectSimilarDesignator + + + \ No newline at end of file diff --git a/Mods/AllowTool/Languages/English/Keyed/AllowToolStrings.xml b/Mods/AllowTool/Languages/English/Keyed/AllowToolStrings.xml index 1956cfa..8e6eb0a 100644 --- a/Mods/AllowTool/Languages/English/Keyed/AllowToolStrings.xml +++ b/Mods/AllowTool/Languages/English/Keyed/AllowToolStrings.xml @@ -22,11 +22,17 @@ Displays an AllowTool watermark in tool context menus when enabled. Right click icon on tools When enabled, displays a small icon on designator tools that have a context menu. + Extended "Context action" hotkey + When no tool is selected, the "Context action" hotkey will activate the context action on the first visible tool when items are selected. + Pick tool from selected items + Holding the Shift key and clicking on a tool while having items selected will pick that tool up instead of activating it on the items. Enable: {0} When enabled, adds a right-click menu to the tool that allows it to affect the entire map. ▼ Show settings ▼ Enable or disable tools Enable or disable context menus + Tools on selected things + When enabled, shows this tool when supported things are selected. Load or start a game for this setting to take effect. Show "Haul+" work type When enabled, shows the work type for the "Haul urgently" tool in the Work tab.\nThe game must be restarted for this setting to take effect. @@ -46,6 +52,7 @@ Haul visible items urgently Haul all map items urgently {0} items marked for urgent hauling. + {0} visible items marked for urgent hauling. Found no new items to haul. Strip all enemies {0} bodies designated for stripping. diff --git a/Mods/AllowTool/Languages/Russian/Keyed/AllowToolStrings.xml b/Mods/AllowTool/Languages/Russian/Keyed/AllowToolStrings.xml index f39a808..5fa8ee1 100644 --- a/Mods/AllowTool/Languages/Russian/Keyed/AllowToolStrings.xml +++ b/Mods/AllowTool/Languages/Russian/Keyed/AllowToolStrings.xml @@ -6,12 +6,12 @@ Запрещено {0} предметов. Не найдено предметов для запрещения. - + Разрешено {0} предметов по всей карте. Не найдено запрещенных предметов. - + Выделено {0} {1} по всей карте. - + Отображать: {0} Если настройка включена, инструмент будет отображаться в меню. Глобальные быстрые клавиши @@ -22,27 +22,36 @@ Отображает логотип AllowTool в контекстном меню инструментов. Иконка контекстного меню на инструментах Отображает иконку "правый клик" на инструментах, у которых есть контекстное меню. + Расширенная клавиша "Действие контекстного меню" + Когда не выбран ни одни инструмент, клавиша "Действие контекстного меню" активирует действие контекстного меню первого инструмента на выделенных предметах. + Выбор инструментов с выделенных предметов + Когда выделены предметы, удерживая клавишу Shift и нажав на инструмент, можно выбрать этот инструмент для дальнейшей работы вместо того чтобы активировать его на выделенных предметах. Включить: {0} Добавляет контекстное меню этому инструменту, позволяющее воздействовать на всю карту сразу. ▼ Открыть настройки ▼ Включить или отключить инструменты Включить или отключить контекстные меню - Отображать тип работы "Перенос+" - Если включено, панель настроек работ отображает дополнительный тип работы для инструмента срочного переноса. Требуется перезапуск. - + Инструменты на выделенных предметах + Tools on selected things + Если включено, отображает этот инструмент на поддерживаемых выделенных предметах. Вступает в силу после загрузки сохраненной игры. + Отображать тип работы "Перенос+" + Если включено, панель настроек работ отображает дополнительный тип работы для инструмента срочного переноса. Требуется перезапуск. + Клик для выделения предмета Будет выделено только: {0} Выделено максимум предметов (еще {0}) - + {0} предметов будут перенесены срочно. Не найдено предметов нуждающихся в переносе. - + Выделить схожие предметы на карте Выделено {0} схожих предметов на карте. Выделено {0} из доступных {1} схожих предметов на карте. Что-нибудь должно быть уже выделено чтобы найти и выделить схожие предметов. - Срочно перенести видимые предметы + Срочно перенести предметы + Срочно перенести видимые предметы + Срочно перенести все предметы на карте {0} предметов отмечено для срочного переноса. Не найдено предметов нуждающихся в переносе. Снять одежду со всех врагов @@ -71,5 +80,5 @@ Не найдено планов для отмены. Отменить все указания на карте Отменено {0} указаний на предметах и {1} на ландшафте. - + diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index e97f870..89be726 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("3.1.1")] -[assembly: AssemblyFileVersion("3.1.1")] +[assembly: AssemblyVersion("3.1.2")] +[assembly: AssemblyFileVersion("3.1.2")] diff --git a/Source/AllowToolController.cs b/Source/AllowToolController.cs index 0ec5b23..d9ca6b6 100644 --- a/Source/AllowToolController.cs +++ b/Source/AllowToolController.cs @@ -18,28 +18,36 @@ namespace AllowTool { public class AllowToolController : ModBase { internal const string ModId = "AllowTool"; internal const string DesignatorHandleNamePrefix = "show"; + internal const string ReverseDesignatorHandleNamePrefix = "showrev"; internal const string HarmonyInstanceId = "HugsLib.AllowTool"; private const string HaulWorktypeSettingName = "haulUrgentlyWorktype"; public static FieldInfo ResolvedDesignatorsField; public static FieldInfo ReverseDesignatorDatabaseDesListField; + public static FieldInfo GizmoGridGizmoListField; public static AllowToolController Instance { get; private set; } internal static HarmonyInstance HarmonyInstance { get; set; } // called before implied def generation public static void HideHaulUrgentlyWorkTypeIfDisabled() { - var peekValue = HugsLibController.SettingsManager.GetModSettings(ModId).PeekValue(HaulWorktypeSettingName); // handles will be created later- just peek for now - if (peekValue == "False") { - AllowToolDefOf.HaulingUrgent.visible = false; + try { + var peekValue = HugsLibController.SettingsManager.GetModSettings(ModId).PeekValue(HaulWorktypeSettingName); // handles will be created later- just peek for now + if (peekValue == "False") { + AllowToolDefOf.HaulingUrgent.visible = false; + } + } catch (Exception e) { + Log.Error("AllowTool failed to modify work type visibility: "+e); } } private readonly List activeDesignators = new List(); private readonly Dictionary> designatorToggleHandles = new Dictionary>(); + private readonly Dictionary> reverseDesignatorToggleHandles = new Dictionary>(); private SettingHandle settingGlobalHotkeys; private bool expandToolSettings; private bool expandProviderSettings; + private bool expandReverseToolSettings; public override string ModIdentifier { get { return ModId; } @@ -59,6 +67,10 @@ protected override bool HarmonyAutoPatch { internal SettingHandle ContextWatermarkSetting { get; private set; } + public SettingHandle ExtendedContextActionSetting { get; set; } + + public SettingHandle ReverseDesignatorPickSetting { get; set; } + public UnlimitedDesignationDragger Dragger { get; private set; } private AllowToolController() { @@ -113,9 +125,11 @@ public override void SettingsChanged() { } public bool IsDesignatorEnabledInSettings(ThingDesignatorDef def) { - SettingHandle handle; - designatorToggleHandles.TryGetValue(DesignatorHandleNamePrefix + def.defName, out handle); - return handle == null || handle.Value; + return GetToolHandleSettingValue(designatorToggleHandles, DesignatorHandleNamePrefix + def.defName); + } + + public bool IsReverseDesignatorEnabledInSettings(ReverseDesignatorDef def) { + return GetToolHandleSettingValue(reverseDesignatorToggleHandles, ReverseDesignatorHandleNamePrefix + def.defName); } public Designator_SelectableThings TryGetDesignator(ThingDesignatorDef def) { @@ -127,6 +141,8 @@ private void PrepareSettingsHandles() { ContextOverlaySetting = Settings.GetHandle("contextOverlay", "setting_contextOverlay_label".Translate(), "setting_contextOverlay_desc".Translate(), true); ContextWatermarkSetting = Settings.GetHandle("contextWatermark", "setting_contextWatermark_label".Translate(), "setting_contextWatermark_desc".Translate(), true); Settings.GetHandle(HaulWorktypeSettingName, "setting_haulUrgentlyWorktype_label".Translate(), "setting_haulUrgentlyWorktype_desc".Translate(), true); + ExtendedContextActionSetting = Settings.GetHandle("extendedContextActionKey", "setting_extendedContextHotkey_label".Translate(), "setting_extendedContextHotkey_desc".Translate(), true); + ReverseDesignatorPickSetting = Settings.GetHandle("reverseDesignatorPick", "setting_reverseDesignatorPick_label".Translate(), "setting_reverseDesignatorPick_desc".Translate(), true); SelectionLimitSetting = Settings.GetHandle("selectionLimit", "setting_selectionLimit_label".Translate(), "setting_selectionLimit_desc".Translate(), 200, Validators.IntRangeValidator(50, 100000)); SelectionLimitSetting.SpinnerIncrement = 50; // designators @@ -144,6 +160,14 @@ private void PrepareSettingsHandles() { provider.ProviderHandle = Settings.GetHandle(provider.SettingId, "setting_providerPrefix".Translate(provider.EntryTextKey.Translate()), "setting_provider_desc".Translate(), true); provider.ProviderHandle.VisibilityPredicate = () => expandProviderSettings; } + // reverse designators + MakeSettingsCategoryToggle("setting_showReverseToggles_label", () => expandReverseToolSettings = !expandReverseToolSettings); + foreach (var reverseDef in DefDatabase.AllDefs) { + var handleName = ReverseDesignatorHandleNamePrefix + reverseDef.defName; + var handle = Settings.GetHandle(handleName, "setting_showTool_label".Translate(reverseDef.designatorDef.label), "setting_reverseDesignator_desc".Translate(), true); + handle.VisibilityPredicate = () => expandReverseToolSettings; + reverseDesignatorToggleHandles[handleName] = handle; + } } private void MakeSettingsCategoryToggle(string labelId, Action buttonAction) { @@ -155,6 +179,15 @@ private void MakeSettingsCategoryToggle(string labelId, Action buttonAction) { }; } + public Designator_SelectableThings InstantiateDesignator(Type designatorType, ThingDesignatorDef designatorDef) { + try { + return (Designator_SelectableThings) Activator.CreateInstance(designatorType, designatorDef); + } catch (Exception e) { + Logger.ReportException(e, null, false, string.Format("instantiation of {0} with Def {1}", (designatorType != null ? designatorType.FullName : "(null)"), designatorDef)); + } + return null; + } + private void InjectDesignators() { var numDesignatorsInjected = 0; foreach (var designatorDef in DefDatabase.AllDefs) { @@ -167,7 +200,7 @@ private void InjectDesignators() { break; } if (insertIndex >= 0) { - var designator = (Designator_SelectableThings)Activator.CreateInstance(designatorDef.designatorClass, designatorDef); + var designator = InstantiateDesignator(designatorDef.designatorClass, designatorDef); resolvedDesignators.Insert(insertIndex + 1, designator); designator.SetVisible(IsDesignatorEnabledInSettings(designatorDef)); activeDesignators.Add(new DesignatorEntry(designator, designatorDef.hotkeyDef)); @@ -185,16 +218,23 @@ private void InjectDesignators() { private void PrepareReflection() { ResolvedDesignatorsField = typeof(DesignationCategoryDef).GetField("resolvedDesignators", HugsLibUtility.AllBindingFlags); ReverseDesignatorDatabaseDesListField = typeof(ReverseDesignatorDatabase).GetField("desList", HugsLibUtility.AllBindingFlags); + var gizmoGridType = GenTypes.GetTypeInAnyAssembly("RimWorld.InspectGizmoGrid"); + if (gizmoGridType != null) { + GizmoGridGizmoListField = gizmoGridType.GetField("gizmoList", HugsLibUtility.AllBindingFlags); + } if (ResolvedDesignatorsField == null || ResolvedDesignatorsField.FieldType != typeof(List) - || ReverseDesignatorDatabaseDesListField == null || ReverseDesignatorDatabaseDesListField.FieldType != typeof(List)) { + || ReverseDesignatorDatabaseDesListField == null || ReverseDesignatorDatabaseDesListField.FieldType != typeof(List) + || GizmoGridGizmoListField == null || GizmoGridGizmoListField.FieldType != typeof(List)) { Logger.Error("Failed to reflect required members"); } } + + private void CheckForHotkeyPresses() { if (Event.current.keyCode == KeyCode.None) return; if (AllowToolDefOf.ToolContextMenuAction.JustPressed) { - DesignatorContextMenuController.DoContextMenuActionForActiveDesignator(); + DesignatorContextMenuController.ProcessContextActionHotkeyPress(); } if (!settingGlobalHotkeys || Find.VisibleMap == null) return; for (int i = 0; i < activeDesignators.Count; i++) { @@ -213,5 +253,11 @@ public DesignatorEntry(Designator_SelectableThings designator, KeyBindingDef key this.key = key; } } + + private bool GetToolHandleSettingValue(Dictionary> handleDict, string handleName) { + SettingHandle handle; + handleDict.TryGetValue(handleName, out handle); + return handle == null || handle.Value; + } } } \ No newline at end of file diff --git a/Source/AllowToolEarlyInit.cs b/Source/AllowToolEarlyInit.cs index e91ff52..6ae401c 100644 --- a/Source/AllowToolEarlyInit.cs +++ b/Source/AllowToolEarlyInit.cs @@ -1,4 +1,5 @@ -using Harmony; +using System; +using Harmony; using Verse; namespace AllowTool { @@ -7,8 +8,13 @@ namespace AllowTool { /// public class AllowToolEarlyInit : Mod { public AllowToolEarlyInit(ModContentPack content) : base(content) { - AllowToolController.HarmonyInstance = HarmonyInstance.Create(AllowToolController.HarmonyInstanceId); - AllowToolController.HarmonyInstance.PatchAll(typeof(AllowToolController).Assembly); + try { + AllowToolController.HarmonyInstance = HarmonyInstance.Create(AllowToolController.HarmonyInstanceId); + AllowToolController.HarmonyInstance.PatchAll(typeof(AllowToolController).Assembly); + } catch (Exception e) { + // Resharper disable once + Log.Error("AllowTool failed to apply Harmony patches: "+e); + } } } } \ No newline at end of file diff --git a/Source/Context/BaseDesignatorMenuProvider.cs b/Source/Context/BaseDesignatorMenuProvider.cs index 868e301..884e08f 100644 --- a/Source/Context/BaseDesignatorMenuProvider.cs +++ b/Source/Context/BaseDesignatorMenuProvider.cs @@ -13,8 +13,8 @@ namespace AllowTool.Context { public abstract class BaseDesignatorMenuProvider { protected delegate void MenuActionMethod(Designator designator, Map map); - private const string SuccessMessageStringIdSuffix = "_succ"; - private const string FailureMessageStringIdSuffix = "_fail"; + protected const string SuccessMessageStringIdSuffix = "_succ"; + protected const string FailureMessageStringIdSuffix = "_fail"; // the toogle for this provider, assigned automatically by AllotToolController public virtual SettingHandle ProviderHandle { get; set; } diff --git a/Source/Context/DesignatorContextMenuController.cs b/Source/Context/DesignatorContextMenuController.cs index 202c441..261158d 100644 --- a/Source/Context/DesignatorContextMenuController.cs +++ b/Source/Context/DesignatorContextMenuController.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; using System.Linq; +using HugsLib.Utils; +using RimWorld; using UnityEngine; using Verse; @@ -10,9 +12,29 @@ namespace AllowTool.Context { /// Instantiates individual handlers, processess input events and draws overlay icons. /// public static class DesignatorContextMenuController { + private enum MouseButtons { + Left = 0, Right = 1 + } + private static readonly Dictionary designatorMenuProviders = new Dictionary(); - private static readonly List reverseDesignatorsForRemoval = new List(); + private static readonly List> currentDrawnReverseDesignators = new List>(); private static readonly Vector2 overlayIconOffset = new Vector2(59f, 2f); + private static readonly HashSet reversePickingSupportedDesignators = new HashSet { + typeof(Designator_Cancel), + typeof(Designator_Claim), + typeof(Designator_Deconstruct), + typeof(Designator_Uninstall), + typeof(Designator_Haul), + typeof(Designator_Hunt), + typeof(Designator_Slaughter), + typeof(Designator_Tame), + typeof(Designator_PlantsCut), + typeof(Designator_PlantsHarvest), + typeof(Designator_Mine), + typeof(Designator_Strip), + typeof(Designator_RearmTrap), + typeof(Designator_Open) + }; private static List _providers; public static List MenuProviderInstances { @@ -59,11 +81,14 @@ public static void DrawCommandOverlayIfNeeded(Command gizmo, Vector2 topLeft) { // try catch a right click on a supported designator. Left clicks should return false. public static bool TryProcessDesignatorInput(Designator designator) { try { - if (Event.current.button != 1) return false; - foreach (var provider in MenuProviderInstances) { - if (provider.HandledDesignatorType.IsInstanceOfType(designator)) { - provider.OpenContextMenu(designator); - return true; + if (Event.current.button == (int)MouseButtons.Left && HugsLibUtility.ShiftIsHeld && AllowToolController.Instance.ReverseDesignatorPickSetting) { + return TryPickDesignatorFromReverseDesignator(designator); + } else if (Event.current.button == (int)MouseButtons.Right) { + foreach (var provider in MenuProviderInstances) { + if (provider.HandledDesignatorType.IsInstanceOfType(designator)) { + provider.OpenContextMenu(designator); + return true; + } } } } catch (Exception e) { @@ -72,20 +97,28 @@ public static bool TryProcessDesignatorInput(Designator designator) { return false; } - // called when a designator is selected and the context action key is pressed - public static void DoContextMenuActionForActiveDesignator() { + public static void ProcessContextActionHotkeyPress() { var selectedDesignator = Find.DesignatorManager.SelectedDesignator; - if (selectedDesignator == null || !designatorMenuProviders.ContainsKey(selectedDesignator)) return; - designatorMenuProviders[selectedDesignator].HotkeyAction(selectedDesignator); + if (selectedDesignator != null && designatorMenuProviders.ContainsKey(selectedDesignator)) { + designatorMenuProviders[selectedDesignator].HotkeyAction(selectedDesignator); + } else if(AllowToolController.Instance.ExtendedContextActionSetting.Value) { + // activate hotkey action for first visible reverse designator + foreach (var pair in currentDrawnReverseDesignators) { + if (designatorMenuProviders.ContainsKey(pair.Key)) { + designatorMenuProviders[pair.Key].HotkeyAction(pair.Value); + break; + } + } + } } // called every OnGUI- Commands for reverse designators are instantiated each time they are drawn, so we need to discard the old ones public static void ClearReverseDesignatorPairs() { - if (reverseDesignatorsForRemoval.Count > 0) { - foreach (var command in reverseDesignatorsForRemoval) { - if (designatorMenuProviders.ContainsKey(command)) designatorMenuProviders.Remove(command); + if (currentDrawnReverseDesignators.Count > 0) { + foreach (var pair in currentDrawnReverseDesignators) { + if (designatorMenuProviders.ContainsKey(pair.Key)) designatorMenuProviders.Remove(pair.Key); } - reverseDesignatorsForRemoval.Clear(); + currentDrawnReverseDesignators.Clear(); } } @@ -100,7 +133,7 @@ public static void RegisterReverseDesignatorPair(Designator designator, Command_ }; var providers = MenuProviderInstances; TryBindDesignatorToHandler(designator, designatorButton, providers); - reverseDesignatorsForRemoval.Add(designatorButton); + currentDrawnReverseDesignators.Add(new KeyValuePair(designatorButton, designator)); } public static void CheckForMemoryLeak() { @@ -110,6 +143,14 @@ public static void CheckForMemoryLeak() { } } + private static bool TryPickDesignatorFromReverseDesignator(Designator designator) { + if (designator is Designator_SelectableThings || (designator!=null && reversePickingSupportedDesignators.Contains(designator.GetType()))) { + Find.DesignatorManager.Select(designator); + return true; + } + return false; + } + private static List InstantiateProviders() { var providers = new List(); try { diff --git a/Source/Context/MenuProvider_HaulUrgently.cs b/Source/Context/MenuProvider_HaulUrgently.cs index f3120c0..54832a1 100644 --- a/Source/Context/MenuProvider_HaulUrgently.cs +++ b/Source/Context/MenuProvider_HaulUrgently.cs @@ -34,14 +34,14 @@ public override void ContextMenuAction(Designator designator, Map map) { // skip rock chunks in designation, select only visible on screen private void HaulVisibleAction(Designator designator, Map map) { var visibleRect = GetVisibleMapRect(); - DesignateWithPredicate(designator,map, thing => visibleRect.Contains(thing.Position)); + DesignateWithPredicate(designator, map, thing => visibleRect.Contains(thing.Position), "Designator_context_urgent_visible_succ"); } private void HaulEverythingAction(Designator designator, Map map) { DesignateWithPredicate(designator, map); } - private void DesignateWithPredicate(Designator designator, Map map, Func shouldDesignateThing = null) { + private void DesignateWithPredicate(Designator designator, Map map, Func shouldDesignateThing = null, string successMessageKey = null) { int hitCount = 0; foreach (var thing in map.listerThings.ThingsInGroup(DesingatorRequestGroup)) { if (ValidForDesignation(thing) && @@ -53,7 +53,14 @@ private void DesignateWithPredicate(Designator designator, Map map, Func 0) { + Messages.Message(successMessageKey.Translate(hitCount), MessageSound.Benefit); + } else { + Messages.Message((EntryTextKey + FailureMessageStringIdSuffix).Translate(), MessageSound.RejectInput); + } } // code swiped from ThingSelectionUtility diff --git a/Source/Context/MenuProvider_SelectSimilar.cs b/Source/Context/MenuProvider_SelectSimilar.cs index f1a867d..f0af4ab 100644 --- a/Source/Context/MenuProvider_SelectSimilar.cs +++ b/Source/Context/MenuProvider_SelectSimilar.cs @@ -21,7 +21,10 @@ public override Type HandledDesignatorType { public override void ContextMenuAction(Designator designator, Map map) { var des = (Designator_SelectSimilar) designator; - des = des.GetNonReverseVersion(); + var reverse = des as Designator_SelectSimilarReverse; + if (reverse != null) { + des = reverse.GetNonReverseVersion(); + } if (Find.Selector.NumSelected == 0) { Messages.Message("Designator_context_similar_fail".Translate(), MessageSound.RejectInput); return; diff --git a/Source/Designators/Designator_SelectSimilar.cs b/Source/Designators/Designator_SelectSimilar.cs index ba6aed3..2a7aecb 100644 --- a/Source/Designators/Designator_SelectSimilar.cs +++ b/Source/Designators/Designator_SelectSimilar.cs @@ -19,14 +19,8 @@ public class Designator_SelectSimilar : Designator_SelectableThings { private const int MaxNumListedConstraints = 5; private readonly Dictionary selectionConstraints = new Dictionary(); - private readonly bool reverseDesignatorMode; private bool constraintsNeedReindexing; private string readableConstraintList; - - private Selector selectorRef; - private Selector Selector { // cache selector to avoid lots of unnecessary routing calls - get { return selectorRef ?? (selectorRef = Find.Selector); } - } private int numDesignated; public override int GetNumDesigantedThings() { @@ -40,48 +34,24 @@ private bool AnySelectionContstraints { public Designator_SelectSimilar(ThingDesignatorDef def) : base(def) { } - public Designator_SelectSimilar(ThingDesignatorDef def, bool reverseDesignatorMode) : base(def) { - this.reverseDesignatorMode = reverseDesignatorMode; - } - public override void Selected() { base.Selected(); ReindexSelectionConstraints(); } - - // ensure we used the proper designator for the context action, that does not have its constraints removed - public Designator_SelectSimilar GetNonReverseVersion() { - return !reverseDesignatorMode ? this : (Designator_SelectSimilar) AllowToolController.Instance.TryGetDesignator(AllowToolDefOf.SelectSimilarDesignator); - } - - // used by dragger and reverse designator. We want the reverse designator to always show, but ignoring constraints breaks the context action + public override AcceptanceReport CanDesignateThing(Thing thing) { return thing.def != null && thing.def.selectable && thing.def.label != null && !BlockedByFog(thing.Position, thing.Map) && - (reverseDesignatorMode || ThingMatchesSelectionConstraints(thing) || AllowToolController.Instance.Dragger.SelectingSingleCell) && // this allows us to select items that don't match the selection conststraints if we are not dragging, only clicking - (reverseDesignatorMode || SelectionLimitAllowsAdditionalThing()); + (ThingMatchesSelectionConstraints(thing) || AllowToolController.Instance.Dragger.SelectingSingleCell) && // this allows us to select items that don't match the selection conststraints if we are not dragging, only clicking + SelectionLimitAllowsAdditionalThing(); } public override void DesignateThing(Thing t) { TrySelectThing(t); } - protected override void FinalizeDesignationSucceeded() { - if (reverseDesignatorMode) { - Log.Message("xx"); - // intercept call from the reverse designator button - // activate the regualar select similar designator for the player to select more items - var selectSimilarNonReverse = GetNonReverseVersion(); - if (Find.DesignatorManager.SelectedDesignator != selectSimilarNonReverse) { - // debounce multiple selected items - Find.DesignatorManager.Select(selectSimilarNonReverse); - } - } - base.FinalizeDesignationSucceeded(); - } - public override void DesignateSingleCell(IntVec3 cell) { var map = Find.VisibleMap; var cellThings = map.thingGrid.ThingsListAtFast(cell); @@ -118,18 +88,19 @@ public override void SelectedOnGUI() { } public bool SelectionLimitAllowsAdditionalThing() { - return Selector.NumSelected < AllowToolController.Instance.SelectionLimitSetting.Value || AllowToolController.Instance.Dragger.SelectingSingleCell || HugsLibUtility.AltIsHeld; + return Find.Selector.NumSelected < AllowToolController.Instance.SelectionLimitSetting.Value || AllowToolController.Instance.Dragger.SelectingSingleCell || HugsLibUtility.AltIsHeld; } // generate an index of defs to compare other things against, based on currently selected things public void ReindexSelectionConstraints() { try { + var selector = Find.Selector; constraintsNeedReindexing = false; selectionConstraints.Clear(); readableConstraintList = ""; - if (Selector.NumSelected == 0) return; + if (selector.NumSelected == 0) return; // get defs of selected objects, count duplicates - foreach (var selectedObject in Selector.SelectedObjects) { + foreach (var selectedObject in selector.SelectedObjects) { var thing = selectedObject as Thing; if (thing == null || thing.def == null || !thing.def.selectable) continue; int constraintHash = GetConstraintHashForThing(thing); @@ -164,8 +135,9 @@ public void ReindexSelectionConstraints() { } public bool TrySelectThing(Thing thing) { - if (!CanDesignateThing(thing).Accepted || Selector.IsSelected(thing)) return false; - Selector.SelectedObjects.Add(thing); // manually adding objects to the selection list gets around the stock selection limit + var selector = Find.Selector; + if (!CanDesignateThing(thing).Accepted || selector.IsSelected(thing)) return false; + selector.SelectedObjects.Add(thing); // manually adding objects to the selection list gets around the stock selection limit SelectionDrawer.Notify_Selected(thing); if (!AnySelectionContstraints) { ReindexSelectionConstraints(); @@ -177,7 +149,7 @@ public bool TrySelectThing(Thing thing) { private void ProcessSingleCellClick(IntVec3 cell) { if (!HugsLibUtility.ShiftIsHeld) { - Selector.ClearSelection(); + Find.Selector.ClearSelection(); ReindexSelectionConstraints(); } if (cell.IsValid) { @@ -195,9 +167,9 @@ private bool BlockedByFog(IntVec3 cell, Map map) { return map.fogGrid.IsFogged(cell) && !DebugSettings.godMode; } - // close architect menu if anything wa selected + // close architect menu if anything was selected private void TryCloseArchitectMenu() { - if (Selector.NumSelected == 0) return; + if (Find.Selector.NumSelected == 0) return; if (Find.MainTabsRoot.OpenTab != MainButtonDefOf.Architect) return; Find.MainTabsRoot.EscapeCurrentTab(); } diff --git a/Source/Patches/Designator_ProcessInput_Patch.cs b/Source/Patches/Designator_ProcessInput_Patch.cs index 5816c9d..aa2a2d9 100644 --- a/Source/Patches/Designator_ProcessInput_Patch.cs +++ b/Source/Patches/Designator_ProcessInput_Patch.cs @@ -4,7 +4,7 @@ namespace AllowTool.Patches { /// - /// Intercepts right clicks on supported designators, ignores other interactions + /// Intercepts right clicks and shift-left clicks on supported designators, ignores other interactions /// [HarmonyPatch(typeof(Designator))] [HarmonyPatch("ProcessInput")] diff --git a/Source/Reverse/Designator_SelectSimilarReverse.cs b/Source/Reverse/Designator_SelectSimilarReverse.cs new file mode 100644 index 0000000..a5e91d4 --- /dev/null +++ b/Source/Reverse/Designator_SelectSimilarReverse.cs @@ -0,0 +1,36 @@ +using System; +using Verse; + +namespace AllowTool { + /// + /// A stub for use as a reverse designator. + /// We can't use the regular one, because the selection constraints mess with the visibility of the reverse designator. + /// Instead of designating, picks up the actual SelectSimilar designator. + /// + public class Designator_SelectSimilarReverse : Designator_SelectSimilar { + public Designator_SelectSimilarReverse(ThingDesignatorDef def) : base(def) { + } + + public Designator_SelectSimilar GetNonReverseVersion() { + var des = (Designator_SelectSimilar) AllowToolController.Instance.TryGetDesignator(AllowToolDefOf.SelectSimilarDesignator); + if (des == null) { + throw new Exception("Could not get Designator_SelectSimilar from AllowToolController"); + } + return des; + } + + public override AcceptanceReport CanDesignateThing(Thing thing) { + return thing.def != null && + thing.def.selectable && + thing.def.label != null && + thing.Map != null && + !thing.Map.fogGrid.IsFogged(thing.Position); + } + + protected override void FinalizeDesignationSucceeded() { + var selectSimilarNonReverse = GetNonReverseVersion(); + Find.DesignatorManager.Select(selectSimilarNonReverse); + base.FinalizeDesignationSucceeded(); + } + } +} \ No newline at end of file diff --git a/Source/Reverse/ReverseDesignatorDef.cs b/Source/Reverse/ReverseDesignatorDef.cs new file mode 100644 index 0000000..b21c304 --- /dev/null +++ b/Source/Reverse/ReverseDesignatorDef.cs @@ -0,0 +1,13 @@ +using System; +using Verse; + +namespace AllowTool { + /// + /// Def for AllowTool designators to be used as reverse designators (designators shown on selected items). + /// These are automatically instantiated and injected. + /// + public class ReverseDesignatorDef : Def { + public ThingDesignatorDef designatorDef; + public Type designatorClass; + } +} \ No newline at end of file diff --git a/Source/ReverseDesignatorProvider.cs b/Source/ReverseDesignatorProvider.cs index a705f37..7c6bb1c 100644 --- a/Source/ReverseDesignatorProvider.cs +++ b/Source/ReverseDesignatorProvider.cs @@ -8,17 +8,13 @@ namespace AllowTool { public static class ReverseDesignatorProvider { public static void OnReverseDesignatorInit(ReverseDesignatorDatabase database) { var designatorsList = (List)AllowToolController.ReverseDesignatorDatabaseDesListField.GetValue(database); - if (AllowToolController.Instance.IsDesignatorEnabledInSettings(AllowToolDefOf.HaulUrgentlyDesignator)) { - var haulUrgently = new Designator_HaulUrgently(AllowToolDefOf.HaulUrgentlyDesignator); - if (Current.Game.Rules.DesignatorAllowed(haulUrgently)) { - designatorsList.Add(haulUrgently); - } - } - if (AllowToolController.Instance.IsDesignatorEnabledInSettings(AllowToolDefOf.SelectSimilarDesignator)) { - var selectSimilar = new Designator_SelectSimilar(AllowToolDefOf.SelectSimilarDesignator, true); - if (Current.Game.Rules.DesignatorAllowed(selectSimilar)) { - designatorsList.Add(selectSimilar); - } + foreach (var def in DefDatabase.AllDefs) { + if (AllowToolController.Instance.IsReverseDesignatorEnabledInSettings(def)) { + var des = AllowToolController.Instance.InstantiateDesignator(def.designatorClass, def.designatorDef); + if (Current.Game.Rules.DesignatorAllowed(des)) { + designatorsList.Add(des); + } + } } } }