diff --git a/MonkeyLoader.Resonite.Integration/Locale/Monkeys/de.json b/MonkeyLoader.Resonite.Integration/Locale/Monkeys/de.json index 4062488..12334dc 100644 --- a/MonkeyLoader.Resonite.Integration/Locale/Monkeys/de.json +++ b/MonkeyLoader.Resonite.Integration/Locale/Monkeys/de.json @@ -95,7 +95,7 @@ "MonkeyLoader.GamePacks.Resonite.SyncMemberEditorBuilderInjector.Name": "Sync Member Editor Builder Injektor", "MonkeyLoader.GamePacks.Resonite.SyncMemberEditorBuilderInjector.Description": "Versendet die verschiedenen Build Member Editor Events, damit Monkeys die Generierung dieser überschreiben können.", - "MonkeyLoader.GamePacks.Resonite.ButtonDelegateTooltipResolver.Name": "Button Delegate Tooltip Auflöser", + "MonkeyLoader.GamePacks.Resonite.ButtonDelegateTooltipResolver.Name": "Delegate Tooltip Auflöser", "MonkeyLoader.GamePacks.Resonite.ButtonDelegateTooltipResolver.Description": "Wandelt das SyncDelegate Ziel eines Buttons in den Schlüssel für eine Übersetzungsnachricht um, damit diese als Tooltip angezeigt werden kann.", "MonkeyLoader.GamePacks.Resonite.ButtonTooltips.Name": "Button Tooltips", @@ -107,6 +107,9 @@ "MonkeyLoader.GamePacks.Resonite.HyperlinkTooltipResolver.Name": "Hyperlink Tooltip Auflöser", "MonkeyLoader.GamePacks.Resonite.HyperlinkTooltipResolver.Description": "Löst die Anfrage für den Tooltip eines Buttons basierend dem Grund und der URL einer Hyperlink-Komponente auf.
Diese können zu einem weiteren Tooltip für den Button hinzugefügt werden.", + "MonkeyLoader.GamePacks.Resonite.ReferenceProxySourceTooltipResolver.Name": "Referenzproxy Tooltip Auflöser", + "MonkeyLoader.GamePacks.Resonite.ReferenceProxySourceTooltipResolver.Description": "Löst die Anfrage für den Tooltip eines Buttons basierend auf der Zielreferenz einer ReferenceProxySource-Komponent auf.
Used for components and fields in inspectors.", + "MonkeyLoader.GamePacks.Resonite.TooltipManager.Name": "Tooltip Manager", "MonkeyLoader.GamePacks.Resonite.TooltipManager.Description": "Versendet die Tooltip Auflösungsanfragen aus verschiedenen Quellen. Das Tooltipsystem basiert auf dem Tooltippery Mod, der ursprünglich von Psychpsyo erstellt wurde.", diff --git a/MonkeyLoader.Resonite.Integration/Locale/Monkeys/en.json b/MonkeyLoader.Resonite.Integration/Locale/Monkeys/en.json index 78c8b42..f44ccbd 100644 --- a/MonkeyLoader.Resonite.Integration/Locale/Monkeys/en.json +++ b/MonkeyLoader.Resonite.Integration/Locale/Monkeys/en.json @@ -95,7 +95,7 @@ "MonkeyLoader.GamePacks.Resonite.SyncMemberEditorBuilderInjector.Name": "Sync Member Editor Builder Injector", "MonkeyLoader.GamePacks.Resonite.SyncMemberEditorBuilderInjector.Description": "Sends out the various Build Member Editor events to allow monkeys to override the generation of them.", - "MonkeyLoader.GamePacks.Resonite.ButtonDelegateTooltipResolver.Name": "Button Delegate Tooltip Resolver", + "MonkeyLoader.GamePacks.Resonite.ButtonDelegateTooltipResolver.Name": "Delegate Tooltip Resolver", "MonkeyLoader.GamePacks.Resonite.ButtonDelegateTooltipResolver.Description": "Turns the SyncDelegate targeted by a Button into a locale key to display as a tooltip.", "MonkeyLoader.GamePacks.Resonite.ButtonTooltips.Name": "Button Tooltips", @@ -107,6 +107,9 @@ "MonkeyLoader.GamePacks.Resonite.HyperlinkTooltipResolver.Name": "Hyperlink Tooltip Resolver", "MonkeyLoader.GamePacks.Resonite.HyperlinkTooltipResolver.Description": "Resolves the tooltip for a button based on a Hyperlink component's URL and reason.
They may be added on to another tooltip for the button.", + "MonkeyLoader.GamePacks.Resonite.ReferenceProxySourceTooltipResolver.Name": "Reference Proxy Tooltip Resolver", + "MonkeyLoader.GamePacks.Resonite.ReferenceProxySourceTooltipResolver.Description": "Resolves the tooltip for a button based on a ReferenceProxySource component's target reference.
Used for components and fields in inspectors.", + "MonkeyLoader.GamePacks.Resonite.TooltipManager.Name": "Tooltip Manager", "MonkeyLoader.GamePacks.Resonite.TooltipManager.Description": "Sends out tooltip resolve requests from different sources. The tooltip system is based on the Tooltippery mod originally created by Psychpsyo.", diff --git a/MonkeyLoader.Resonite.Integration/UI/Tooltips/ButtonDelegateTooltipResolver.cs b/MonkeyLoader.Resonite.Integration/UI/Tooltips/ButtonDelegateTooltipResolver.cs index 6eccfa0..486b399 100644 --- a/MonkeyLoader.Resonite.Integration/UI/Tooltips/ButtonDelegateTooltipResolver.cs +++ b/MonkeyLoader.Resonite.Integration/UI/Tooltips/ButtonDelegateTooltipResolver.cs @@ -2,12 +2,7 @@ using EnumerableToolkit; using FrooxEngine; using FrooxEngine.UIX; -using System; -using System.Collections.Generic; -using System.Linq; using System.Reflection; -using System.Text; -using System.Threading.Tasks; namespace MonkeyLoader.Resonite.UI.Tooltips { diff --git a/MonkeyLoader.Resonite.Integration/UI/Tooltips/ButtonTooltips.cs b/MonkeyLoader.Resonite.Integration/UI/Tooltips/ButtonTooltips.cs index 7201b54..f3a60f7 100644 --- a/MonkeyLoader.Resonite.Integration/UI/Tooltips/ButtonTooltips.cs +++ b/MonkeyLoader.Resonite.Integration/UI/Tooltips/ButtonTooltips.cs @@ -1,13 +1,6 @@ -using Elements.Core; -using FrooxEngine; +using FrooxEngine; using FrooxEngine.UIX; using HarmonyLib; -using MonkeyLoader.Patching; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace MonkeyLoader.Resonite.UI.Tooltips { diff --git a/MonkeyLoader.Resonite.Integration/UI/Tooltips/CommentTooltipResolver.cs b/MonkeyLoader.Resonite.Integration/UI/Tooltips/CommentTooltipResolver.cs index f2ed7ae..a23cfac 100644 --- a/MonkeyLoader.Resonite.Integration/UI/Tooltips/CommentTooltipResolver.cs +++ b/MonkeyLoader.Resonite.Integration/UI/Tooltips/CommentTooltipResolver.cs @@ -1,10 +1,5 @@ using FrooxEngine; -using System; -using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace MonkeyLoader.Resonite.UI.Tooltips { diff --git a/MonkeyLoader.Resonite.Integration/UI/Tooltips/HyperlinkTooltipResolver.cs b/MonkeyLoader.Resonite.Integration/UI/Tooltips/HyperlinkTooltipResolver.cs index f29805c..887e76d 100644 --- a/MonkeyLoader.Resonite.Integration/UI/Tooltips/HyperlinkTooltipResolver.cs +++ b/MonkeyLoader.Resonite.Integration/UI/Tooltips/HyperlinkTooltipResolver.cs @@ -1,11 +1,6 @@ using Elements.Core; using FrooxEngine; -using System; -using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace MonkeyLoader.Resonite.UI.Tooltips { diff --git a/MonkeyLoader.Resonite.Integration/UI/Tooltips/ReferenceProxySourceTooltipResolver.cs b/MonkeyLoader.Resonite.Integration/UI/Tooltips/ReferenceProxySourceTooltipResolver.cs new file mode 100644 index 0000000..7c70618 --- /dev/null +++ b/MonkeyLoader.Resonite.Integration/UI/Tooltips/ReferenceProxySourceTooltipResolver.cs @@ -0,0 +1,77 @@ +using Elements.Core; +using FrooxEngine; +using System.Diagnostics.CodeAnalysis; +using System.Reflection; + +namespace MonkeyLoader.Resonite.UI.Tooltips +{ + internal sealed class ReferenceProxySourceTooltipResolver : ResoniteCancelableEventHandlerMonkey + { + public override bool CanBeDisabled => true; + + public override int Priority => HarmonyLib.Priority.HigherThanNormal + 1; + + public override bool SkipCanceled => true; + + public static bool TryGetTooltipLabel(IButton button, [NotNullWhen(true)] out LocaleString? label) + { + label = null; + + if (button.Slot.GetComponent() is not ReferenceProxySource proxySource) + return false; + + // Slots, Users, (User)Components, SyncObjects themselves + if (proxySource.Reference.Target is Worker targetWorker) + { + label = $"Tooltip.{string.Join('.', GetAllNestedNames(targetWorker.WorkerType).Reverse())}"; + return true; + } + + // Any synchronized data owned by Workers + if (proxySource.Reference.Target is not SyncElement targetElement) + return false; + + var nesting = 0; + + // FieldList are SyncElements with more SyncElements inside + // We want to use the name of the outermost one + // Not sure if there is any deeper nestings than one, but just to be sure... + while (targetElement.Parent is SyncElement parentElement) + { + ++nesting; + targetElement = parentElement; + } + + // Slots, Users, (User)Components, SyncObjects + if (targetElement.FindNearestParent() is not Worker parentWorker) + return false; + + if (parentWorker.GetSyncMemberFieldInfo(targetElement.Name) is not FieldInfo targetField) + return false; + + label = (nesting is 0 + ? $"Tooltip.{string.Join('.', GetAllNestedNames(targetField.DeclaringType!).Reverse())}.{targetElement.Name}" + : $"Tooltip.{string.Join('.', GetAllNestedNames(targetField.DeclaringType!).Reverse())}.{targetElement.Name}.{string.Join('.', Enumerable.Repeat("Item", nesting))}" + ).AsLocaleKey(); + + return true; + } + + protected override void Handle(ResolveTooltipLabelEvent eventData) + { + if (TryGetTooltipLabel(eventData.Button, out var label)) + eventData.Label = label; + } + + private static IEnumerable GetAllNestedNames(Type type) + { + yield return type.Name; + + while (type.IsNested) + { + type = type.DeclaringType!; + yield return type.Name; + } + } + } +} \ No newline at end of file diff --git a/MonkeyLoader.Resonite.Integration/UI/Tooltips/Tooltip.cs b/MonkeyLoader.Resonite.Integration/UI/Tooltips/Tooltip.cs index 93b9a8e..2111476 100644 --- a/MonkeyLoader.Resonite.Integration/UI/Tooltips/Tooltip.cs +++ b/MonkeyLoader.Resonite.Integration/UI/Tooltips/Tooltip.cs @@ -1,12 +1,6 @@ using Elements.Core; using FrooxEngine; using FrooxEngine.UIX; -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace MonkeyLoader.Resonite.UI.Tooltips { diff --git a/MonkeyLoader.Resonite.Integration/UI/Tooltips/TooltipConfig.cs b/MonkeyLoader.Resonite.Integration/UI/Tooltips/TooltipConfig.cs index c4c3069..1d6cd5c 100644 --- a/MonkeyLoader.Resonite.Integration/UI/Tooltips/TooltipConfig.cs +++ b/MonkeyLoader.Resonite.Integration/UI/Tooltips/TooltipConfig.cs @@ -3,7 +3,6 @@ using FrooxEngine; using MonkeyLoader.Configuration; using MonkeyLoader.Resonite.Configuration; -using System; namespace MonkeyLoader.Resonite.UI.Tooltips { diff --git a/MonkeyLoader.Resonite.Integration/UI/Tooltips/TooltipManager.cs b/MonkeyLoader.Resonite.Integration/UI/Tooltips/TooltipManager.cs index 90fa6aa..9d7e4e3 100644 --- a/MonkeyLoader.Resonite.Integration/UI/Tooltips/TooltipManager.cs +++ b/MonkeyLoader.Resonite.Integration/UI/Tooltips/TooltipManager.cs @@ -2,13 +2,7 @@ using EnumerableToolkit; using FrooxEngine; using MonkeyLoader.Events; -using System; -using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; namespace MonkeyLoader.Resonite.UI.Tooltips {