Skip to content

Commit 7577320

Browse files
ColinTimBarndtBanane9
authored andcommitted
Make renaming spaces a button action; add config option for experimental string input renaming.
1 parent 413054e commit 7577320

5 files changed

Lines changed: 122 additions & 47 deletions

File tree

DynamicVariablePowerTools/Locale/en.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,19 @@
1212
"DynamicVariablePowerTools.EnableLinkedComponentHierarchy.Button": "Output Component Hierarchy",
1313
"DynamicVariablePowerTools.EnableLinkedComponentHierarchy.Tooltip": "Generates a hierarchical list of all dynamic variable components linked to this space in the <i>Output</i> field.",
1414

15+
"DynamicVariablePowerTools.RenameDirectlyLinkedVariables.Name": "Rename Dynamic Variable Spaces",
16+
"DynamicVariablePowerTools.RenameDirectlyLinkedVariables.Description": "Adds a button to dynamic variable spaces for renaming all linked variables.",
17+
"DynamicVariablePowerTools.RenameDirectlyLinkedVariables.Button": "Rename",
18+
"DynamicVariablePowerTools.RenameDirectlyLinkedVariables.Tooltip": "Renames all linked variables.",
19+
1520
"DynamicVariablePowerTools.RenameDynamicVariables.Name": "Rename Dynamic Variables",
1621
"DynamicVariablePowerTools.RenameDynamicVariables.Description": "Adds a button to dynamic variables for renaming all matching linked variables.",
1722
"DynamicVariablePowerTools.RenameDynamicVariables.Button": "Rename",
1823
"DynamicVariablePowerTools.RenameDynamicVariables.Tooltip": "Renames all matching linked variables.",
1924

25+
"DynamicVariablePowerTools.Config.RenameOptions.Name": "Rename Options",
26+
"DynamicVariablePowerTools.Config.RenameOptions.Description": "Options for how dynamic variables should be renamed.",
27+
2028
"DynamicVariablePowerTools.DebugInfo.Name": "Debug Info"
2129
}
2230
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using Elements.Core;
2+
using FrooxEngine;
3+
using FrooxEngine.UIX;
4+
using MonkeyLoader.Resonite;
5+
using MonkeyLoader.Resonite.UI;
6+
using System;
7+
using System.Collections.Generic;
8+
using System.Text;
9+
10+
namespace DynamicVariablePowerTools
11+
{
12+
internal static class RenameButtonHelper
13+
{
14+
internal static void BuildRenameUI(this UIBuilder builder, IField<string> nameField, Action<string> onRename, LocaleString buttonText, LocaleString tooltipText)
15+
{
16+
var layout = builder.HorizontalLayout(4).Slot.DestroyWhenLocalUserLeaves();
17+
builder.PushStyle();
18+
var style = builder.Style;
19+
20+
style.FlexibleWidth = 1;
21+
var newNameField = builder.TextField(nameField.Value, parseRTF: false);
22+
23+
void ChangedListener(object _) => newNameField.Text.Content.Value = nameField.Value;
24+
nameField.Changed += ChangedListener;
25+
layout.Destroyed += _ => nameField.Changed -= ChangedListener;
26+
27+
style.FlexibleWidth = -1;
28+
style.MinWidth = 256;
29+
builder.LocalActionButton(buttonText, button => onRename(newNameField.Text.Content.Value))
30+
.WithTooltip(tooltipText);
31+
32+
builder.PopStyle();
33+
builder.NestOut();
34+
}
35+
}
36+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using MonkeyLoader.Configuration;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Text;
5+
6+
namespace DynamicVariablePowerTools
7+
{
8+
internal sealed class RenameConfig : SingletonConfigSection<RenameConfig>
9+
{
10+
private static readonly DefiningConfigKey<bool> _changeProtoFluxStringInputs = new("ChangeProtoFluxStringInputs", "Search and rename ProtoFlux inputs with the old name in the form OldName/* (Experimental).", () => false);
11+
12+
public bool ChangeProtoFluxStringInputs => _changeProtoFluxStringInputs;
13+
14+
public override string Description => "Rename Options";
15+
16+
public override string Id => "RenameOptions";
17+
18+
public override Version Version { get; } = new(1, 0);
19+
}
20+
}
Lines changed: 39 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,82 @@
11
using System;
2-
using System.Collections.Generic;
3-
using System.Linq;
4-
using System.Reflection;
52
using FrooxEngine;
63
using FrooxEngine.ProtoFlux;
74
using HarmonyLib;
85
using MonkeyLoader.Resonite;
6+
using MonkeyLoader.Resonite.UI.Inspectors;
97

108
namespace DynamicVariablePowerTools
119
{
1210
[HarmonyPatchCategory(nameof(RenameDirectlyLinkedVariables))]
1311
[HarmonyPatch(typeof(DynamicVariableSpace), nameof(DynamicVariableSpace.UpdateName))]
14-
internal sealed class RenameDirectlyLinkedVariables : ResoniteMonkey<RenameDirectlyLinkedVariables>
12+
internal sealed class RenameDirectlyLinkedVariables : ConfiguredResoniteInspectorMonkey<RenameDirectlyLinkedVariables, RenameConfig, BuildInspectorBodyEvent, DynamicVariableSpace>
1513
{
1614
//[AutoRegisterConfigKey]
1715
//private static ModConfigurationKey<bool> ChangeDynVarNamespaces = new ModConfigurationKey<bool>("ChangeDynVarNamespaces", "Enable searching and renaming directly linked variables and drivers when namespace changes.", () => false);
1816

1917
//[AutoRegisterConfigKey]
2018
//private static ModConfigurationKey<bool> ChangeLogixStringInputs = new ModConfigurationKey<bool>("ChangeLogixStringInputs", "Search and rename logix inputs with the old name in the form OldName/.* (Experimental).", () => false);
2119

22-
private static void Prefix(DynamicVariableSpace __instance, string ____lastName, bool ____lastNameSet)
20+
public override int Priority => HarmonyLib.Priority.Low;
21+
22+
protected override void Handle(BuildInspectorBodyEvent eventData)
23+
{
24+
var space = (DynamicVariableSpace)eventData.Worker;
25+
26+
eventData.UI.BuildRenameUI(
27+
space.SpaceName,
28+
onRename: newName => RenameSpace(space, newName),
29+
buttonText: this.GetLocaleString("Button"),
30+
tooltipText: this.GetLocaleString("Tooltip")
31+
);
32+
}
33+
34+
private static void RenameSpace(DynamicVariableSpace space, string newName)
2335
{
24-
var newName = DynamicVariableHelper.ProcessName(__instance.SpaceName.Value);
36+
newName = DynamicVariableHelper.ProcessName(newName);
37+
var currentName = space.SpaceName.Value;
2538

26-
if (/*!Config.GetValue(ChangeDynVarNamespaces) || */newName == ____lastName && ____lastNameSet)
27-
return;
39+
var prefixName = $"{currentName}/";
2840

29-
__instance.Slot.ForeachComponentInChildren<IDynamicVariable>(dynVar =>
41+
space.Slot.ForeachComponentInChildren<IDynamicVariable>(dynVar =>
3042
{
3143
DynamicVariableHelper.ParsePath(dynVar.VariableName, out var spaceName, out var variableName);
3244

33-
if (spaceName == null || Traverse.Create(dynVar).Field("handler").Field("_currentSpace").GetValue() != __instance)
45+
if (spaceName == null || Traverse.Create(dynVar).Field("handler").Field("_currentSpace").GetValue() != space)
3446
return;
3547

36-
var newVariableName = $"{newName}/{variableName}";
37-
3848
// TODO: Move to helper method
3949
var nameField = ((Worker)dynVar).TryGetField<string>("VariableName") ?? ((Worker)dynVar).TryGetField<string>("_variableName");
4050

41-
if (nameField is not null)
51+
if (nameField is not null && nameField.Value.StartsWith(prefixName))
4252
{
43-
nameField.Value = newVariableName;
53+
nameField.Value = $"{newName}/{variableName}";
4454
return;
4555
}
4656

4757
if (dynVar is ProtoFluxEngineProxy { Node.Target: IProtoFluxNode dynVarNode }
4858
&& dynVarNode.TryGetField("VariableName") is SyncRef<IGlobalValueProxy<string>> nameProxyRef
49-
&& nameProxyRef.Target is GlobalValue<string> nameProxy)
59+
&& nameProxyRef.Target is GlobalValue<string> nameProxy
60+
&& nameProxy.Value.Value.StartsWith(prefixName))
5061
{
51-
nameProxy.Value.Value = newVariableName;
62+
nameProxy.Value.Value = $"{newName}/{variableName}";
5263
return;
5364
}
54-
}, true, true);
55-
56-
//if (!Config.GetValue(ChangeLogixStringInputs))
57-
// return;
65+
}, includeLocal: true, cacheItems: true);
5866

59-
__instance.Slot.ForeachComponentInChildren<IInput<string>>(stringInput =>
67+
if (ConfigSection.ChangeProtoFluxStringInputs)
6068
{
61-
DynamicVariableHelper.ParsePath(stringInput.Value, out var spaceName, out var variableName);
62-
if (spaceName == null || spaceName != ____lastName)
63-
return;
69+
space.Slot.ForeachComponentInChildren<IInput<string>>(stringInput =>
70+
{
71+
DynamicVariableHelper.ParsePath(stringInput.Value, out var spaceName, out var variableName);
72+
if (spaceName == null || spaceName != currentName)
73+
return;
74+
75+
stringInput.Value = $"{newName}/{variableName}";
76+
}, includeLocal: true, cacheItems: true);
77+
}
6478

65-
stringInput.Value = $"{newName}/{variableName}";
66-
}, true, true);
79+
space.SpaceName.Value = newName;
6780
}
6881
}
6982
}

DynamicVariablePowerTools/RenameDynamicVariables.cs

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,13 @@
11
using Elements.Core;
22
using FrooxEngine;
33
using FrooxEngine.ProtoFlux;
4-
using FrooxEngine.UIX;
54
using MonkeyLoader.Resonite;
6-
using MonkeyLoader.Resonite.UI;
75
using MonkeyLoader.Resonite.UI.Inspectors;
86
using System;
9-
using System.Collections.Generic;
10-
using System.Text;
117

128
namespace DynamicVariablePowerTools
139
{
14-
internal class RenameDynamicVariables : ResoniteInspectorMonkey<RenameDynamicVariables, BuildInspectorBodyEvent>
10+
internal sealed class RenameDynamicVariables : ResoniteInspectorMonkey<RenameDynamicVariables, BuildInspectorBodyEvent>
1511
{
1612
public override int Priority => HarmonyLib.Priority.Low;
1713

@@ -23,22 +19,12 @@ protected override void Handle(BuildInspectorBodyEvent eventData)
2319
var dynVar = (IDynamicVariable)eventData.Worker;
2420
var nameField = ((Worker)dynVar).TryGetField<string>("VariableName");
2521

26-
var builder = eventData.UI;
27-
builder.HorizontalLayout(4).Slot.DestroyWhenLocalUserLeaves();
28-
builder.PushStyle();
29-
var style = builder.Style;
30-
31-
style.FlexibleWidth = 1;
32-
var newNameField = builder.TextField(dynVar.VariableName, parseRTF: false);
33-
nameField.Changed += _ => newNameField.Text.Content.Value = dynVar.VariableName;
34-
35-
style.FlexibleWidth = -1;
36-
style.MinWidth = 256;
37-
builder.LocalActionButton(this.GetLocaleString("Button"), button => RenameDynVar(dynVar, newNameField.Text.Content.Value))
38-
.WithTooltip(this.GetLocaleString("Tooltip"));
39-
40-
builder.PopStyle();
41-
builder.NestOut();
22+
eventData.UI.BuildRenameUI(
23+
nameField,
24+
onRename: newName => RenameDynVar(dynVar, newName),
25+
buttonText: this.GetLocaleString("Button"),
26+
tooltipText: this.GetLocaleString("Tooltip")
27+
);
4228
}
4329

4430
private static Type GetDynVarType(IDynamicVariable dynVar)
@@ -83,6 +69,18 @@ private static void RenameDynVar(IDynamicVariable dynVar, string newName)
8369
continue;
8470
}
8571
}
72+
73+
// Only attempt rename when the new name is directly binding ("space/name")
74+
if (RenameConfig.Instance.ChangeProtoFluxStringInputs && currentSpaceName != null)
75+
{
76+
linkedSpace.Slot.ForeachComponentInChildren<IInput<string>>(stringInput =>
77+
{
78+
if (stringInput.Value != currentFullName)
79+
return;
80+
81+
stringInput.Value = newName;
82+
}, includeLocal: true, cacheItems: true);
83+
}
8684
}
8785
}
8886
}

0 commit comments

Comments
 (0)