-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCopyHyperlink.cs
More file actions
72 lines (63 loc) · 2.82 KB
/
Copy pathCopyHyperlink.cs
File metadata and controls
72 lines (63 loc) · 2.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using System.Reflection.Emit;
using HarmonyLib;
using ResoniteModLoader;
using FrooxEngine;
using Elements.Core;
using FrooxEngine.UIX;
namespace CopyHyperlink;
public class CopyHyperlink : ResoniteMod
{
public override string Name => "CopyHyperlink";
public override string Author => "djsime1 / Zenuru";
public override string Version => "1.1.0";
public override string Link => "https://github.com/djsime1/CopyHyperlink";
private static ModConfiguration Config;
[AutoRegisterConfigKey]
private static readonly ModConfigurationKey<bool> skipOpenDelay = new("Skip Hyperlink 'Open' delay", "(Requires restart to change) Skips the 3 second delay before the 'Open' button enables.", () => true);
public static bool SkipOpenDelay => Config!.GetValue(skipOpenDelay);
public override void OnEngineInit()
{
Harmony harmony = new("je.dj.CopyHyperlink");
Config = GetConfiguration()!;
Config.Save();
harmony.PatchAll();
}
[HarmonyPatch(typeof(HyperlinkOpenDialog))]
class CopyHyperlinkPatches
{
[HarmonyPatch("OnAttach")]
[HarmonyPostfix]
public static void HyperlinkOpenDialog_OnAttach_Postfix(HyperlinkOpenDialog __instance, ref SyncRef<Button> ____openButton, Sync<Uri> ___URL)
{
if (__instance.InputInterface.Clipboard is null)
{
Warn("InputInterface has no Clipboard, CopyHyperlink can't do anything.");
return;
}
____openButton.Target.Slot.Parent.Children[^1].OrderOffset = 2; // Keep Cancel as last button
var ui = new UIBuilder(____openButton.Target.Slot.Parent);
RadiantUI_Constants.SetupEditorStyle(ui);
var btn = ui.Button("Interaction.CopyLink".AsLocaleKey(), RadiantUI_Constants.Sub.CYAN);
btn.Enabled = btn.InputInterface.IsClipboardSupported;
var text = btn.Slot.GetComponentInChildren<Text>();
btn.LocalPressed += (_, _) =>
{
__instance.InputInterface.Clipboard.SetText(___URL.Value.ToString());
text.LocaleContent = "General.CopiedToClipboard".AsLocaleKey();
__instance.RunInSeconds(2, () => text.LocaleContent = "Interaction.CopyLink".AsLocaleKey());
};
}
[HarmonyPatch("Setup")]
[HarmonyTranspiler]
public static IEnumerable<CodeInstruction> HyperlinkOpenDialog_Setup_Transpiler(IEnumerable<CodeInstruction> instructions)
{
foreach (var instruction in instructions)
{
if (instruction.LoadsConstant(HyperlinkOpenDialog.BUTTON_TIMEOUT_SECONDS) && SkipOpenDelay)
yield return new CodeInstruction(OpCodes.Ldc_I4_0);
else
yield return instruction;
}
}
}
}