Skip to content

Commit 413054e

Browse files
ColinTimBarndtBanane9
authored andcommitted
Implement dynamic variable renaming.
1 parent 75c2d2e commit 413054e

6 files changed

Lines changed: 112 additions & 46 deletions

File tree

DynamicVariablePowerTools/DebugInfoGenerator.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Collections.Generic;
44
using System.Linq;
55
using System.Text;
6+
using Elements.Core;
67
using FrooxEngine;
78
using MonkeyLoader.Resonite;
89
using MonkeyLoader.Resonite.UI;
@@ -70,7 +71,7 @@ private static void OutputLinkedVariables(DynamicVariableSpace space, Sync<strin
7071
{
7172
names.Append(identity.name);
7273
names.Append(" (");
73-
names.AppendTypeName(identity.type);
74+
names.Append(identity.type.GetNiceName());
7475
names.AppendLine(")");
7576
}
7677

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
11
{
2-
"localeCode": "en",
3-
"authors": [ "Banane9" ],
4-
"messages": {
5-
"DynamicVariablePowerTools.EnableLinkedVariablesList.Name": "Variable Definitions",
6-
"DynamicVariablePowerTools.EnableLinkedVariablesList.Description": "Allow generating a list of all dynamic variable definitions linked to a space.",
7-
"DynamicVariablePowerTools.EnableLinkedVariablesList.Button": "Output Variable Definitions",
8-
"DynamicVariablePowerTools.EnableLinkedVariablesList.Tooltip": "Generates a list of all dynamic variable definitions linked to this space in the <i>Output</i> field.",
2+
"localeCode": "en",
3+
"authors": [ "Banane9" ],
4+
"messages": {
5+
"DynamicVariablePowerTools.EnableLinkedVariablesList.Name": "Variable Definitions",
6+
"DynamicVariablePowerTools.EnableLinkedVariablesList.Description": "Allow generating a list of all dynamic variable definitions linked to a space.",
7+
"DynamicVariablePowerTools.EnableLinkedVariablesList.Button": "Output Variable Definitions",
8+
"DynamicVariablePowerTools.EnableLinkedVariablesList.Tooltip": "Generates a list of all dynamic variable definitions linked to this space in the <i>Output</i> field.",
99

10-
"DynamicVariablePowerTools.EnableLinkedComponentHierarchy.Name": "Component Hierarchy",
11-
"DynamicVariablePowerTools.EnableLinkedComponentHierarchy.Description": "Allow generating a hierarchical list of all dynamic variable components linked to a space.",
12-
"DynamicVariablePowerTools.EnableLinkedComponentHierarchy.Button": "Output Component Hierarchy",
13-
"DynamicVariablePowerTools.EnableLinkedComponentHierarchy.Tooltip": "Generates a hierarchical list of all dynamic variable components linked to this space in the <i>Output</i> field.",
10+
"DynamicVariablePowerTools.EnableLinkedComponentHierarchy.Name": "Component Hierarchy",
11+
"DynamicVariablePowerTools.EnableLinkedComponentHierarchy.Description": "Allow generating a hierarchical list of all dynamic variable components linked to a space.",
12+
"DynamicVariablePowerTools.EnableLinkedComponentHierarchy.Button": "Output Component Hierarchy",
13+
"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.DebugInfo.Name": "Debug Info"
16-
}
15+
"DynamicVariablePowerTools.RenameDynamicVariables.Name": "Rename Dynamic Variables",
16+
"DynamicVariablePowerTools.RenameDynamicVariables.Description": "Adds a button to dynamic variables for renaming all matching linked variables.",
17+
"DynamicVariablePowerTools.RenameDynamicVariables.Button": "Rename",
18+
"DynamicVariablePowerTools.RenameDynamicVariables.Tooltip": "Renames all matching linked variables.",
19+
20+
"DynamicVariablePowerTools.DebugInfo.Name": "Debug Info"
21+
}
1722
}

DynamicVariablePowerTools/RenameDirectlyLinkedVariables.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ private static void Prefix(DynamicVariableSpace __instance, string ____lastName,
3535

3636
var newVariableName = $"{newName}/{variableName}";
3737

38+
// TODO: Move to helper method
3839
var nameField = ((Worker)dynVar).TryGetField<string>("VariableName") ?? ((Worker)dynVar).TryGetField<string>("_variableName");
3940

4041
if (nameField is not null)
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
using Elements.Core;
2+
using FrooxEngine;
3+
using FrooxEngine.ProtoFlux;
4+
using FrooxEngine.UIX;
5+
using MonkeyLoader.Resonite;
6+
using MonkeyLoader.Resonite.UI;
7+
using MonkeyLoader.Resonite.UI.Inspectors;
8+
using System;
9+
using System.Collections.Generic;
10+
using System.Text;
11+
12+
namespace DynamicVariablePowerTools
13+
{
14+
internal class RenameDynamicVariables : ResoniteInspectorMonkey<RenameDynamicVariables, BuildInspectorBodyEvent>
15+
{
16+
public override int Priority => HarmonyLib.Priority.Low;
17+
18+
public RenameDynamicVariables() : base(typeof(DynamicVariableBase<>))
19+
{ }
20+
21+
protected override void Handle(BuildInspectorBodyEvent eventData)
22+
{
23+
var dynVar = (IDynamicVariable)eventData.Worker;
24+
var nameField = ((Worker)dynVar).TryGetField<string>("VariableName");
25+
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();
42+
}
43+
44+
private static Type GetDynVarType(IDynamicVariable dynVar)
45+
=> dynVar.GetType().GetGenericArgumentsFromInterface(typeof(IDynamicVariable<>))[0];
46+
47+
private static bool IsDynVarOfType(IDynamicVariable dynVar, Type innerType)
48+
=> GetDynVarType(dynVar) == innerType;
49+
50+
private static void RenameDynVar(IDynamicVariable dynVar, string newName)
51+
{
52+
if (!dynVar.TryGetLinkedSpace(out var linkedSpace))
53+
{
54+
var nameField = ((Worker)dynVar).TryGetField<string>("VariableName");
55+
nameField.Value = newName;
56+
return;
57+
}
58+
59+
var dynVarType = GetDynVarType(dynVar);
60+
var currentFullName = dynVar.VariableName;
61+
DynamicVariableHelper.ParsePath(currentFullName, out var currentSpaceName, out var currentVariableName);
62+
63+
Predicate<IDynamicVariable> predicate = linkedSpace.OnlyDirectBinding
64+
? (it => it.VariableName == currentFullName && IsDynVarOfType(it, dynVarType))
65+
: (it => (it.VariableName == currentFullName || it.VariableName == currentVariableName) && IsDynVarOfType(it, dynVarType));
66+
67+
foreach (var linkedVar in linkedSpace.GetLinkedVariables(predicate, true))
68+
{
69+
// TODO: Move to helper method
70+
var nameField = ((Worker)linkedVar).TryGetField<string>("VariableName") ?? ((Worker)linkedVar).TryGetField<string>("_variableName");
71+
72+
if (nameField is not null)
73+
{
74+
nameField.Value = newName;
75+
continue;
76+
}
77+
78+
if (linkedVar is ProtoFluxEngineProxy { Node.Target: IProtoFluxNode dynVarNode }
79+
&& dynVarNode.TryGetField("VariableName") is SyncRef<IGlobalValueProxy<string>> nameProxyRef
80+
&& nameProxyRef.Target is GlobalValue<string> nameProxy)
81+
{
82+
nameProxy.Value.Value = newName;
83+
continue;
84+
}
85+
}
86+
}
87+
}
88+
}

DynamicVariablePowerTools/SpaceTree.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Linq;
44
using System.Text;
55
using System.Threading.Tasks;
6+
using Elements.Core;
67
using FrooxEngine;
78

89
namespace DynamicVariablePowerTools
@@ -22,7 +23,7 @@ public SpaceTree(DynamicVariableSpace space, Slot? slot = null)
2223

2324
public bool Process()
2425
{
25-
_dynVars = [.. _slot.GetComponents<IDynamicVariable>(IsLinkedToThisSpace)];
26+
_dynVars = [.. _slot.GetComponents<IDynamicVariable>(dynvar => dynvar.IsLinkedToSpace(_space))];
2627

2728
_children = _slot.Children.Select(child => new SpaceTree(_space, child)).Where(tree => tree.Process()).ToArray();
2829

@@ -48,7 +49,7 @@ private void AppendDynVar(StringBuilder builder, string indent, IDynamicVariable
4849
builder.Append(last ? "└─" : "├─");
4950
builder.Append(dynVar.VariableName);
5051
builder.Append(" (");
51-
builder.AppendTypeName(dynVar.GetType());
52+
builder.Append(dynVar.GetType().GetNiceName());
5253
builder.AppendLine(")");
5354
}
5455

@@ -89,8 +90,5 @@ private void BuildString(StringBuilder builder, string indent)
8990
AppendSlot(builder, indent, _children[i], i == 0, i == _children.Length - 1);
9091
}
9192
}
92-
93-
private bool IsLinkedToThisSpace(IDynamicVariable dynamicVariable)
94-
=> dynamicVariable.IsLinkedToSpace(_space);
9593
}
9694
}

DynamicVariablePowerTools/TypeExtensions.cs

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,30 +12,6 @@ namespace DynamicVariablePowerTools
1212
{
1313
internal static class TypeExtensions
1414
{
15-
public static void AppendTypeName(this StringBuilder builder, Type type)
16-
{
17-
if (!type.IsGenericType)
18-
{
19-
builder.Append(type.Name);
20-
return;
21-
}
22-
23-
builder.Append(type.Name[..type.Name.IndexOf('`')]);
24-
builder.Append('<');
25-
26-
var appendComma = false;
27-
foreach (var arg in type.GetGenericArguments())
28-
{
29-
if (appendComma)
30-
builder.Append(", ");
31-
32-
builder.AppendTypeName(arg);
33-
appendComma = true;
34-
}
35-
36-
builder.Append('>');
37-
}
38-
3915
public static DynamicVariableSpace GetLinkedSpace(this IDynamicVariable dynamicVariable)
4016
{
4117
if (dynamicVariable.TryGetLinkedSpace(out var space))
@@ -44,9 +20,6 @@ public static DynamicVariableSpace GetLinkedSpace(this IDynamicVariable dynamicV
4420
throw new NullReferenceException("Dynamic variable is not linked against a space!");
4521
}
4622

47-
public static bool IsLinkedToSpace(this IDynamicVariable dynamicVariable)
48-
=> dynamicVariable.TryGetLinkedSpace(out _);
49-
5023
public static bool IsLinkedToSpace(this IDynamicVariable dynamicVariable, DynamicVariableSpace space)
5124
=> dynamicVariable.TryGetLinkedSpace(out var linkedSpace) && linkedSpace == space;
5225

0 commit comments

Comments
 (0)