Files
FlaxEngine/Source/Editor/Surface/VisjectSurface.DragDrop.cs
Nils Hausfeld 0fc507e238 - Visject Drag and Drop now tries to get a parameter setter node while holding the alt key
- Visual Script surface now returns a setter node
2024-06-01 14:23:36 +02:00

179 lines
5.9 KiB
C#

// Copyright (c) 2012-2024 Wojciech Figat. All rights reserved.
using System.Collections.Generic;
using System.IO;
using FlaxEditor.Content;
using FlaxEditor.GUI.Drag;
using FlaxEngine;
using FlaxEngine.GUI;
namespace FlaxEditor.Surface
{
public partial class VisjectSurface
{
private readonly DragAssets<DragDropEventArgs> _dragAssets;
private readonly DragNames<DragDropEventArgs> _dragParameters;
/// <summary>
/// The custom drag drop event arguments.
/// </summary>
/// <seealso cref="FlaxEditor.GUI.Drag.DragEventArgs" />
public class DragDropEventArgs : DragEventArgs
{
/// <summary>
/// The surface location.
/// </summary>
public Float2 SurfaceLocation;
}
/// <summary>
/// Drag and drop handlers.
/// </summary>
public readonly DragHandlers DragHandlers = new DragHandlers();
/// <inheritdoc />
public override DragDropEffect OnDragEnter(ref Float2 location, DragData data)
{
var result = base.OnDragEnter(ref location, data);
if (result != DragDropEffect.None)
return result;
return DragHandlers.OnDragEnter(data);
}
/// <inheritdoc />
public override DragDropEffect OnDragMove(ref Float2 location, DragData data)
{
var result = base.OnDragMove(ref location, data);
if (result != DragDropEffect.None)
return result;
return DragHandlers.Effect;
}
/// <inheritdoc />
public override void OnDragLeave()
{
DragHandlers.OnDragLeave();
base.OnDragLeave();
}
/// <inheritdoc />
public override DragDropEffect OnDragDrop(ref Float2 location, DragData data)
{
var result = base.OnDragDrop(ref location, data);
if (result != DragDropEffect.None)
return result;
var args = new DragDropEventArgs
{
SurfaceLocation = _rootControl.PointFromParent(ref location)
};
// Drag assets
if (_dragAssets.HasValidDrag)
{
result = _dragAssets.Effect;
// Process items
HandleDragDropAssets(_dragAssets.Objects, args);
}
// Drag parameters
else if (_dragParameters.HasValidDrag)
{
result = _dragParameters.Effect;
// Process items
HandleDragDropParameters(_dragParameters.Objects, args);
}
DragHandlers.OnDragDrop(args);
return result;
}
/// <summary>
/// Validates the asset items drag operation.
/// </summary>
/// <param name="assetItem">The asset item.</param>
/// <returns>True if can drag that item, otherwise false.</returns>
protected virtual bool ValidateDragItem(AssetItem assetItem)
{
return false;
}
/// <summary>
/// Validates the parameter drag operation.
/// </summary>
/// <param name="parameterName">Name of the parameter.</param>
/// <returns>True if can drag that parameter, otherwise false.</returns>
protected virtual bool ValidateDragParameter(string parameterName)
{
return GetParameter(parameterName) != null;
}
/// <summary>
/// Handles the drag drop assets action.
/// </summary>
/// <param name="objects">The objects.</param>
/// <param name="args">The drag drop arguments data.</param>
protected virtual void HandleDragDropAssets(List<AssetItem> objects, DragDropEventArgs args)
{
}
/// <summary>
/// Handles the drag drop surface parameters action.
/// </summary>
/// <param name="objects">The objects.</param>
/// <param name="args">The drag drop arguments data.</param>
protected virtual void HandleDragDropParameters(List<string> objects, DragDropEventArgs args)
{
// Try to get the setter node when holding the ALT key, otherwise get the getter node
if (!Input.GetKey(KeyboardKeys.Alt) || !TryGetParameterSetterNodeArchetype(out var groupId, out var arch))
{
arch = GetParameterGetterNodeArchetype(out groupId);
}
for (int i = 0; i < objects.Count; i++)
{
var parameter = GetParameter(objects[i]);
if (parameter == null)
throw new InvalidDataException();
var values = (object[])arch.DefaultValues.Clone();
values[0] = parameter.ID;
var node = Context.SpawnNode(groupId, arch.TypeID, args.SurfaceLocation, values);
if (node != null)
args.SurfaceLocation.X += node.Width + 10;
}
}
/// <summary>
/// Gets the parameter getter node archetype to use.
/// </summary>
/// <param name="groupId">The group ID.</param>
/// <returns>The node archetype.</returns>
protected internal virtual NodeArchetype GetParameterGetterNodeArchetype(out ushort groupId)
{
groupId = 6;
return Archetypes.Parameters.Nodes[0];
}
/// <summary>
/// Tries to get the parameter setter node archetype to use.
/// </summary>
/// <param name="groupId">The group ID.</param>
/// <param name="archetype">The node archetype.</param>
/// <returns>True if a setter node exists.</returns>
protected virtual bool TryGetParameterSetterNodeArchetype(out ushort groupId, out NodeArchetype archetype)
{
groupId = 0;
archetype = null;
return false;
}
}
}