1
0
mirror of https://github.com/Siccity/xNode.git synced 2025-12-21 01:36:03 +08:00

Fixed dynamic node width.

Fixed field widths.
This commit is contained in:
Thor Kramer Brigsted 2017-11-03 10:11:07 +01:00
parent 46e32234f3
commit 432ce05bb5
4 changed files with 19 additions and 16 deletions

View File

@ -137,7 +137,9 @@ public partial class NodeEditorWindow {
Vector2 mousePos = Event.current.mousePosition;
//Get node position
Vector2 nodePos = GridToWindowPosition(node.position);
Rect windowRect = new Rect(nodePos, new Vector2(200 / zoom, 30 / zoom));
float width = 200;
if (nodeWidths.ContainsKey(node)) width = nodeWidths[node];
Rect windowRect = new Rect(nodePos, new Vector2(width / zoom, 30 / zoom));
return windowRect.Contains(mousePos);
}
}

View File

@ -117,7 +117,7 @@ public partial class NodeEditorWindow {
//If a null node is found, return. This can happen if the nodes associated script is deleted. It is currently not possible in Unity to delete a null asset.
if (node == null) continue;
foreach(NodePort output in node.Outputs) {
foreach (NodePort output in node.Outputs) {
//Needs cleanup. Null checks are ugly
if (!portConnectionPoints.ContainsKey(output)) continue;
Vector2 from = _portConnectionPoints[output].center;
@ -136,7 +136,10 @@ public partial class NodeEditorWindow {
private void DrawNodes() {
Event e = Event.current;
if (e.type == EventType.Repaint) portConnectionPoints.Clear();
if (e.type == EventType.Repaint) {
portConnectionPoints.Clear();
nodeWidths.Clear();
}
//Selected node is hashed before and after node GUI to detect changes
int nodeHash = 0;
@ -186,6 +189,8 @@ public partial class NodeEditorWindow {
}
if (e.type == EventType.Repaint) {
nodeWidths.Add(node, nodeEditor.GetWidth());
foreach (var kvp in NodeEditor.portPositions) {
Vector2 portHandlePos = kvp.Value;
portHandlePos += node.position;
@ -204,14 +209,14 @@ public partial class NodeEditorWindow {
//Check if we are hovering any of this nodes ports
//Check input ports
foreach(NodePort input in node.Inputs) {
foreach (NodePort input in node.Inputs) {
//Check if port rect is available
if (!portConnectionPoints.ContainsKey(input)) continue;
Rect r = GridToWindowRect(portConnectionPoints[input]);
if (r.Contains(mousePos)) hoveredPort = input;
}
//Check all output ports
foreach(NodePort output in node.Outputs) {
foreach (NodePort output in node.Outputs) {
//Check if port rect is available
if (!portConnectionPoints.ContainsKey(output)) continue;
Rect r = GridToWindowRect(portConnectionPoints[output]);
@ -274,7 +279,7 @@ public partial class NodeEditorWindow {
else {
string s = TypeToString(elementType);
int i = s.IndexOf('[');
return s.Substring(0,i) + "["+rank+"]" + s.Substring(i);
return s.Substring(0, i) + "[" + rank + "]" + s.Substring(i);
}
} else return hoveredPort.ValueType.ToString();
}

View File

@ -14,10 +14,8 @@ public static class NodeEditorGUILayout {
Node node = property.serializedObject.targetObject as Node;
NodePort port = node.GetPort(property.name);
float temp_labelWidth = EditorGUIUtility.labelWidth;
// If property is not a port, display a regular property field
if (port == null) EditorGUILayout.PropertyField(property, includeChildren);
if (port == null) EditorGUILayout.PropertyField(property, includeChildren, GUILayout.MinWidth(30));
else {
Rect rect = new Rect();
@ -26,12 +24,12 @@ public static class NodeEditorGUILayout {
// Display a label if port is connected
if (port.IsConnected) EditorGUILayout.LabelField(property.displayName);
// Display an editable property field if port is not connected
else EditorGUILayout.PropertyField(property, includeChildren);
else EditorGUILayout.PropertyField(property, includeChildren, GUILayout.MinWidth(30));
rect = GUILayoutUtility.GetLastRect();
rect.position = rect.position - new Vector2(16, 0);
// If property is an output, display a text label and put a port handle on the right side
} else if (port.direction == NodePort.IO.Output) {
EditorGUILayout.LabelField(property.displayName, NodeEditorResources.styles.outputPort);
EditorGUILayout.LabelField(property.displayName, NodeEditorResources.styles.outputPort, GUILayout.MinWidth(30));
rect = GUILayoutUtility.GetLastRect();
rect.position = rect.position + new Vector2(rect.width, 0);
}
@ -45,14 +43,11 @@ public static class NodeEditorGUILayout {
if (NodeEditor.portPositions.ContainsKey(port)) NodeEditor.portPositions[port] = portPos;
else NodeEditor.portPositions.Add(port, portPos);
}
EditorGUIUtility.labelWidth = temp_labelWidth;
}
public static void PortField(NodePort port) {
if (port == null) return;
float temp_labelWidth = EditorGUIUtility.labelWidth;
EditorGUILayout.LabelField(port.fieldName.PrettifyCamelCase());
EditorGUILayout.LabelField(port.fieldName.PrettifyCamelCase(), GUILayout.MinWidth(30));
Rect rect = GUILayoutUtility.GetLastRect();
if (port.direction == NodePort.IO.Input) rect.position = rect.position - new Vector2(16, 0);
@ -65,7 +60,6 @@ public static class NodeEditorGUILayout {
Vector2 portPos = rect.center;
if (NodeEditor.portPositions.ContainsKey(port)) NodeEditor.portPositions[port] = portPos;
else NodeEditor.portPositions.Add(port, portPos);
EditorGUIUtility.labelWidth = temp_labelWidth;
}
private static void DrawPortHandle(Rect rect, Type type) {

View File

@ -13,6 +13,8 @@ public partial class NodeEditorWindow : EditorWindow {
/// <summary> Stores node positions for all nodePorts. </summary>
public Dictionary<NodePort, Rect> portConnectionPoints { get { return _portConnectionPoints; } }
private Dictionary<NodePort, Rect> _portConnectionPoints = new Dictionary<NodePort, Rect>();
public Dictionary<Node, float> nodeWidths { get { return _nodeWidths; } }
private Dictionary<Node, float> _nodeWidths = new Dictionary<Node, float>();
public NodeGraph graph;
public Vector2 panOffset { get { return _panOffset; } set { _panOffset = value; Repaint(); } }
private Vector2 _panOffset;