Skip to content

Commit 71f939a

Browse files
committed
Improve ReferenceProxySource resolve and add complementary SlotRecord resolver
1 parent 29e9fd4 commit 71f939a

4 files changed

Lines changed: 117 additions & 25 deletions

File tree

MonkeyLoader.Resonite.Integration/Locale/General/de.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@
1919
"MonkeyLoader.GamePacks.Resonite.Tooltip.OpenHyperlink.WithLabel": "{label}<size=50%><br/><br/></size><b>Grund:</b> <i>{reason}</i><br/><b>URL:</b> <i>{url}</i>",
2020

2121
"MonkeyLoader.GamePacks.Resonite.Tooltip.WikiHyperlink.Component": "Öffnet den Resonite Wiki Artikel über diese Komponente.",
22-
"MonkeyLoader.GamePacks.Resonite.Tooltip.WikiHyperlink.ProtoFlux": "Öffnet den Resonite Wiki Artikel über diese ProtoFlux Node."
22+
"MonkeyLoader.GamePacks.Resonite.Tooltip.WikiHyperlink.ProtoFlux": "Öffnet den Resonite Wiki Artikel über diese ProtoFlux Node.",
23+
24+
"MonkeyLoader.GamePacks.Resonite.Tooltip.ReferenceProxySource": "Greif eine Referenz zu {target}.",
25+
26+
"MonkeyLoader.GamePacks.Resonite.Tooltip.SlotRecord.Generic": "Greif eine Referenz zu diesem Slot, oder ziehe andere Slots hierher, um sie unter diesem einzuhängen, wobei ihre globale Position erhalten bleibt.",
27+
"MonkeyLoader.GamePacks.Resonite.Tooltip.SlotRecord.Inspector": "Öffnet diesen Slot im Inspektor, greif eine Referenz zu ihm, oder ziehe andere Slots hierher, um sie unter diesem einzuhängen, wobei ihre globale Position erhalten bleibt."
2328
}
2429
}

MonkeyLoader.Resonite.Integration/Locale/General/en.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@
1919
"MonkeyLoader.GamePacks.Resonite.Tooltip.OpenHyperlink.WithLabel": "{label}<size=50%><br/><br/></size><b>Reason:</b> <i>{reason}</i><br/><b>URL:</b> <i>{url}</i>",
2020

2121
"MonkeyLoader.GamePacks.Resonite.Tooltip.WikiHyperlink.Component": "Opens the Resonite Wiki article about this Component.",
22-
"MonkeyLoader.GamePacks.Resonite.Tooltip.WikiHyperlink.ProtoFlux": "Opens the Resonite Wiki article about this ProtoFlux node."
22+
"MonkeyLoader.GamePacks.Resonite.Tooltip.WikiHyperlink.ProtoFlux": "Opens the Resonite Wiki article about this ProtoFlux node.",
23+
24+
"MonkeyLoader.GamePacks.Resonite.Tooltip.ReferenceProxySource": "Grab a reference to {target}.",
25+
26+
"MonkeyLoader.GamePacks.Resonite.Tooltip.SlotRecord.Generic": "Grab a reference to this slot, or drag'n'drop other slots onto here to parent them to it while preserving their global position.",
27+
"MonkeyLoader.GamePacks.Resonite.Tooltip.SlotRecord.Inspector": "Opens this slot in the inspector, grab a reference to it, or drag'n'drop other slots onto here to parent them to this slot while preserving their global position."
2328
}
2429
}

MonkeyLoader.Resonite.Integration/UI/Tooltips/ReferenceProxySourceTooltipResolver.cs

Lines changed: 56 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Elements.Core;
22
using FrooxEngine;
3+
using FrooxEngine.UIX;
34
using System.Diagnostics.CodeAnalysis;
45
using System.Reflection;
56

@@ -20,15 +21,62 @@ public static bool TryGetTooltipLabel(IButton button, [NotNullWhen(true)] out Lo
2021
if (button.Slot.GetComponent<ReferenceProxySource>() is not ReferenceProxySource proxySource)
2122
return false;
2223

23-
// Slots, Users, (User)Components, SyncObjects themselves
24-
if (proxySource.Reference.Target is Worker targetWorker)
24+
var parentDevInterface = (button as Button)?.RectTransform?.Canvas.Slot.GetComponent<IDeveloperInterface>();
25+
26+
switch (parentDevInterface)
27+
{
28+
case UserInspector:
29+
case SceneInspector:
30+
case WorkerInspector:
31+
return TryGetInspectorTooltipLabel(proxySource.Reference.Target, out label);
32+
33+
default:
34+
label = Mod.GetLocaleString("Tooltip.ReferenceProxySource", "target", proxySource.Reference.Target.GetReferenceLabel());
35+
return true;
36+
}
37+
}
38+
39+
protected override void Handle(ResolveTooltipLabelEvent eventData)
40+
{
41+
if (!TryGetTooltipLabel(eventData.Button, out var label))
42+
return;
43+
44+
if (!TooltipConfig.Instance.EnableDebugButtonData && !label.Value.HasMessageInCurrent())
45+
return;
46+
47+
eventData.Label = label;
48+
49+
if (TooltipConfig.Instance.EnableDebugButtonData)
50+
Logger.Debug(() => $"LocaleKey: {eventData.Label.Value.content}");
51+
}
52+
53+
private static IEnumerable<string> GetAllNestedNames(Type type)
54+
{
55+
yield return type.Name;
56+
57+
while (type.IsNested)
58+
{
59+
type = type.DeclaringType!;
60+
yield return type.Name;
61+
}
62+
}
63+
64+
private static bool TryGetInspectorTooltipLabel(IWorldElement? target, [NotNullWhen(true)] out LocaleString? label)
65+
{
66+
label = null;
67+
68+
if (target is null)
69+
return false;
70+
71+
// Slot, Users, (User)Components, SyncObjects themselves
72+
if (target is Worker targetWorker)
2573
{
26-
label = $"Tooltip.{string.Join('.', GetAllNestedNames(targetWorker.WorkerType).Reverse())}";
74+
label = $"Tooltip.{string.Join('.', GetAllNestedNames(targetWorker.WorkerType).Reverse())}".AsModLocaleKey(Mod);
2775
return true;
2876
}
2977

3078
// Any synchronized data owned by Workers
31-
if (proxySource.Reference.Target is not SyncElement targetElement)
79+
if (target is not SyncElement targetElement)
3280
return false;
3381

3482
var nesting = 0;
@@ -49,29 +97,14 @@ public static bool TryGetTooltipLabel(IButton button, [NotNullWhen(true)] out Lo
4997
if (parentWorker.GetSyncMemberFieldInfo(targetElement.Name) is not FieldInfo targetField)
5098
return false;
5199

100+
var typeIdentity = string.Join('.', GetAllNestedNames(targetField.DeclaringType!).Reverse());
101+
52102
label = (nesting is 0
53-
? $"Tooltip.{string.Join('.', GetAllNestedNames(targetField.DeclaringType!).Reverse())}.{targetElement.Name}"
54-
: $"Tooltip.{string.Join('.', GetAllNestedNames(targetField.DeclaringType!).Reverse())}.{targetElement.Name}.{string.Join('.', Enumerable.Repeat("Item", nesting))}"
103+
? $"Tooltip.{typeIdentity}.{targetElement.Name}"
104+
: $"Tooltip.{typeIdentity}.{targetElement.Name}.{string.Join('.', Enumerable.Repeat("Item", nesting))}"
55105
).AsModLocaleKey(Mod);
56106

57107
return true;
58108
}
59-
60-
protected override void Handle(ResolveTooltipLabelEvent eventData)
61-
{
62-
if (TryGetTooltipLabel(eventData.Button, out var label))
63-
eventData.Label = label;
64-
}
65-
66-
private static IEnumerable<string> GetAllNestedNames(Type type)
67-
{
68-
yield return type.Name;
69-
70-
while (type.IsNested)
71-
{
72-
type = type.DeclaringType!;
73-
yield return type.Name;
74-
}
75-
}
76109
}
77110
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
using Elements.Core;
2+
using FrooxEngine;
3+
using FrooxEngine.UIX;
4+
using System.Diagnostics.CodeAnalysis;
5+
6+
namespace MonkeyLoader.Resonite.UI.Tooltips
7+
{
8+
internal sealed class SlotRecordTooltipResolver : ResoniteCancelableEventHandlerMonkey<SlotRecordTooltipResolver, ResolveTooltipLabelEvent>
9+
{
10+
public override bool CanBeDisabled => true;
11+
12+
public override int Priority => HarmonyLib.Priority.HigherThanNormal + 2;
13+
14+
public override bool SkipCanceled => true;
15+
16+
public static bool TryGetTooltipLabel(IButton button, [NotNullWhen(true)] out LocaleString? label)
17+
{
18+
label = null;
19+
20+
if (button.Slot.GetComponent<SlotRecord>() is not SlotRecord slotRecord)
21+
return false;
22+
23+
if (slotRecord.TargetSlot.Target is not Slot targetSlot)
24+
return false;
25+
26+
var parentDevInterface = (button as Button)?.RectTransform?.Canvas.Slot.GetComponent<IDeveloperInterface>();
27+
28+
switch (parentDevInterface)
29+
{
30+
case SceneInspector:
31+
case WorkerInspector:
32+
label = Mod.GetLocaleString("Tooltip.SlotRecord.Inspector");
33+
return true;
34+
35+
default:
36+
label = Mod.GetLocaleString("Tooltip.SlotRecord.Generic");
37+
return true;
38+
}
39+
}
40+
41+
protected override void Handle(ResolveTooltipLabelEvent eventData)
42+
{
43+
if (!TryGetTooltipLabel(eventData.Button, out var label))
44+
return;
45+
46+
eventData.Label = label;
47+
}
48+
}
49+
}

0 commit comments

Comments
 (0)