diff --git a/DynamicVariablePowerTools/DebugInfoGenerator.cs b/DynamicVariablePowerTools/DebugInfoGenerator.cs index 4a4373a..079907a 100644 --- a/DynamicVariablePowerTools/DebugInfoGenerator.cs +++ b/DynamicVariablePowerTools/DebugInfoGenerator.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using Elements.Core; using FrooxEngine; using MonkeyLoader.Resonite; using MonkeyLoader.Resonite.UI; @@ -70,7 +71,7 @@ private static void OutputLinkedVariables(DynamicVariableSpace space, SyncOutput field.", + "localeCode": "en", + "authors": [ "Banane9" ], + "messages": { + "DynamicVariablePowerTools.EnableLinkedVariablesList.Name": "Variable Definitions", + "DynamicVariablePowerTools.EnableLinkedVariablesList.Description": "Allow generating a list of all dynamic variable definitions linked to a space.", + "DynamicVariablePowerTools.EnableLinkedVariablesList.Button": "Output Variable Definitions", + "DynamicVariablePowerTools.EnableLinkedVariablesList.Tooltip": "Generates a list of all dynamic variable definitions linked to this space in the Output field.", - "DynamicVariablePowerTools.EnableLinkedComponentHierarchy.Name": "Component Hierarchy", - "DynamicVariablePowerTools.EnableLinkedComponentHierarchy.Description": "Allow generating a hierarchical list of all dynamic variable components linked to a space.", - "DynamicVariablePowerTools.EnableLinkedComponentHierarchy.Button": "Output Component Hierarchy", - "DynamicVariablePowerTools.EnableLinkedComponentHierarchy.Tooltip": "Generates a hierarchical list of all dynamic variable components linked to this space in the Output field.", + "DynamicVariablePowerTools.EnableLinkedComponentHierarchy.Name": "Component Hierarchy", + "DynamicVariablePowerTools.EnableLinkedComponentHierarchy.Description": "Allow generating a hierarchical list of all dynamic variable components linked to a space.", + "DynamicVariablePowerTools.EnableLinkedComponentHierarchy.Button": "Output Component Hierarchy", + "DynamicVariablePowerTools.EnableLinkedComponentHierarchy.Tooltip": "Generates a hierarchical list of all dynamic variable components linked to this space in the Output field.", - "DynamicVariablePowerTools.DebugInfo.Name": "Debug Info" - } + "DynamicVariablePowerTools.RenameDynamicVariables.Name": "Rename Dynamic Variables", + "DynamicVariablePowerTools.RenameDynamicVariables.Description": "Adds a button to dynamic variables for renaming all matching linked variables.", + "DynamicVariablePowerTools.RenameDynamicVariables.Button": "Rename", + "DynamicVariablePowerTools.RenameDynamicVariables.Tooltip": "Renames all matching linked variables.", + + "DynamicVariablePowerTools.DebugInfo.Name": "Debug Info" + } } \ No newline at end of file diff --git a/DynamicVariablePowerTools/RenameDirectlyLinkedVariables.cs b/DynamicVariablePowerTools/RenameDirectlyLinkedVariables.cs index d722d13..dbdac45 100644 --- a/DynamicVariablePowerTools/RenameDirectlyLinkedVariables.cs +++ b/DynamicVariablePowerTools/RenameDirectlyLinkedVariables.cs @@ -35,6 +35,7 @@ private static void Prefix(DynamicVariableSpace __instance, string ____lastName, var newVariableName = $"{newName}/{variableName}"; + // TODO: Move to helper method var nameField = ((Worker)dynVar).TryGetField("VariableName") ?? ((Worker)dynVar).TryGetField("_variableName"); if (nameField is not null) diff --git a/DynamicVariablePowerTools/RenameDynamicVariables.cs b/DynamicVariablePowerTools/RenameDynamicVariables.cs new file mode 100644 index 0000000..bd0773e --- /dev/null +++ b/DynamicVariablePowerTools/RenameDynamicVariables.cs @@ -0,0 +1,88 @@ +using Elements.Core; +using FrooxEngine; +using FrooxEngine.ProtoFlux; +using FrooxEngine.UIX; +using MonkeyLoader.Resonite; +using MonkeyLoader.Resonite.UI; +using MonkeyLoader.Resonite.UI.Inspectors; +using System; +using System.Collections.Generic; +using System.Text; + +namespace DynamicVariablePowerTools +{ + internal class RenameDynamicVariables : ResoniteInspectorMonkey + { + public override int Priority => HarmonyLib.Priority.Low; + + public RenameDynamicVariables() : base(typeof(DynamicVariableBase<>)) + { } + + protected override void Handle(BuildInspectorBodyEvent eventData) + { + var dynVar = (IDynamicVariable)eventData.Worker; + var nameField = ((Worker)dynVar).TryGetField("VariableName"); + + var builder = eventData.UI; + builder.HorizontalLayout(4).Slot.DestroyWhenLocalUserLeaves(); + builder.PushStyle(); + var style = builder.Style; + + style.FlexibleWidth = 1; + var newNameField = builder.TextField(dynVar.VariableName, parseRTF: false); + nameField.Changed += _ => newNameField.Text.Content.Value = dynVar.VariableName; + + style.FlexibleWidth = -1; + style.MinWidth = 256; + builder.LocalActionButton(this.GetLocaleString("Button"), button => RenameDynVar(dynVar, newNameField.Text.Content.Value)) + .WithTooltip(this.GetLocaleString("Tooltip")); + + builder.PopStyle(); + builder.NestOut(); + } + + private static Type GetDynVarType(IDynamicVariable dynVar) + => dynVar.GetType().GetGenericArgumentsFromInterface(typeof(IDynamicVariable<>))[0]; + + private static bool IsDynVarOfType(IDynamicVariable dynVar, Type innerType) + => GetDynVarType(dynVar) == innerType; + + private static void RenameDynVar(IDynamicVariable dynVar, string newName) + { + if (!dynVar.TryGetLinkedSpace(out var linkedSpace)) + { + var nameField = ((Worker)dynVar).TryGetField("VariableName"); + nameField.Value = newName; + return; + } + + var dynVarType = GetDynVarType(dynVar); + var currentFullName = dynVar.VariableName; + DynamicVariableHelper.ParsePath(currentFullName, out var currentSpaceName, out var currentVariableName); + + Predicate predicate = linkedSpace.OnlyDirectBinding + ? (it => it.VariableName == currentFullName && IsDynVarOfType(it, dynVarType)) + : (it => (it.VariableName == currentFullName || it.VariableName == currentVariableName) && IsDynVarOfType(it, dynVarType)); + + foreach (var linkedVar in linkedSpace.GetLinkedVariables(predicate, true)) + { + // TODO: Move to helper method + var nameField = ((Worker)linkedVar).TryGetField("VariableName") ?? ((Worker)linkedVar).TryGetField("_variableName"); + + if (nameField is not null) + { + nameField.Value = newName; + continue; + } + + if (linkedVar is ProtoFluxEngineProxy { Node.Target: IProtoFluxNode dynVarNode } + && dynVarNode.TryGetField("VariableName") is SyncRef> nameProxyRef + && nameProxyRef.Target is GlobalValue nameProxy) + { + nameProxy.Value.Value = newName; + continue; + } + } + } + } +} \ No newline at end of file diff --git a/DynamicVariablePowerTools/SpaceTree.cs b/DynamicVariablePowerTools/SpaceTree.cs index 94f5c45..0d4a477 100644 --- a/DynamicVariablePowerTools/SpaceTree.cs +++ b/DynamicVariablePowerTools/SpaceTree.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using Elements.Core; using FrooxEngine; namespace DynamicVariablePowerTools @@ -22,7 +23,7 @@ public SpaceTree(DynamicVariableSpace space, Slot? slot = null) public bool Process() { - _dynVars = [.. _slot.GetComponents(IsLinkedToThisSpace)]; + _dynVars = [.. _slot.GetComponents(dynvar => dynvar.IsLinkedToSpace(_space))]; _children = _slot.Children.Select(child => new SpaceTree(_space, child)).Where(tree => tree.Process()).ToArray(); @@ -48,7 +49,7 @@ private void AppendDynVar(StringBuilder builder, string indent, IDynamicVariable builder.Append(last ? "└─" : "├─"); builder.Append(dynVar.VariableName); builder.Append(" ("); - builder.AppendTypeName(dynVar.GetType()); + builder.Append(dynVar.GetType().GetNiceName()); builder.AppendLine(")"); } @@ -89,8 +90,5 @@ private void BuildString(StringBuilder builder, string indent) AppendSlot(builder, indent, _children[i], i == 0, i == _children.Length - 1); } } - - private bool IsLinkedToThisSpace(IDynamicVariable dynamicVariable) - => dynamicVariable.IsLinkedToSpace(_space); } } \ No newline at end of file diff --git a/DynamicVariablePowerTools/TypeExtensions.cs b/DynamicVariablePowerTools/TypeExtensions.cs index 2ad9ae6..9a755f4 100644 --- a/DynamicVariablePowerTools/TypeExtensions.cs +++ b/DynamicVariablePowerTools/TypeExtensions.cs @@ -12,30 +12,6 @@ namespace DynamicVariablePowerTools { internal static class TypeExtensions { - public static void AppendTypeName(this StringBuilder builder, Type type) - { - if (!type.IsGenericType) - { - builder.Append(type.Name); - return; - } - - builder.Append(type.Name[..type.Name.IndexOf('`')]); - builder.Append('<'); - - var appendComma = false; - foreach (var arg in type.GetGenericArguments()) - { - if (appendComma) - builder.Append(", "); - - builder.AppendTypeName(arg); - appendComma = true; - } - - builder.Append('>'); - } - public static DynamicVariableSpace GetLinkedSpace(this IDynamicVariable dynamicVariable) { if (dynamicVariable.TryGetLinkedSpace(out var space)) @@ -44,9 +20,6 @@ public static DynamicVariableSpace GetLinkedSpace(this IDynamicVariable dynamicV throw new NullReferenceException("Dynamic variable is not linked against a space!"); } - public static bool IsLinkedToSpace(this IDynamicVariable dynamicVariable) - => dynamicVariable.TryGetLinkedSpace(out _); - public static bool IsLinkedToSpace(this IDynamicVariable dynamicVariable, DynamicVariableSpace space) => dynamicVariable.TryGetLinkedSpace(out var linkedSpace) && linkedSpace == space;