Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion DynamicVariablePowerTools/DebugInfoGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -70,7 +71,7 @@ private static void OutputLinkedVariables(DynamicVariableSpace space, Sync<strin
{
names.Append(identity.name);
names.Append(" (");
names.AppendTypeName(identity.type);
names.Append(identity.type.GetNiceName());
names.AppendLine(")");
}

Expand Down
31 changes: 18 additions & 13 deletions DynamicVariablePowerTools/Locale/en.json
Original file line number Diff line number Diff line change
@@ -1,17 +1,22 @@
{
"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 <i>Output</i> 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 <i>Output</i> 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 <i>Output</i> 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 <i>Output</i> 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"
}
}
1 change: 1 addition & 0 deletions DynamicVariablePowerTools/RenameDirectlyLinkedVariables.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<string>("VariableName") ?? ((Worker)dynVar).TryGetField<string>("_variableName");

if (nameField is not null)
Expand Down
88 changes: 88 additions & 0 deletions DynamicVariablePowerTools/RenameDynamicVariables.cs
Original file line number Diff line number Diff line change
@@ -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<RenameDynamicVariables, BuildInspectorBodyEvent>
{
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<string>("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<string>("VariableName");
nameField.Value = newName;
return;
}

var dynVarType = GetDynVarType(dynVar);
var currentFullName = dynVar.VariableName;
DynamicVariableHelper.ParsePath(currentFullName, out var currentSpaceName, out var currentVariableName);

Predicate<IDynamicVariable> 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<string>("VariableName") ?? ((Worker)linkedVar).TryGetField<string>("_variableName");

if (nameField is not null)
{
nameField.Value = newName;
continue;
}

if (linkedVar is ProtoFluxEngineProxy { Node.Target: IProtoFluxNode dynVarNode }
&& dynVarNode.TryGetField("VariableName") is SyncRef<IGlobalValueProxy<string>> nameProxyRef
&& nameProxyRef.Target is GlobalValue<string> nameProxy)
{
nameProxy.Value.Value = newName;
continue;
}
}
}
}
}
8 changes: 3 additions & 5 deletions DynamicVariablePowerTools/SpaceTree.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Elements.Core;
using FrooxEngine;

namespace DynamicVariablePowerTools
Expand All @@ -14,7 +15,7 @@
private SpaceTree[] _children;
private IDynamicVariable[] _dynVars;

public SpaceTree(DynamicVariableSpace space, Slot? slot = null)

Check warning on line 18 in DynamicVariablePowerTools/SpaceTree.cs

View workflow job for this annotation

GitHub Actions / Build

Non-nullable field '_dynVars' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the field as nullable.

Check warning on line 18 in DynamicVariablePowerTools/SpaceTree.cs

View workflow job for this annotation

GitHub Actions / Build

Non-nullable field '_children' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the field as nullable.

Check warning on line 18 in DynamicVariablePowerTools/SpaceTree.cs

View workflow job for this annotation

GitHub Actions / Build

Non-nullable field '_dynVars' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the field as nullable.

Check warning on line 18 in DynamicVariablePowerTools/SpaceTree.cs

View workflow job for this annotation

GitHub Actions / Build

Non-nullable field '_children' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the field as nullable.
{
_space = space;
_slot = slot ?? space.Slot;
Expand All @@ -22,7 +23,7 @@

public bool Process()
{
_dynVars = [.. _slot.GetComponents<IDynamicVariable>(IsLinkedToThisSpace)];
_dynVars = [.. _slot.GetComponents<IDynamicVariable>(dynvar => dynvar.IsLinkedToSpace(_space))];

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

Expand All @@ -48,7 +49,7 @@
builder.Append(last ? "└─" : "├─");
builder.Append(dynVar.VariableName);
builder.Append(" (");
builder.AppendTypeName(dynVar.GetType());
builder.Append(dynVar.GetType().GetNiceName());
builder.AppendLine(")");
}

Expand Down Expand Up @@ -89,8 +90,5 @@
AppendSlot(builder, indent, _children[i], i == 0, i == _children.Length - 1);
}
}

private bool IsLinkedToThisSpace(IDynamicVariable dynamicVariable)
=> dynamicVariable.IsLinkedToSpace(_space);
}
}
27 changes: 0 additions & 27 deletions DynamicVariablePowerTools/TypeExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand All @@ -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;

Expand Down