diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefDependency.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefDependency.cs deleted file mode 100644 index daeaad0..0000000 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefDependency.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Collections.Generic; - -namespace AsmdefHelper.DependencyGraph.Editor { - public class AsmdefDependency { - public string DependsFrom { get; } - public IEnumerable DependsTo { get; } - - public AsmdefDependency(string key, IEnumerable value) { - DependsFrom = key; - DependsTo = value; - } - } -} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefDependency.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefDependency.cs.meta deleted file mode 100644 index 4e823b1..0000000 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefDependency.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: de8afe620d6667940a15a8871781c62d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefGraphEditorWindow.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefGraphEditorWindow.cs index 2878598..e49211f 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefGraphEditorWindow.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefGraphEditorWindow.cs @@ -13,16 +13,8 @@ namespace AsmdefHelper.DependencyGraph.Editor { void OnEnable() { // .asmdefをすべて取得 var asmdefs = CompilationPipeline.GetAssemblies(); - var allDependencies = new List(); - foreach (var asmdef in asmdefs) { - allDependencies.Add( - new AsmdefDependency( - asmdef.name, - asmdef.assemblyReferences?.Select(x => x.name) ?? new string[0]) - ); - } // viewの作成 - var graphView = new AsmdefGraphView(allDependencies) { + var graphView = new AsmdefGraphView(asmdefs) { style = { flexGrow = 1 } }; rootVisualElement.Add(graphView); diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefGraphView.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefGraphView.cs index 1a79c87..df9d8ca 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefGraphView.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefGraphView.cs @@ -1,10 +1,17 @@ using System.Collections.Generic; +using System.Linq; +using AsmdefHelper.DependencyGraph.Editor.DependencyNode; +using AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort; +using AsmdefHelper.DependencyGraph.Editor.NodeView; +using UnityEditor.Compilation; using UnityEditor.Experimental.GraphView; +using UnityEngine; using UnityEngine.UIElements; namespace AsmdefHelper.DependencyGraph.Editor { - public class AsmdefGraphView : GraphView { - public AsmdefGraphView(IEnumerable asmdefs) : base() { + public sealed class AsmdefGraphView : GraphView { + public AsmdefGraphView(IEnumerable assemblies) { + var assemblyArr = assemblies.ToArray(); // zoom可能に SetupZoom(ContentZoomer.DefaultMinScale, ContentZoomer.DefaultMaxScale); // 背景を黒に @@ -12,24 +19,50 @@ namespace AsmdefHelper.DependencyGraph.Editor { // ドラッグによる移動可能に this.AddManipulator(new SelectionDragger()); // ノードの追加 - var asmdefNodeDict = new Dictionary(); - foreach (var asmdef in asmdefs) { - var node = new AsmdefNode(asmdef.DependsFrom); + var asmdefNodeDict = new Dictionary(); + foreach (var asm in assemblyArr) { + var node = new AsmdefNode(asm.name, contentContainer); AddElement(node); asmdefNodeDict.Add(node.title, node); } - // 依存先にラインを追加 - var nodeApapter = new NodeAdapter(); - foreach (var asmdef in asmdefs) { - if (!asmdefNodeDict.TryGetValue(asmdef.DependsFrom, out var fromNode)) { + // 依存の整理 + var nodeProfiles = assemblyArr + .Select((x, i) => new NodeProfile(new NodeId(i), x.name)) + .ToDictionary(x => x.Name); + var dependencies = new List(nodeProfiles.Count); + // 依存先の設定 + foreach (var asm in assemblyArr) { + if (nodeProfiles.TryGetValue(asm.name, out var profile)) { + var requireProfiles = asm.assemblyReferences + .Where(x => nodeProfiles.ContainsKey(x.name)) + .Select(x => nodeProfiles[x.name]); + var dep = new HashSetDependencyNode(profile); + dep.SetRequireNodes(requireProfiles); + dependencies.Add(dep); + } + } + // 依存元の設定 + NodeProcessor.SetBeRequiredNodes(dependencies); + + // 依存先にのみラインを追加 + foreach (var dep in dependencies) { + if (!asmdefNodeDict.TryGetValue(dep.Profile.Name, out var fromNode)) { continue; } - foreach (var dependents in asmdef.DependsTo) { - if (!asmdefNodeDict.TryGetValue(dependents, out var toNode)) { + foreach (var dest in dep.Destinations) { + if (!asmdefNodeDict.TryGetValue(dest.Name, out var toNode)) { continue; } - var edge = fromNode.RightPort.ConnectTo(toNode.LeftPort); - contentContainer.Add(edge);// これが無いと線が表示されない + fromNode.RightPort.Connect(toNode.LeftPort); + } + } + + // ノードの場所を整列 + var sortStrategy = new RandomSortStrategy(Vector2.zero, 100, 600, 100); + var sortedNode = sortStrategy.Sort(dependencies); + foreach (var node in sortedNode) { + if (asmdefNodeDict.TryGetValue(node.Profile.Name, out var nodeView)) { + nodeView.SetPositionXY(node.Position); } } } diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefNode.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefNode.cs index af9deb8..d34eb6b 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefNode.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefNode.cs @@ -1,20 +1,20 @@ -using UnityEditor.Experimental.GraphView; +using AsmdefHelper.DependencyGraph.Editor.NodeView; +using UnityEditor.Experimental.GraphView; +using UnityEngine.UIElements; namespace AsmdefHelper.DependencyGraph.Editor { - public class AsmdefNode : Node { - public readonly Port LeftPort; - public readonly Port RightPort; + public class AsmdefNode : UiElementsNodeView, IAsmdefNodeView { + public IPort LeftPort { get; } + public IPort RightPort { get; } - public AsmdefNode(string nodeName) { - title = nodeName; + public AsmdefNode(string nodeName, VisualElement parentContentContainer) { + Label = nodeName; - LeftPort = Port.Create(Orientation.Horizontal, Direction.Output, Port.Capacity.Multi, typeof(Port)); - LeftPort.portName = "Ref By"; - outputContainer.Add(LeftPort); // as right side + LeftPort = new GraphViewPort(parentContentContainer, Direction.Input) { Label = "Ref By" }; + inputContainer.Add(LeftPort as Port); // as right side - RightPort = Port.Create(Orientation.Horizontal, Direction.Input, Port.Capacity.Multi, typeof(Port)); - RightPort.portName = "Ref To"; - inputContainer.Add(RightPort); // as left side + RightPort = new GraphViewPort(parentContentContainer, Direction.Output) { Label = "Ref To" }; + outputContainer.Add(RightPort as Port); // as left side } } } diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/NodeGrid.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/NodeGrid.cs index 7b00e0a..6216a22 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/NodeGrid.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/NodeGrid.cs @@ -3,12 +3,16 @@ using UnityEngine; namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort { public class NodeGrid { - public readonly float GridSize; + public readonly float GridWidth; + public readonly float GridHeight; + public readonly float Distance; readonly int gridSideCount; public readonly int GridCount; - public NodeGrid(float nodeWidth, float nodeDistance, int nodeCount) { - GridSize = nodeDistance + nodeWidth / 2.0F; + public NodeGrid(float nodeWidth, float nodeHeight, float nodeDistance, int nodeCount) { + GridWidth = nodeWidth; + GridHeight = nodeHeight; + Distance = nodeDistance; gridSideCount = SquareValueProvider.ProvideNearestSquareValue(nodeCount); GridCount = gridSideCount * gridSideCount; } @@ -21,10 +25,10 @@ namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort { var x = 0.0F; for (var j = 0; j < gridSideCount; j++) { grids[index] = new Vector2(x, y); - x += GridSize; + x += (GridWidth/2.0F) + Distance; index++; } - y += GridSize; + y += (GridHeight/2.0F) + Distance;; } return grids; } diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/RandomSortStrategy.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/RandomSortStrategy.cs index c16edb7..de653e7 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/RandomSortStrategy.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/RandomSortStrategy.cs @@ -19,7 +19,7 @@ namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort { var nodeArr = nodes .Select(x => new SortedNode { Profile = x.Profile, Position = originPosition }) .ToArray(); - var nodeGrid = new NodeGrid(nodeWidth, basicDistance, nodeArr.Length); + var nodeGrid = new NodeGrid(nodeWidth, nodeHeight, basicDistance, nodeArr.Length); var positions = nodeGrid.GridCenterPositions(); var indexes = Enumerable.Range(0, positions.Count).ToList(); diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeGridTest.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeGridTest.cs index 4428bbd..a07e50f 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeGridTest.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeGridTest.cs @@ -10,9 +10,8 @@ namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Tests { [Test] public void TestNodeGrid() { const float e = 0.000001F; - var nodeGrid = new NodeGrid(10.0F, 10.0F, 4); + var nodeGrid = new NodeGrid(10.0F, 10.0F, 10.0F, 4); Assert.That(nodeGrid.GridCount, Is.EqualTo(4)); - Assert.That(nodeGrid.GridSize, Is.EqualTo(15.0F).Within(e)); var grids = nodeGrid.GridCenterPositions(); Assert.That(grids[0].x, Is.EqualTo(0.0F).Within(e)); Assert.That(grids[0].y, Is.EqualTo(0.0F).Within(e)); diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/IAsmdefNodeView.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/IAsmdefNodeView.cs new file mode 100644 index 0000000..35f9fac --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/IAsmdefNodeView.cs @@ -0,0 +1,8 @@ +using AsmdefHelper.DependencyGraph.Editor.NodeView; + +namespace AsmdefHelper.DependencyGraph.Editor { + public interface IAsmdefNodeView : INodeView { + IPort LeftPort { get; } + IPort RightPort { get; } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/IAsmdefNodeView.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/IAsmdefNodeView.cs.meta new file mode 100644 index 0000000..1ab8ed3 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/IAsmdefNodeView.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b6072eb937a646a4b9cd860534bd9d43 +timeCreated: 1605710938 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/GraphViewPort.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/GraphViewPort.cs new file mode 100644 index 0000000..c96d20e --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/GraphViewPort.cs @@ -0,0 +1,24 @@ +using UnityEditor.Experimental.GraphView; +using UnityEngine; +using UnityEngine.UIElements; + +namespace AsmdefHelper.DependencyGraph.Editor.NodeView { + public class GraphViewPort : Port, IPort { + + readonly VisualElement parentContentContainer; + + public GraphViewPort(VisualElement contentContainer, Direction directionType) : base(Orientation.Horizontal, + directionType, Capacity.Multi, typeof(Port)) { + parentContentContainer = contentContainer; + } + + public string Label { set => portName = value; get => portName; } + public Vector2 Position => new Vector2(GetPosition().x, GetPosition().y); + + public void Connect(IPort port) { + if (port is Port graphViewPort) { + parentContentContainer.Add(ConnectTo(graphViewPort)); + } + } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/GraphViewPort.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/GraphViewPort.cs.meta new file mode 100644 index 0000000..b3bdaf8 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/GraphViewPort.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 44bf77af3f4d4781a1f63e6227256bec +timeCreated: 1605711889 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/IPort.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/IPort.cs new file mode 100644 index 0000000..b20b287 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/IPort.cs @@ -0,0 +1,10 @@ +using UnityEditor.Experimental.GraphView; +using UnityEngine; + +namespace AsmdefHelper.DependencyGraph.Editor.NodeView { + public interface IPort { + string Label { set; get; } + Vector2 Position { get; } + void Connect(IPort port); + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/IPort.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/IPort.cs.meta new file mode 100644 index 0000000..7dd7a52 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/IPort.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 21b3446cef7248c8b533162402f8429f +timeCreated: 1605711702 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/UiElementsNodeView.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/UiElementsNodeView.cs index 1a19c5e..4447e20 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/UiElementsNodeView.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/UiElementsNodeView.cs @@ -1,25 +1,26 @@ -using UnityEditor.Graphs; +using UnityEditor.Experimental.GraphView; +using UnityEngine; namespace AsmdefHelper.DependencyGraph.Editor.NodeView { public class UiElementsNodeView : Node, INodeView { - string INodeView.Label { + public string Label { get => title; set => title = value; } - float IRect.PositionX { - get => position.x; - set => position.x = value; + public float PositionX { + get => transform.position.x; + set => transform.position = new Vector3(value, PositionY, transform.position.z); } - float IRect.PositionY { - get => position.y; - set => position.y = value; + public float PositionY { + get => transform.position.y; + set => transform.position = new Vector3(PositionX, value, transform.position.z); } - float IRect.Height => position.height; + public float Height => contentRect.height; - float IRect.Width => position.width; + public float Width => contentRect.width; } }