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
36 changes: 31 additions & 5 deletions DynamicVariablePowerTools/ContextMenu/DVMA.References.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,31 @@ private static ButtonEventHandler GetDriveSyncRefFromVariable<T>(GenerationEvent
eventData.CloseContextMenu();
};

private static ButtonEventHandler GetOfferSyncRefDriveActions<T>(GenerationEvent eventData, SyncRef<T> syncRefTarget)
private static ButtonEventHandler GetOfferSyncRefDriveActions<T>(GenerationEvent eventData, SyncRef<T> syncRefTarget, DynamicVariableSpace space)
where T : class, IWorldElement
=> (button, args) =>
{
eventData.CloseContextMenu();

button.Slot.StartTask(async () =>
{
if (await eventData.OpenContextMenuAsync(args.source.Slot) is null)
return;

var blankVariableName = string.IsNullOrWhiteSpace(space.CurrentName) ? string.Empty : $"{space.CurrentName}/";

eventData.ContextMenu.AddItem(Mod.GetLocaleString("Drive.FromVariable", "variable", GetDisplayName(space, "")), DriveIcon, DriveColor)
.Button.LocalPressed += GetDriveSyncRefFromVariable(eventData, syncRefTarget, blankVariableName);

foreach (var variable in space.GetVariableIdentities<T>().RemoveSharedConfigVariables())
{
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Drive.FromVariable", "variable", GetDisplayName(variable)), DriveIcon, DriveColor)
.Button.LocalPressed += GetDriveSyncRefFromVariable(eventData, syncRefTarget, variable.QualifiedName);
}
});
};

private static ButtonEventHandler GetOfferSyncRefDriveSpaceActions<T>(GenerationEvent eventData, SyncRef<T> syncRefTarget)
where T : class, IWorldElement
=> (button, args) =>
{
Expand All @@ -29,10 +53,12 @@ private static ButtonEventHandler GetOfferSyncRefDriveActions<T>(GenerationEvent
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Drive.FromBlank"), DriveIcon, DriveColor)
.Button.LocalPressed += GetDriveSyncRefFromVariable(eventData, syncRefTarget, string.Empty);

foreach (var variable in GetAvailableVariableOptions<T>(eventData.Slot!))
foreach (var space in eventData.Slot!.GetAvailableSpaces())
{
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Drive.FromVariable", "variable", variable), DriveIcon, DriveColor)
.Button.LocalPressed += GetDriveSyncRefFromVariable(eventData, syncRefTarget, variable);
var spaceName = string.IsNullOrWhiteSpace(space.CurrentName) ? "<color=neutrals.midlight><i>null</i></color>" : space.CurrentName;

eventData.ContextMenu.AddItem(Mod.GetLocaleString("Drive.FromSpace", "space", spaceName), DriveIcon, DriveColor)
.Button.LocalPressed += GetOfferSyncRefDriveActions(eventData, syncRefTarget, space);
}
});
};
Expand Down Expand Up @@ -115,7 +141,7 @@ private static void OfferSyncRefActions<T>(GenerationEvent eventData)
if (!syncRefTarget.IsLinked)
{
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Drive"), DriveIcon, DriveColor)
.Button.LocalPressed += GetOfferSyncRefDriveActions(eventData, syncRefTarget);
.Button.LocalPressed += GetOfferSyncRefDriveSpaceActions(eventData, syncRefTarget);
}

eventData.ContextMenu.AddItem(Mod.GetLocaleString("Source", "type", "DynamicReference"), SourceIcon, SourceColor)
Expand Down
45 changes: 31 additions & 14 deletions DynamicVariablePowerTools/ContextMenu/DVMA.Types.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,30 @@ private static ButtonEventHandler GetDriveTypeFieldFromVariable(GenerationEvent
eventData.CloseContextMenu();
};

private static ButtonEventHandler GetOfferTypeFieldDriveActions(GenerationEvent eventData, SyncType syncTypeTarget)
private static ButtonEventHandler GetOfferTypeFieldDriveActions(GenerationEvent eventData, SyncType syncTypeTarget, DynamicVariableSpace space)
=> (button, args) =>
{
eventData.CloseContextMenu();

button.Slot.StartTask(async () =>
{
if (await eventData.OpenContextMenuAsync(args.source.Slot) is null)
return;

var blankVariableName = string.IsNullOrWhiteSpace(space.CurrentName) ? string.Empty : $"{space.CurrentName}/";

eventData.ContextMenu.AddItem(Mod.GetLocaleString("Drive.FromVariable", "variable", GetDisplayName(space, "")), DriveIcon, DriveColor)
.Button.LocalPressed += GetDriveTypeFieldFromVariable(eventData, syncTypeTarget, blankVariableName);

foreach (var variable in space.GetVariableIdentities<Type>().RemoveSharedConfigVariables())
{
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Drive.FromVariable", "variable", GetDisplayName(variable)), DriveIcon, DriveColor)
.Button.LocalPressed += GetDriveTypeFieldFromVariable(eventData, syncTypeTarget, variable.QualifiedName);
}
});
};

private static ButtonEventHandler GetOfferTypeFieldDriveSpaceActions(GenerationEvent eventData, SyncType syncTypeTarget)
=> (button, args) =>
{
eventData.CloseContextMenu();
Expand All @@ -25,12 +48,12 @@ private static ButtonEventHandler GetOfferTypeFieldDriveActions(GenerationEvent
return;

eventData.ContextMenu.AddItem(Mod.GetLocaleString("Drive.FromBlank"), DriveIcon, DriveColor)
.Button.LocalPressed += GetDriveTypeFieldFromVariable(eventData, syncTypeTarget, string.Empty);
.Button.LocalPressed += GetDriveFieldFromVariable(eventData, syncTypeTarget, string.Empty);

foreach (var variable in GetAvailableVariableOptions<Type>(eventData.Slot!))
foreach (var space in eventData.Slot!.GetAvailableSpaces())
{
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Drive.FromVariable", "variable", variable), DriveIcon, DriveColor)
.Button.LocalPressed += GetDriveTypeFieldFromVariable(eventData, syncTypeTarget, variable);
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Drive.FromSpace", "space", GetDisplayName(space)), DriveIcon, DriveColor)
.Button.LocalPressed += GetOfferTypeFieldDriveActions(eventData, syncTypeTarget, space);
}
});
};
Expand All @@ -48,10 +71,7 @@ private static ButtonEventHandler GetOfferTypeFieldReferenceActions(GenerationEv
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Reference.Blank"), ReferenceIcon, ReferenceColor)
.Button.LocalPressed += GetReferenceTypeFieldForVariable(eventData, syncTypeTarget, string.Empty);

var spaces = eventData.Slot!
.GetAvailableSpaces(SpaceHasName);

foreach (var space in spaces)
foreach (var space in eventData.Slot!.GetAvailableSpaces(SpaceHasName))
{
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Reference.InSpace", "space", space.SpaceName), ReferenceIcon, ReferenceColor)
.Button.LocalPressed += GetReferenceTypeFieldForVariable(eventData, syncTypeTarget, $"{space.SpaceName}/");
Expand All @@ -72,10 +92,7 @@ private static ButtonEventHandler GetOfferTypeFieldSourceActions(GenerationEvent
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Source.Blank"), SourceIcon, SourceColor)
.Button.LocalPressed += GetSourceTypeFieldForVariable(eventData, syncTypeTarget, string.Empty);

var spaces = eventData.Slot!
.GetAvailableSpaces(SpaceHasName);

foreach (var space in spaces)
foreach (var space in eventData.Slot!.GetAvailableSpaces(SpaceHasName))
{
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Source.InSpace", "space", space.SpaceName), SourceIcon, SourceColor)
.Button.LocalPressed += GetSourceTypeFieldForVariable(eventData, syncTypeTarget, $"{space.SpaceName}/");
Expand Down Expand Up @@ -108,7 +125,7 @@ private static void OfferTypeFieldActions(GenerationEvent eventData)
if (!syncTypeTarget.IsLinked)
{
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Drive"), DriveIcon, DriveColor)
.Button.LocalPressed += GetOfferTypeFieldDriveActions(eventData, syncTypeTarget);
.Button.LocalPressed += GetOfferTypeFieldDriveSpaceActions(eventData, syncTypeTarget);
}

eventData.ContextMenu.AddItem(Mod.GetLocaleString("Source", "type", "DynamicTypeField"), SourceIcon, SourceColor)
Expand Down
51 changes: 34 additions & 17 deletions DynamicVariablePowerTools/ContextMenu/DVMA.Values.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,30 @@ private static ButtonEventHandler GetDriveFieldFromVariable<T>(GenerationEvent e
eventData.CloseContextMenu();
};

private static ButtonEventHandler GetOfferFieldDriveActions<T>(GenerationEvent eventData, IField<T> fieldTarget)
private static ButtonEventHandler GetOfferFieldDriveActions<T>(GenerationEvent eventData, IField<T> fieldTarget, DynamicVariableSpace space)
=> (button, args) =>
{
eventData.CloseContextMenu();

button.Slot.StartTask(async () =>
{
if (await eventData.OpenContextMenuAsync(args.source.Slot) is null)
return;

var blankVariableName = string.IsNullOrWhiteSpace(space.CurrentName) ? string.Empty : $"{space.CurrentName}/";

eventData.ContextMenu.AddItem(Mod.GetLocaleString("Drive.FromVariable", "variable", GetDisplayName(space, "")), DriveIcon, DriveColor)
.Button.LocalPressed += GetDriveFieldFromVariable(eventData, fieldTarget, blankVariableName);

foreach (var variable in space.GetVariableIdentities<T>().RemoveSharedConfigVariables())
{
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Drive.FromVariable", "variable", GetDisplayName(variable)), DriveIcon, DriveColor)
.Button.LocalPressed += GetDriveFieldFromVariable(eventData, fieldTarget, variable.QualifiedName);
}
});
};

private static ButtonEventHandler GetOfferFieldDriveSpaceActions<T>(GenerationEvent eventData, IField<T> fieldTarget)
=> (button, args) =>
{
eventData.CloseContextMenu();
Expand All @@ -27,10 +50,10 @@ private static ButtonEventHandler GetOfferFieldDriveActions<T>(GenerationEvent e
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Drive.FromBlank"), DriveIcon, DriveColor)
.Button.LocalPressed += GetDriveFieldFromVariable(eventData, fieldTarget, string.Empty);

foreach (var variable in GetAvailableVariableOptions<T>(eventData.Slot!))
foreach (var space in eventData.Slot!.GetAvailableSpaces())
{
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Drive.FromVariable", "variable", variable), DriveIcon, DriveColor)
.Button.LocalPressed += GetDriveFieldFromVariable(eventData, fieldTarget, variable);
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Drive.FromSpace", "space", GetDisplayName(space)), DriveIcon, DriveColor)
.Button.LocalPressed += GetOfferFieldDriveActions(eventData, fieldTarget, space);
}
});
};
Expand All @@ -48,13 +71,10 @@ private static ButtonEventHandler GetOfferFieldReferenceActions<T>(GenerationEve
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Reference.Blank"), ReferenceIcon, ReferenceColor)
.Button.LocalPressed += GetReferenceFieldForVariable(eventData, fieldTarget, string.Empty);

var spaces = eventData.Slot!
.GetAvailableSpaces(SpaceHasName);

foreach (var space in spaces)
foreach (var space in eventData.Slot!.GetAvailableSpaces(SpaceHasName))
{
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Reference.InSpace", "space", space.SpaceName), ReferenceIcon, ReferenceColor)
.Button.LocalPressed += GetReferenceFieldForVariable(eventData, fieldTarget, $"{space.SpaceName}/");
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Reference.InSpace", "space", space.CurrentName), ReferenceIcon, ReferenceColor)
.Button.LocalPressed += GetReferenceFieldForVariable(eventData, fieldTarget, $"{space.CurrentName}/");
}
});
};
Expand All @@ -72,13 +92,10 @@ private static ButtonEventHandler GetOfferFieldSourceActions<T>(GenerationEvent
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Source.Blank"), SourceIcon, SourceColor)
.Button.LocalPressed += GetSourceFieldForVariable(eventData, fieldTarget, string.Empty);

var spaces = eventData.Slot!
.GetAvailableSpaces(SpaceHasName);

foreach (var space in spaces)
foreach (var space in eventData.Slot!.GetAvailableSpaces(SpaceHasName))
{
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Source.InSpace", "space", space.SpaceName), SourceIcon, SourceColor)
.Button.LocalPressed += GetSourceFieldForVariable(eventData, fieldTarget, $"{space.SpaceName}/");
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Source.InSpace", "space", space.CurrentName), SourceIcon, SourceColor)
.Button.LocalPressed += GetSourceFieldForVariable(eventData, fieldTarget, $"{space.CurrentName}/");
}
});
};
Expand Down Expand Up @@ -108,7 +125,7 @@ private static void OfferFieldActions<T>(GenerationEvent eventData)
if (!fieldTarget.IsLinked)
{
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Drive"), DriveIcon, DriveColor)
.Button.LocalPressed += GetOfferFieldDriveActions(eventData, fieldTarget);
.Button.LocalPressed += GetOfferFieldDriveSpaceActions(eventData, fieldTarget);
}

eventData.ContextMenu.AddItem(Mod.GetLocaleString("Source", "type", "DynamicField"), SourceIcon, SourceColor)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,18 +71,16 @@ protected override Task Handle(GenerationEvent eventData)
return Task.CompletedTask;
}

private static IEnumerable<string> GetAvailableVariableOptions<T>(Slot slot)
{
foreach (var identity in slot.GetAvailableVariableIdentities<T>())
{
if (identity.Name.StartsWith(SharedConfig.Identifier))
continue;
private static string GetDisplayName(DynamicVariableSpace space)
=> $"<color=neutrals.midlight>{(string.IsNullOrWhiteSpace(space.CurrentName) ? "<i>null</i>" : space.CurrentName)}</color>";

yield return !string.IsNullOrWhiteSpace(identity.Space.CurrentName)
? $"{identity.Space.CurrentName}/{identity.Name}"
: identity.Name;
}
}
private static string GetDisplayName(DynamicVariableSpace space, string variableName)
=> string.IsNullOrWhiteSpace(space.CurrentName)
? variableName
: $"<size=75%><color=neutrals.midlight>{space.CurrentName}/</color></size>{variableName}";

private static string GetDisplayName(DynamicVariableIdentity variableIdentity)
=> GetDisplayName(variableIdentity.Space, variableIdentity.Name);

private static Action<GenerationEvent> MakeMethod(MethodInfo method, Type type)
{
Expand Down
2 changes: 1 addition & 1 deletion DynamicVariablePowerTools/DynamicVariablePowerTools.csproj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Remora.Resonite.Sdk/2.0.10">
<Project Sdk="Remora.Resonite.Sdk/2.3.1">
<PropertyGroup>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<PackageId>DynamicVariablePowerTools</PackageId>
Expand Down
3 changes: 2 additions & 1 deletion DynamicVariablePowerTools/Locale/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@

"DynamicVariablePowerTools.Drive": "Drive from Dynamic Variable",
"DynamicVariablePowerTools.Drive.FromBlank": "From [Blank]",
"DynamicVariablePowerTools.Drive.FromVariable": "From <i>{variable}</i>",
"DynamicVariablePowerTools.Drive.FromSpace": "From Variable in <i>{space}</i>",
"DynamicVariablePowerTools.Drive.FromVariable": "{variable}",

"DynamicVariablePowerTools.Source": "Set up <i>{type}</i>",
"DynamicVariablePowerTools.Source.Blank": "[Blank]",
Expand Down
10 changes: 6 additions & 4 deletions DynamicVariablePowerTools/OpenLinkedDynamicVariableSpace.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using FrooxEngine;
using HarmonyLib;
using MonkeyLoader.Resonite;
using MonkeyLoader.Resonite.UI.Inspectors;

namespace DynamicVariablePowerTools
Expand All @@ -8,15 +8,17 @@ internal sealed class OpenLinkedDynamicVariableSpace
: ResoniteInspectorMonkey<OpenLinkedDynamicVariableSpace, BuildInspectorHeaderEvent>
{
public override bool CanBeDisabled => true;

public override int Priority => HarmonyLib.Priority.First;

// Needs to be able to handle interfaces for IDynamicVariable
public OpenLinkedDynamicVariableSpace() : base(typeof(DynamicVariableBase<>))
// Can't use generic parameter version because IDynamicVariable isn't a Worker
public OpenLinkedDynamicVariableSpace() : base(typeof(IDynamicVariable))
{ }

protected override void Handle(BuildInspectorHeaderEvent eventData)
{
if (Traverse.Create(eventData.Worker).Field("handler").Field("_currentSpace").GetValue() is not DynamicVariableSpace space)
// Can safely cast since the base.AppliesTo method will ensure it's an IDynamicVariable
if (!((IDynamicVariable)eventData.Worker).TryGetLinkedSpace(out var space))
return;

InspectorUIHelper.BuildHeaderOpenParentButtons(eventData.UI, space);
Expand Down
Loading