您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
93 行
2.5 KiB
93 行
2.5 KiB
using System;
|
|
using System.Linq;
|
|
using UnityEngine;
|
|
using UnityEngine.RMGUI;
|
|
|
|
namespace RMGUI.GraphView
|
|
{
|
|
public class SelectionDragger : Dragger
|
|
{
|
|
public SelectionDragger()
|
|
{
|
|
activators.Add(new ManipActivator {button = MouseButton.LeftMouse});
|
|
panSpeed = new Vector2(1, 1);
|
|
clampToParentEdges = false;
|
|
}
|
|
|
|
public override EventPropagation HandleEvent(Event evt, VisualElement finalTarget)
|
|
{
|
|
if (finalTarget == target && !this.HasCapture())
|
|
return EventPropagation.Continue;
|
|
|
|
var graphView = target as GraphView;
|
|
if (graphView == null)
|
|
{
|
|
throw new InvalidOperationException("Manipulator can only be added to a GraphView");
|
|
}
|
|
|
|
switch (evt.type)
|
|
{
|
|
case EventType.MouseDown:
|
|
if (CanStartManipulation(evt))
|
|
{
|
|
// avoid starting a manipulation on a non movable object
|
|
var ce = finalTarget as GraphElement;
|
|
if (ce == null)
|
|
{
|
|
ce = finalTarget.GetFirstAncestorOfType<GraphElement>();
|
|
if (ce == null)
|
|
return EventPropagation.Continue;
|
|
}
|
|
|
|
GraphElementPresenter presenter = ce.presenter;
|
|
if (presenter != null && ((ce.presenter.capabilities & Capabilities.Movable) != Capabilities.Movable))
|
|
return EventPropagation.Continue;
|
|
|
|
this.TakeCapture();
|
|
return EventPropagation.Stop;
|
|
}
|
|
break;
|
|
|
|
case EventType.MouseDrag:
|
|
if (this.HasCapture())
|
|
{
|
|
foreach (ISelectable s in graphView.selection)
|
|
{
|
|
GraphElement ce = s as GraphElement;
|
|
if (ce == null || ce.presenter == null)
|
|
continue;
|
|
|
|
GraphElementPresenter presenter = ce.presenter;
|
|
if ((ce.presenter.capabilities & Capabilities.Movable) != Capabilities.Movable)
|
|
continue;
|
|
|
|
Matrix4x4 g = ce.globalTransform;
|
|
var scale = new Vector3(g.m00, g.m11, g.m22);
|
|
|
|
presenter.position = CalculatePosition(presenter.position.x + evt.delta.x * panSpeed.x / scale.x,
|
|
presenter.position.y + evt.delta.y * panSpeed.y / scale.y,
|
|
presenter.position.width, presenter.position.height);
|
|
}
|
|
|
|
return EventPropagation.Stop;
|
|
}
|
|
break;
|
|
|
|
case EventType.MouseUp:
|
|
if (CanStopManipulation(evt))
|
|
{
|
|
foreach (var presenter in graphView.selection.OfType<GraphElement>()
|
|
.Select(ge => ge.presenter)
|
|
.Where(pr => pr != null))
|
|
{
|
|
presenter.CommitChanges();
|
|
}
|
|
this.ReleaseCapture();
|
|
return EventPropagation.Stop;
|
|
}
|
|
break;
|
|
}
|
|
return EventPropagation.Continue;
|
|
}
|
|
}
|
|
}
|