2025-06-07 17:43:34 +08:00

129 lines
4.0 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using UnityEngine;
namespace FairyGUI
{
/// <summary>
/// Helper for drag and drop.
/// 这是一个提供特殊拖放功能的功能类。与GObject.draggable不同拖动开始后他使用一个替代的图标作为拖动对象。
/// 当玩家释放鼠标/手指目标组件会发出一个onDrop事件。
/// </summary>
public class DragDropManager
{
private GLoader _agent;
private object _sourceData;
private GObject _source;
private static DragDropManager _inst;
public static DragDropManager inst
{
get
{
if (_inst == null)
_inst = new DragDropManager();
return _inst;
}
}
#if UNITY_2019_3_OR_NEWER
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
static void InitializeOnLoad()
{
_inst = null;
}
#endif
public DragDropManager()
{
_agent = (GLoader)UIObjectFactory.NewObject(ObjectType.Loader);
_agent.gameObjectName = "DragDropAgent";
_agent.SetHome(GRoot.inst);
_agent.touchable = false;//important
_agent.draggable = true;
_agent.SetSize(100, 100);
_agent.SetPivot(0.5f, 0.5f, true);
_agent.align = AlignType.Center;
_agent.verticalAlign = VertAlignType.Middle;
_agent.sortingOrder = int.MaxValue;
_agent.onDragEnd.Add(__dragEnd);
}
/// <summary>
/// Loader object for real dragging.
/// 用于实际拖动的Loader对象。你可以根据实际情况设置loader的大小对齐等。
/// </summary>
public GLoader dragAgent
{
get { return _agent; }
}
/// <summary>
/// Is dragging?
/// 返回当前是否正在拖动。
/// </summary>
public bool dragging
{
get { return _agent.parent != null; }
}
/// <summary>
/// Start dragging.
/// 开始拖动。
/// </summary>
/// <param name="source">Source object. This is the object which initiated the dragging.</param>
/// <param name="icon">Icon to be used as the dragging sign.</param>
/// <param name="sourceData">Custom data. You can get it in the onDrop event data.</param>
/// <param name="touchPointID">Copy the touchId from InputEvent to here, if has one.</param>
public void StartDrag(GObject source, string icon, object sourceData, int touchPointID = -1)
{
if (_agent.parent != null)
return;
_sourceData = sourceData;
_source = source;
_agent.url = icon;
GRoot.inst.AddChild(_agent);
_agent.xy = GRoot.inst.GlobalToLocal(Stage.inst.GetTouchPosition(touchPointID));
_agent.StartDrag(touchPointID);
}
/// <summary>
/// Cancel dragging.
/// 取消拖动。
/// </summary>
public void Cancel()
{
if (_agent.parent != null)
{
_agent.StopDrag();
GRoot.inst.RemoveChild(_agent);
_sourceData = null;
}
}
private void __dragEnd(EventContext evt)
{
if (_agent.parent == null) //cancelled
return;
GRoot.inst.RemoveChild(_agent);
object sourceData = _sourceData;
GObject source = _source;
_sourceData = null;
_source = null;
GObject obj = GRoot.inst.touchTarget;
while (obj != null)
{
if (obj.hasEventListeners("onDrop"))
{
obj.RequestFocus();
obj.DispatchEvent("onDrop", sourceData, source);
return;
}
obj = obj.parent;
}
}
}
}