-
Notifications
You must be signed in to change notification settings - Fork 387
Expand file tree
/
Copy pathDependencyTreeViewer.cs
More file actions
217 lines (185 loc) · 7.49 KB
/
Copy pathDependencyTreeViewer.cs
File metadata and controls
217 lines (185 loc) · 7.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
using System;
using System.Collections.Generic;
using System.Linq;
using NugetForUnity.Configuration;
using NugetForUnity.Models;
using UnityEditor;
using UnityEngine;
namespace NugetForUnity.Ui
{
/// <summary>
/// A viewer for all of the packages and their dependencies currently installed in the project.
/// </summary>
public class DependencyTreeViewer : EditorWindow
{
private readonly Dictionary<INugetPackage, bool> expanded = new Dictionary<INugetPackage, bool>();
/// <summary>
/// The list of packages that depend on the specified package.
/// </summary>
private readonly List<INugetPackage> parentPackages = new List<INugetPackage>();
/// <summary>
/// The titles of the tabs in the window.
/// </summary>
private readonly string[] tabTitles = { "Dependency Tree", "Who Depends on Me?" };
/// <summary>
/// The currently selected tab in the window.
/// </summary>
private int currentTab;
/// <summary>
/// The array of currently installed package IDs.
/// </summary>
private string[] installedPackageIds;
/// <summary>
/// The list of currently installed packages.
/// </summary>
private List<INugetPackage> installedPackages;
private List<INugetPackage> roots;
private Vector2 scrollPosition;
private int selectedPackageIndex = -1;
/// <summary>
/// Opens the NuGet Package Manager Window.
/// </summary>
internal static void DisplayDependencyTree()
{
GetWindow<DependencyTreeViewer>();
}
/// <summary>
/// Automatically called by Unity to draw the GUI.
/// </summary>
protected void OnGUI()
{
currentTab = GUILayout.Toolbar(currentTab, tabTitles);
switch (currentTab)
{
case 0:
scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);
foreach (var package in roots)
{
DrawPackage(package);
}
EditorGUILayout.EndScrollView();
break;
case 1:
EditorStyles.label.fontStyle = FontStyle.Bold;
EditorStyles.label.fontSize = 14;
EditorGUILayout.LabelField("Select Dependency:", GUILayout.Height(20));
EditorStyles.label.fontStyle = FontStyle.Normal;
EditorStyles.label.fontSize = 10;
EditorGUI.indentLevel++;
var newIndex = EditorGUILayout.Popup(selectedPackageIndex, installedPackageIds);
EditorGUI.indentLevel--;
if (newIndex != selectedPackageIndex)
{
selectedPackageIndex = newIndex;
parentPackages.Clear();
var selectedPackage = installedPackages[selectedPackageIndex];
foreach (var package in installedPackages)
{
var frameworkDependencies = package.CurrentFrameworkDependencies;
foreach (var dependency in frameworkDependencies)
{
if (dependency.Id == selectedPackage.Id)
{
parentPackages.Add(package);
}
}
}
}
EditorGUILayout.Space();
EditorStyles.label.fontStyle = FontStyle.Bold;
EditorStyles.label.fontSize = 14;
EditorGUILayout.LabelField("Packages That Depend on Above:", GUILayout.Height(20));
EditorStyles.label.fontStyle = FontStyle.Normal;
EditorStyles.label.fontSize = 10;
scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);
EditorGUI.indentLevel++;
if (parentPackages.Count <= 0)
{
EditorGUILayout.LabelField("NONE");
}
else
{
foreach (var parent in parentPackages)
{
DrawPackage(parent);
}
}
EditorGUI.indentLevel--;
EditorGUILayout.EndScrollView();
break;
}
}
/// <summary>
/// Called when enabling the window.
/// </summary>
private void OnEnable()
{
try
{
// reload the NuGet.config file, in case it was changed after Unity opened, but before the manager window opened (now)
ConfigurationManager.LoadNugetConfigFile();
// set the window title
titleContent = new GUIContent("Dependencies");
EditorUtility.DisplayProgressBar("Building Dependency Tree", "Reading installed packages...", 0.5f);
InstalledPackagesManager.UpdateInstalledPackages();
installedPackages = InstalledPackagesManager.InstalledPackages.ToList();
var installedPackageNames = new List<string>();
foreach (var package in installedPackages)
{
if (!expanded.ContainsKey(package))
{
expanded.Add(package, false);
}
installedPackageNames.Add(package.Id);
}
installedPackageIds = installedPackageNames.ToArray();
BuildTree();
}
catch (Exception e)
{
Debug.LogErrorFormat("{0}", e);
}
finally
{
EditorUtility.ClearProgressBar();
}
}
private void BuildTree()
{
roots = InstalledPackagesManager.GetInstalledRootPackages();
}
private void DrawDependency(INugetPackageIdentifier dependency)
{
var fullDependency = installedPackages.Find(p => p.Id == dependency.Id);
if (fullDependency != null)
{
DrawPackage(fullDependency);
}
else if (!InstalledPackagesManager.IsInstalled(dependency, true))
{
Debug.LogErrorFormat("{0} {1} is not installed!", dependency.Id, dependency.Version);
}
}
private void DrawPackage(INugetPackage package)
{
if (package.Dependencies.Count > 0)
{
expanded[package] = EditorGUILayout.Foldout(expanded[package], $"{package.Id} {package.Version}");
if (expanded[package])
{
EditorGUI.indentLevel++;
var frameworkDependencies = package.CurrentFrameworkDependencies;
foreach (var dependency in frameworkDependencies)
{
DrawDependency(dependency);
}
EditorGUI.indentLevel--;
}
}
else
{
EditorGUILayout.LabelField($"{package.Id} {package.Version}");
}
}
}
}