您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

215 行
6.0 KiB

using System;
using UnityEditor;
using UnityEngine;
using UnityEngine.RMGUI;
namespace RMGUI.GraphView.Demo
{
public class MiniMap : GraphElement
{
private float m_PreviousContainerWidth = -1;
private float m_PreviousContainerHeight = -1;
private readonly Label m_Label;
private readonly Dragger m_Dragger;
public MiniMap()
{
zBias = 99;
clipChildren = false;
m_Label = new Label(new GUIContent("Floating Minimap"));
AddChild(m_Label);
m_Dragger = new Dragger {activateButton = MouseButton.LeftMouse, clampToParentEdges = true};
AddManipulator(new ContextualMenu((evt, customData) =>
{
var boxData = dataProvider as MiniMapData;
if (boxData != null)
{
var menu = new GenericMenu();
menu.AddItem(new GUIContent(boxData.anchored ? "Make floating" : "Anchor"), false,
contentView =>
{
var bData = dataProvider as MiniMapData;
if (bData != null)
bData.anchored = !bData.anchored;
},
this);
menu.ShowAsContext();
}
return EventPropagation.Continue;
}));
}
public override void OnDataChanged()
{
base.OnDataChanged();
AdjustAnchoring();
Resize();
}
private void AdjustAnchoring()
{
var miniMapData = dataProvider as MiniMapData;
if (miniMapData == null)
{
return;
}
// TODO we might want to update the movable capability...
if (miniMapData.anchored)
{
RemoveManipulator(m_Dragger);
ResetPositionProperties();
AddToClassList("anchored");
}
else
{
AddManipulator(m_Dragger);
RemoveFromClassList("anchored");
}
}
private void Resize()
{
var miniMapData = dataProvider as MiniMapData;
if (miniMapData == null || parent == null)
{
return;
}
if (parent.position.height > parent.position.width)
{
height = miniMapData.maxHeight;
width = parent.position.width * height / parent.position.height;
}
else
{
width = miniMapData.maxWidth;
height = parent.position.height * width / parent.position.width;
}
// Relocate if partially visible on bottom or right side (left/top not checked, only bottom/right affected by a size change)
if (positionLeft + width > parent.position.x + parent.position.width)
{
var newPosition = miniMapData.position;
newPosition.x -= positionLeft + width - (parent.position.x + parent.position.width);
miniMapData.position = newPosition;
}
if (positionTop + height > parent.position.y + parent.position.height)
{
var newPosition = miniMapData.position;
newPosition.y -= positionTop + height - (parent.position.y + parent.position.height);
miniMapData.position = newPosition;
}
}
public override void DoRepaint(IStylePainter painter)
{
var gView = this.GetFirstAncestorOfType<GraphView>();
VisualContainer container = gView.contentViewContainer;
Matrix4x4 containerTransform = container.globalTransform;
Vector4 containerTranslation = containerTransform.GetColumn(3);
var containerScale = new Vector2(containerTransform.m00, containerTransform.m11);
Rect containerPosition = container.position;
float containerWidth = parent.position.width / containerScale.x;
float containerHeight = parent.position.height / containerScale.y;
if ( (containerWidth != m_PreviousContainerWidth || containerHeight != m_PreviousContainerHeight) && dataProvider != null)
{
m_PreviousContainerWidth = containerWidth;
m_PreviousContainerHeight = containerHeight;
Resize();
}
m_Label.content = new GUIContent("Minimap p:" +
String.Format("{0:0}", containerPosition.position.x) + "," + String.Format("{0:0}", containerPosition.position.y) + " t: " +
String.Format("{0:0}", containerTranslation.x) + "," + String.Format("{0:0}", containerTranslation.y) + " s: " +
String.Format("{0:N2}", containerScale.x)/* + "," + String.Format("{0:N2}", containerScale.y)*/);
base.DoRepaint(painter);
foreach (var child in container.children)
{
// For some reason, I can't seem to be able to use Linq (IEnumerable.OfType() nor IEnumerable.Where appear to be working here. ??)
var elem = child as GraphElement;
// TODO: Should Edges be displayed at all?
// TODO: Maybe edges need their own capabilities flag.
if (elem == null || (elem.dataProvider.capabilities & Capabilities.Floating) != 0 || (elem.dataProvider is EdgeData))
{
continue;
}
var titleBarOffset = (int)paddingTop;
Rect rect = child.position;
rect.x /= containerWidth;
rect.width /= containerWidth;
rect.y /= containerHeight;
rect.height /= containerHeight;
rect.x *= position.width;
rect.y *= position.height-titleBarOffset;
rect.width *= position.width;
rect.height *= position.height-titleBarOffset;
rect.y += titleBarOffset;
rect.x += position.x;
rect.y += position.y;
rect.x += containerTranslation.x * position.width / parent.position.width;
rect.y += containerTranslation.y * (position.height-titleBarOffset) / parent.position.height;
rect.x += containerPosition.x * position.width / containerWidth;
rect.y += containerPosition.y * (position.height-titleBarOffset) / containerHeight;
if (rect.x < position.xMin)
{
if (rect.x < position.xMin - rect.width)
{
continue;
}
rect.width -= position.xMin - rect.x;
rect.x = position.xMin;
}
if (rect.x + rect.width >= position.xMax)
{
if (rect.x >= position.xMax)
{
continue;
}
rect.width -= rect.x + rect.width - position.xMax;
}
if (rect.y < position.yMin+titleBarOffset)
{
if (rect.y < position.yMin+titleBarOffset - rect.height)
{
continue;
}
rect.height -= position.yMin+titleBarOffset - rect.y;
rect.y = position.yMin+titleBarOffset;
}
if (rect.y + rect.height >= position.yMax)
{
if (rect.y >= position.yMax)
{
continue;
}
rect.height -= rect.y + rect.height - position.yMax;
}
Handles.DrawSolidRectangleWithOutline(rect, Color.grey, Color.grey);
}
}
}
}