node visibility

This commit is contained in:
naninunenoy 2020-11-26 22:16:00 +09:00
parent 6e5241ed2e
commit 52f2856307
9 changed files with 69 additions and 10 deletions

View File

@ -1,11 +1,11 @@
using System.Collections.Generic; using UnityEditor;
using System.Linq;
using UnityEditor;
using UnityEditor.Compilation; using UnityEditor.Compilation;
namespace AsmdefHelper.DependencyGraph.Editor { namespace AsmdefHelper.DependencyGraph.Editor {
public class AsmdefGraphEditorWindow : EditorWindow { public class AsmdefGraphEditorWindow : EditorWindow, IToggleCheckDelegate {
static AsmdefSelectionView selectionWindow; static AsmdefSelectionView selectionWindow;
AsmdefGraphView graphView;
[MenuItem("AsmdefHelper/Open DependencyGraph", priority = 2000)] [MenuItem("AsmdefHelper/Open DependencyGraph", priority = 2000)]
public static void Open() { public static void Open() {
GetWindow<AsmdefGraphEditorWindow>("Asmdef Dependency"); GetWindow<AsmdefGraphEditorWindow>("Asmdef Dependency");
@ -15,14 +15,14 @@ namespace AsmdefHelper.DependencyGraph.Editor {
// .asmdefをすべて取得 // .asmdefをすべて取得
var asmdefs = CompilationPipeline.GetAssemblies(); var asmdefs = CompilationPipeline.GetAssemblies();
// viewの作成 // viewの作成
var graphView = new AsmdefGraphView(asmdefs) { graphView = new AsmdefGraphView(asmdefs) {
style = { flexGrow = 1 } style = { flexGrow = 1 }
}; };
rootVisualElement.Add(graphView); rootVisualElement.Add(graphView);
// 選択ウィンドウも作成 // 選択ウィンドウも作成
selectionWindow = GetWindow<AsmdefSelectionView>("Asmdef Selection"); selectionWindow = GetWindow<AsmdefSelectionView>("Asmdef Selection");
selectionWindow.SetAsmdef(asmdefs); selectionWindow.SetAsmdef(asmdefs, this);
} }
// 片方を閉じる // 片方を閉じる
@ -32,5 +32,9 @@ namespace AsmdefHelper.DependencyGraph.Editor {
} }
selectionWindow = null; selectionWindow = null;
} }
void IToggleCheckDelegate.OnSelectionChanged(string label, bool isChecked) {
graphView.SetNodeVisibility(label, isChecked);
}
} }
} }

View File

@ -10,6 +10,7 @@ using UnityEngine.UIElements;
namespace AsmdefHelper.DependencyGraph.Editor { namespace AsmdefHelper.DependencyGraph.Editor {
public sealed class AsmdefGraphView : GraphView { public sealed class AsmdefGraphView : GraphView {
readonly Dictionary<string, IAsmdefNodeView> asmdefNodeDict;
public AsmdefGraphView(IEnumerable<Assembly> assemblies) { public AsmdefGraphView(IEnumerable<Assembly> assemblies) {
var assemblyArr = assemblies.ToArray(); var assemblyArr = assemblies.ToArray();
// zoom可能に // zoom可能に
@ -21,7 +22,7 @@ namespace AsmdefHelper.DependencyGraph.Editor {
// ドラッグで描画範囲を動かせるように // ドラッグで描画範囲を動かせるように
this.AddManipulator(new ContentDragger()); this.AddManipulator(new ContentDragger());
// ノードの追加 // ノードの追加
var asmdefNodeDict = new Dictionary<string, IAsmdefNodeView>(); asmdefNodeDict = new Dictionary<string, IAsmdefNodeView>();
foreach (var asm in assemblyArr) { foreach (var asm in assemblyArr) {
var node = new AsmdefNode(asm.name, contentContainer); var node = new AsmdefNode(asm.name, contentContainer);
AddElement(node); AddElement(node);
@ -77,6 +78,12 @@ namespace AsmdefHelper.DependencyGraph.Editor {
} }
} }
public void SetNodeVisibility(string nodeName, bool visible_) {
if (asmdefNodeDict.TryGetValue(nodeName, out var node)) {
node.Visibility = visible_;
}
}
public override List<Port> GetCompatiblePorts(Port startAnchor, NodeAdapter nodeAdapter) { public override List<Port> GetCompatiblePorts(Port startAnchor, NodeAdapter nodeAdapter) {
return ports.ToList(); return ports.ToList();
} }

View File

@ -11,6 +11,9 @@ namespace AsmdefHelper.DependencyGraph.Editor {
public class AsmdefSelectionView : EditorWindow { public class AsmdefSelectionView : EditorWindow {
const int toggleCount = 1000; const int toggleCount = 1000;
static EditorWindow graphWindow; static EditorWindow graphWindow;
Dictionary<string, (bool, Toggle)> toggleDict;
IToggleCheckDelegate toggleDelegate;
public void OnEnable() { public void OnEnable() {
graphWindow = GetWindow<AsmdefGraphEditorWindow>(); graphWindow = GetWindow<AsmdefGraphEditorWindow>();
@ -31,18 +34,42 @@ namespace AsmdefHelper.DependencyGraph.Editor {
root.Add(labelFromUXML); root.Add(labelFromUXML);
} }
public void SetAsmdef(Assembly[] assemblies) { public void SetAsmdef(Assembly[] assemblies, IToggleCheckDelegate toggleDelegate_) {
toggleDict = new Dictionary<string, (bool, Toggle)>(assemblies.Length);
var sortedAssemblies = assemblies.OrderBy(x => x.name).ToArray(); var sortedAssemblies = assemblies.OrderBy(x => x.name).ToArray();
var scrollView = rootVisualElement.Q<ScrollView>(className: "ScrollView"); var scrollView = rootVisualElement.Q<ScrollView>(className: "ScrollView");
for (var i = 0; i < toggleCount; i++) { for (var i = 0; i < toggleCount; i++) {
var toggle = rootVisualElement.Q<Toggle>(className: $"toggle{i}"); var toggle = rootVisualElement.Q<Toggle>(className: $"toggle{i}");
if (i < sortedAssemblies.Length) { if (i < sortedAssemblies.Length) {
toggle.text = sortedAssemblies[i].name; var assemblyName = sortedAssemblies[i].name;
toggle.text = assemblyName;
toggle.value = true; toggle.value = true;
toggleDict.Add(assemblyName, (true, toggle));
} else { } else {
scrollView.Remove(toggle); scrollView.Remove(toggle);
} }
} }
toggleDelegate = toggleDelegate_;
}
void OnGUI() {
// toggle の更新を監視 (onValueChangedが無さそう)
var updated = new Dictionary<string, (bool, Toggle)>();
foreach (var pair in toggleDict) {
var (prev, toggle) = pair.Value;
var current = toggle.value;
if (prev != current) {
toggleDelegate?.OnSelectionChanged(pair.Key, current);
updated.Add(pair.Key, (current, toggle));
}
}
// 状態更新
if (updated.Any()) {
foreach (var pair in updated) {
toggleDict[pair.Key] = pair.Value;
}
}
} }
// 片方を閉じる // 片方を閉じる

View File

@ -0,0 +1,5 @@
namespace AsmdefHelper.DependencyGraph.Editor {
public interface IToggleCheckDelegate {
void OnSelectionChanged(string label, bool isChecked);
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 0c48da7c3f95419cbfc95c4ec2816489
timeCreated: 1606313215

View File

@ -1,5 +1,5 @@
namespace AsmdefHelper.DependencyGraph.Editor.NodeView { namespace AsmdefHelper.DependencyGraph.Editor.NodeView {
public interface INodeView : IRect { public interface INodeView : IRect, IVisible {
string Label { set; get; } string Label { set; get; }
} }
} }

View File

@ -0,0 +1,5 @@
namespace AsmdefHelper.DependencyGraph.Editor.NodeView {
public interface IVisible {
bool Visibility { set; get; }
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: aecb56b3d2f84f408ad0aff39ba9e24c
timeCreated: 1606396097

View File

@ -22,5 +22,10 @@ namespace AsmdefHelper.DependencyGraph.Editor.NodeView {
public float Height => contentRect.height; public float Height => contentRect.height;
public float Width => contentRect.width; public float Width => contentRect.width;
public bool Visibility {
get => visible;
set => visible = value;
}
} }
} }