private void HandleGraphGUIEvents()
{
//mouse drag event handling.
switch (Event.current.type) {
// draw line while dragging.
case EventType.MouseDrag: {
switch (modifyMode) {
case ModifyMode.NONE: {
switch (Event.current.button) {
case 0:{// left click
if (Event.current.command) {
scalePoint = new ScalePoint(Event.current.mousePosition, NodeGUI.scaleFactor, 0);
modifyMode = ModifyMode.SCALING;
break;
}
selection = new AssetBundleGraphSelection(Event.current.mousePosition);
modifyMode = ModifyMode.SELECTING;
break;
}
case 2:{// middle click.
scalePoint = new ScalePoint(Event.current.mousePosition, NodeGUI.scaleFactor, 0);
modifyMode = ModifyMode.SCALING;
break;
}
}
break;
}
case ModifyMode.SELECTING: {
// do nothing.
break;
}
case ModifyMode.SCALING: {
var baseDistance = (int)Vector2.Distance(Event.current.mousePosition, new Vector2(scalePoint.x, scalePoint.y));
var distance = baseDistance / NodeGUI.SCALE_WIDTH;
var direction = (0 < Event.current.mousePosition.y - scalePoint.y);
if (!direction) distance = -distance;
// var before = NodeGUI.scaleFactor;
NodeGUI.scaleFactor = scalePoint.startScale + (distance * NodeGUI.SCALE_RATIO);
if (NodeGUI.scaleFactor < NodeGUI.SCALE_MIN) NodeGUI.scaleFactor = NodeGUI.SCALE_MIN;
if (NodeGUI.SCALE_MAX < NodeGUI.scaleFactor) NodeGUI.scaleFactor = NodeGUI.SCALE_MAX;
break;
}
}
HandleUtility.Repaint();
Event.current.Use();
break;
}
}
// mouse up event handling.
// use rawType for detect for detectiong mouse-up which raises outside of window.
switch (Event.current.rawType) {
case EventType.MouseUp: {
switch (modifyMode) {
/*
select contained nodes & connections.
*/
case ModifyMode.SELECTING: {
var x = 0f;
var y = 0f;
var width = 0f;
var height = 0f;
if (Event.current.mousePosition.x < selection.x) {
x = Event.current.mousePosition.x;
width = selection.x - Event.current.mousePosition.x;
}
if (selection.x < Event.current.mousePosition.x) {
x = selection.x;
width = Event.current.mousePosition.x - selection.x;
}
if (Event.current.mousePosition.y < selection.y) {
y = Event.current.mousePosition.y;
height = selection.y - Event.current.mousePosition.y;
}
if (selection.y < Event.current.mousePosition.y) {
y = selection.y;
height = Event.current.mousePosition.y - selection.y;
}
var activeObjectIds = new List<string>();
var selectedRect = new Rect(x, y, width, height);
foreach (var node in nodes) {
var nodeRect = new Rect(node.GetRect());
nodeRect.x = nodeRect.x * NodeGUI.scaleFactor;
nodeRect.y = nodeRect.y * NodeGUI.scaleFactor;
nodeRect.width = nodeRect.width * NodeGUI.scaleFactor;
nodeRect.height = nodeRect.height * NodeGUI.scaleFactor;
// get containd nodes,
if (nodeRect.Overlaps(selectedRect)) {
activeObjectIds.Add(node.Id);
}
}
foreach (var connection in connections) {
// get contained connection badge.
if (connection.GetRect().Overlaps(selectedRect)) {
activeObjectIds.Add(connection.Id);
}
}
if (Event.current.shift) {
// add current active object ids to new list.
foreach (var alreadySelectedObjectId in activeObject.idPosDict.ReadonlyDict().Keys) {
if (!activeObjectIds.Contains(alreadySelectedObjectId)) activeObjectIds.Add(alreadySelectedObjectId);
}
} else {
// do nothing, means cancel selections if nodes are not contained by selection.
}
Undo.RecordObject(this, "Select Objects");
activeObject = RenewActiveObject(activeObjectIds);
UpdateActivationOfObjects(activeObject);
selection = new AssetBundleGraphSelection(Vector2.zero);
modifyMode = ModifyMode.NONE;
HandleUtility.Repaint();
Event.current.Use();
break;
}
case ModifyMode.SCALING: {
modifyMode = ModifyMode.NONE;
break;
}
}
break;
}
}
}