129 lines
4.0 KiB
C#
129 lines
4.0 KiB
C#
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;
|
||
}
|
||
}
|
||
}
|
||
} |