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
128 changes: 128 additions & 0 deletions DynamicVariablePowerTools/ContextMenu/DVMA.References.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
using FrooxEngine;
using MonkeyLoader.Resonite;

using GenerationEvent = MonkeyLoader.Resonite.UI.Inspectors.InspectorMemberActionsMenuItemsGenerationEvent;

namespace DynamicVariablePowerTools.ContextMenu
{
internal sealed partial class DynamicVariableMemberActions
{
private static ButtonEventHandler GetDriveSyncRefFromVariable<T>(GenerationEvent eventData, SyncRef<T> syncRefTarget, string variable)
where T : class, IWorldElement
=> (button, args) =>
{
syncRefTarget.DriveFromVariable(variable);
eventData.CloseContextMenu();
};

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

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

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

foreach (var variable in GetAvailableVariableOptions<T>(eventData.Slot!))
{
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Drive.FromVariable", "variable", variable), DriveIcon, DriveColor)
.Button.LocalPressed += GetDriveSyncRefFromVariable(eventData, syncRefTarget, variable);
}
});
};

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

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

eventData.ContextMenu.AddItem(Mod.GetLocaleString("Reference.Blank"), ReferenceIcon, ReferenceColor)
.Button.LocalPressed += GetReferenceSyncRefForVariable(eventData, syncRefTarget, string.Empty);

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

foreach (var space in spaces)
{
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Reference.InSpace", "space", space.SpaceName), ReferenceIcon, ReferenceColor)
.Button.LocalPressed += GetReferenceSyncRefForVariable(eventData, syncRefTarget, $"{space.SpaceName}/");
}
});
};

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

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

eventData.ContextMenu.AddItem(Mod.GetLocaleString("Source.Blank"), SourceIcon, SourceColor)
.Button.LocalPressed += GetSourceSyncRefForVariable(eventData, syncRefTarget, string.Empty);

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

foreach (var space in spaces)
{
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Source.InSpace", "space", space.SpaceName), SourceIcon, SourceColor)
.Button.LocalPressed += GetSourceSyncRefForVariable(eventData, syncRefTarget, $"{space.SpaceName}/");
}
});
};

private static ButtonEventHandler GetReferenceSyncRefForVariable<T>(GenerationEvent eventData, ISyncRef<T> syncRefTarget, string variable)
where T : class, IWorldElement
=> (button, args) =>
{
var dynamicReference = syncRefTarget.FindNearestParent<Slot>().AttachComponent<DynamicReferenceVariable<ISyncRef<T>>>();
dynamicReference.VariableName.Value = variable;
dynamicReference.Reference.Target = syncRefTarget;

eventData.CloseContextMenu();
};

private static ButtonEventHandler GetSourceSyncRefForVariable<T>(GenerationEvent eventData, SyncRef<T> syncRefTarget, string variable)
where T : class, IWorldElement
=> (button, args) =>
{
syncRefTarget.SyncWithVariable(variable);
eventData.CloseContextMenu();
};

private static void OfferSyncRefActions<T>(GenerationEvent eventData)
where T : class, IWorldElement
{
if (eventData.Target is not SyncRef<T> syncRefTarget)
return;

if (!syncRefTarget.IsLinked)
{
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Drive"), DriveIcon, DriveColor)
.Button.LocalPressed += GetOfferSyncRefDriveActions(eventData, syncRefTarget);
}

eventData.ContextMenu.AddItem(Mod.GetLocaleString("Source", "type", "DynamicReference"), SourceIcon, SourceColor)
.Button.LocalPressed += GetOfferSyncRefSourceActions(eventData, syncRefTarget);

eventData.ContextMenu.AddItem(Mod.GetLocaleString("Reference"), ReferenceIcon, ReferenceColor)
.Button.LocalPressed += GetOfferSyncRefReferenceActions(eventData, syncRefTarget);
}
}
}
121 changes: 121 additions & 0 deletions DynamicVariablePowerTools/ContextMenu/DVMA.Types.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
using FrooxEngine;
using MonkeyLoader.Resonite;

using GenerationEvent = MonkeyLoader.Resonite.UI.Inspectors.InspectorMemberActionsMenuItemsGenerationEvent;

namespace DynamicVariablePowerTools.ContextMenu
{
internal sealed partial class DynamicVariableMemberActions
{
private static ButtonEventHandler GetDriveTypeFieldFromVariable(GenerationEvent eventData, SyncType syncTypeTarget, string variable)
=> (button, args) =>
{
syncTypeTarget.DriveFromVariable(variable);
eventData.CloseContextMenu();
};

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

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

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

foreach (var variable in GetAvailableVariableOptions<Type>(eventData.Slot!))
{
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Drive.FromVariable", "variable", variable), DriveIcon, DriveColor)
.Button.LocalPressed += GetDriveTypeFieldFromVariable(eventData, syncTypeTarget, variable);
}
});
};

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

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

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)
{
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Reference.InSpace", "space", space.SpaceName), ReferenceIcon, ReferenceColor)
.Button.LocalPressed += GetReferenceTypeFieldForVariable(eventData, syncTypeTarget, $"{space.SpaceName}/");
}
});
};

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

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

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)
{
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Source.InSpace", "space", space.SpaceName), SourceIcon, SourceColor)
.Button.LocalPressed += GetSourceTypeFieldForVariable(eventData, syncTypeTarget, $"{space.SpaceName}/");
}
});
};

private static ButtonEventHandler GetReferenceTypeFieldForVariable(GenerationEvent eventData, SyncType syncTypeTarget, string variable)
=> (button, args) =>
{
var dynamicReference = syncTypeTarget.FindNearestParent<Slot>().AttachComponent<DynamicReferenceVariable<SyncType>>();
dynamicReference.VariableName.Value = variable;
dynamicReference.Reference.Target = syncTypeTarget;

eventData.CloseContextMenu();
};

private static ButtonEventHandler GetSourceTypeFieldForVariable(GenerationEvent eventData, SyncType syncTypeTarget, string variable)
=> (button, args) =>
{
syncTypeTarget.SyncWithVariable(variable);
eventData.CloseContextMenu();
};

private static void OfferTypeFieldActions(GenerationEvent eventData)
{
if (eventData.Target is not SyncType syncTypeTarget)
return;

if (!syncTypeTarget.IsLinked)
{
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Drive"), DriveIcon, DriveColor)
.Button.LocalPressed += GetOfferTypeFieldDriveActions(eventData, syncTypeTarget);
}

eventData.ContextMenu.AddItem(Mod.GetLocaleString("Source", "type", "DynamicTypeField"), SourceIcon, SourceColor)
.Button.LocalPressed += GetOfferTypeFieldSourceActions(eventData, syncTypeTarget);

eventData.ContextMenu.AddItem(Mod.GetLocaleString("Reference"), ReferenceIcon, ReferenceColor)
.Button.LocalPressed += GetOfferTypeFieldReferenceActions(eventData, syncTypeTarget);
}
}
}
121 changes: 121 additions & 0 deletions DynamicVariablePowerTools/ContextMenu/DVMA.Values.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
using FrooxEngine;
using MonkeyLoader.Resonite;

using GenerationEvent = MonkeyLoader.Resonite.UI.Inspectors.InspectorMemberActionsMenuItemsGenerationEvent;

namespace DynamicVariablePowerTools.ContextMenu
{
internal sealed partial class DynamicVariableMemberActions
{
private static ButtonEventHandler GetDriveFieldFromVariable<T>(GenerationEvent eventData, IField<T> fieldTarget, string variable)
=> (button, args) =>
{
fieldTarget.DriveFromVariable(variable);
eventData.CloseContextMenu();
};

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

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

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

foreach (var variable in GetAvailableVariableOptions<T>(eventData.Slot!))
{
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Drive.FromVariable", "variable", variable), DriveIcon, DriveColor)
.Button.LocalPressed += GetDriveFieldFromVariable(eventData, fieldTarget, variable);
}
});
};

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

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

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)
{
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Reference.InSpace", "space", space.SpaceName), ReferenceIcon, ReferenceColor)
.Button.LocalPressed += GetReferenceFieldForVariable(eventData, fieldTarget, $"{space.SpaceName}/");
}
});
};

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

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

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)
{
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Source.InSpace", "space", space.SpaceName), SourceIcon, SourceColor)
.Button.LocalPressed += GetSourceFieldForVariable(eventData, fieldTarget, $"{space.SpaceName}/");
}
});
};

private static ButtonEventHandler GetReferenceFieldForVariable<T>(GenerationEvent eventData, IField<T> fieldTarget, string variable)
=> (button, args) =>
{
var dynamicReference = fieldTarget.FindNearestParent<Slot>().AttachComponent<DynamicReferenceVariable<IField<T>>>();
dynamicReference.VariableName.Value = variable;
dynamicReference.Reference.Target = fieldTarget;

eventData.CloseContextMenu();
};

private static ButtonEventHandler GetSourceFieldForVariable<T>(GenerationEvent eventData, IField<T> fieldTarget, string variable)
=> (button, args) =>
{
fieldTarget.SyncWithVariable(variable);
eventData.CloseContextMenu();
};

private static void OfferFieldActions<T>(GenerationEvent eventData)
{
if (eventData.Target is not IField<T> fieldTarget)
return;

if (!fieldTarget.IsLinked)
{
eventData.ContextMenu.AddItem(Mod.GetLocaleString("Drive"), DriveIcon, DriveColor)
.Button.LocalPressed += GetOfferFieldDriveActions(eventData, fieldTarget);
}

eventData.ContextMenu.AddItem(Mod.GetLocaleString("Source", "type", "DynamicField"), SourceIcon, SourceColor)
.Button.LocalPressed += GetOfferFieldSourceActions(eventData, fieldTarget);

eventData.ContextMenu.AddItem(Mod.GetLocaleString("Reference"), ReferenceIcon, ReferenceColor)
.Button.LocalPressed += GetOfferFieldReferenceActions(eventData, fieldTarget);
}
}
}
Loading
Loading