on/off by top domain toggle

This commit is contained in:
naninunenoy 2020-11-30 01:40:16 +09:00
parent 35961651b3
commit 9a8772967a
9 changed files with 120 additions and 21 deletions

View File

@ -3,8 +3,10 @@ using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using AsmdefHelper.DependencyGraph.Editor.DependencyNode;
using UnityEditor; using UnityEditor;
using UnityEditor.Compilation; using UnityEditor.Compilation;
using UnityEngine;
using UnityEngine.UIElements; using UnityEngine.UIElements;
namespace AsmdefHelper.DependencyGraph.Editor { namespace AsmdefHelper.DependencyGraph.Editor {
@ -12,7 +14,8 @@ namespace AsmdefHelper.DependencyGraph.Editor {
const int toggleCount = 1000; const int toggleCount = 1000;
static EditorWindow graphWindow; static EditorWindow graphWindow;
Dictionary<string, (bool, Toggle)> toggleDict; Dictionary<string, (bool, IToggle)> topToggleDict;
Dictionary<string, (bool, IToggle)> toggleDict;
IToggleCheckDelegate toggleDelegate; IToggleCheckDelegate toggleDelegate;
public void OnEnable() { public void OnEnable() {
graphWindow = GetWindow<AsmdefGraphEditorWindow>(); graphWindow = GetWindow<AsmdefGraphEditorWindow>();
@ -35,7 +38,7 @@ namespace AsmdefHelper.DependencyGraph.Editor {
} }
public void SetAsmdef(Assembly[] assemblies, IToggleCheckDelegate toggleDelegate_) { public void SetAsmdef(Assembly[] assemblies, IToggleCheckDelegate toggleDelegate_) {
toggleDict = new Dictionary<string, (bool, Toggle)>(assemblies.Length); toggleDict = new Dictionary<string, (bool, IToggle)>(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++) {
@ -44,21 +47,65 @@ namespace AsmdefHelper.DependencyGraph.Editor {
var assemblyName = sortedAssemblies[i].name; var assemblyName = sortedAssemblies[i].name;
toggle.text = assemblyName; toggle.text = assemblyName;
toggle.value = true; toggle.value = true;
toggleDict.Add(assemblyName, (true, toggle)); toggleDict.Add(assemblyName, (true, new UiElementToggle(toggle)));
} else { } else {
scrollView.Remove(toggle); scrollView.Remove(toggle);
} }
} }
// グループに分ける
topToggleDict = new Dictionary<string, (bool, IToggle)>();
var group = new DomainGroup();
group.Create(sortedAssemblies.Select(x => x.name));
var tops = group.GetTopDomainsWithSomeSubDomains().ToArray();
foreach (var top in tops) {
var topToggle = new Toggle { text = top, value = true};
var slaveToggles = new List<IToggle>();
Toggle firstToggle = null;
var domains = group.GetSubDomains(top);
foreach (var domain in domains) {
if (toggleDict.TryGetValue(domain.FullName, out var x)) {
var (_, toggle) = x;
slaveToggles.Add(toggle);
if (firstToggle == null && toggle is UiElementToggle y) {
firstToggle = y.Toggle;
}
}
}
var toggleGroup = new ToggleGroup(new UiElementToggle(topToggle), slaveToggles);
if (firstToggle != null) {
var index = scrollView.IndexOf(firstToggle);
scrollView.Insert(index, topToggle);
}
topToggleDict.Add(top, (true, toggleGroup));
}
toggleDelegate = toggleDelegate_; toggleDelegate = toggleDelegate_;
} }
void OnGUI() { void OnGUI() {
var updated = new Dictionary<string, (bool, IToggle)>();
foreach (var pair in topToggleDict) {
var (prev, toggle) = pair.Value;
var current = toggle.IsOn;
if (prev != current) {
// groupのtopのtoggleのisOnを明示的にsetすることで、子のtoggleにも反映される
toggle.IsOn = current;
updated.Add(pair.Key, (current, toggle));
}
}
// 状態更新
if (updated.Any()) {
foreach (var pair in updated) {
topToggleDict[pair.Key] = pair.Value;
}
}
// toggle の更新を監視 (onValueChangedが無さそう) // toggle の更新を監視 (onValueChangedが無さそう)
var updated = new Dictionary<string, (bool, Toggle)>(); updated.Clear();
foreach (var pair in toggleDict) { foreach (var pair in toggleDict) {
var (prev, toggle) = pair.Value; var (prev, toggle) = pair.Value;
var current = toggle.value; var current = toggle.IsOn;
if (prev != current) { if (prev != current) {
toggleDelegate?.OnSelectionChanged(pair.Key, current); toggleDelegate?.OnSelectionChanged(pair.Key, current);
updated.Add(pair.Key, (current, toggle)); updated.Add(pair.Key, (current, toggle));

View File

@ -0,0 +1,6 @@
namespace AsmdefHelper.DependencyGraph.Editor {
public interface IToggle {
bool IsOn { set; get; }
string Name { set; get; }
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 4f8c1aea6924490e9d1f3745569b7c03
timeCreated: 1606663328

View File

@ -0,0 +1,28 @@
using System.Collections.Generic;
namespace AsmdefHelper.DependencyGraph.Editor {
public class ToggleGroup : IToggle {
readonly IToggle masterToggle;
readonly IEnumerable<IToggle> slaveToggles;
public ToggleGroup(IToggle masterToggle, IEnumerable<IToggle> slaveToggles) {
this.masterToggle = masterToggle;
this.slaveToggles = slaveToggles;
}
public string Name {
get => masterToggle.Name;
set => masterToggle.Name = value;
}
public bool IsOn {
get => masterToggle.IsOn;
set {
masterToggle.IsOn = value;
foreach (var toggle in slaveToggles) {
toggle.IsOn = value;
}
}
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 5308ff649752450ba423e8ce799f2048
timeCreated: 1606663303

View File

@ -0,0 +1,10 @@
using UnityEngine.UIElements;
namespace AsmdefHelper.DependencyGraph.Editor {
public class UiElementToggle : IToggle {
public readonly Toggle Toggle;
public UiElementToggle(Toggle toggle) => Toggle = toggle;
public string Name { get => Toggle.text; set => Toggle.text = value; }
public bool IsOn { get => Toggle.value; set => Toggle.value = value; }
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: faa82404bed34442b46aceb699aa2fd6
timeCreated: 1606663359

View File

@ -57,12 +57,11 @@ namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode {
.Keys .Keys
.Except(GetSoloDomains()); .Except(GetSoloDomains());
public IEnumerable<string> GetSubDomains(string topDomain) { public IEnumerable<DomainUnit> GetSubDomains(string topDomain) {
if (dict.TryGetValue(topDomain, out var list)) if (dict.TryGetValue(topDomain, out var list)) {
{ return list;
return list.Select(x => x.SubDomain);
} }
return new string[0]; return new DomainUnit[0];
} }
} }
} }

View File

@ -37,17 +37,17 @@ namespace AsmdefHelper.DependencyGraph.Editor.Tests {
Assert.That(group.GetTopDomainsWithSomeSubDomains().Count(), Is.EqualTo(4)); Assert.That(group.GetTopDomainsWithSomeSubDomains().Count(), Is.EqualTo(4));
Assert.That(group.GetSoloDomains().Count(), Is.EqualTo(2)); Assert.That(group.GetSoloDomains().Count(), Is.EqualTo(2));
Assert.That(group.GetSubDomains("unity").Any(x => x == "hoge"), Is.True); Assert.That(group.GetSubDomains("unity").Any(x => x.SubDomain == "hoge"), Is.True);
Assert.That(group.GetSubDomains("unity").Any(x => x == "fuga"), Is.True); Assert.That(group.GetSubDomains("unity").Any(x => x.SubDomain == "fuga"), Is.True);
Assert.That(group.GetSubDomains("unity").Any(x => x == "foo.bar"), Is.True); Assert.That(group.GetSubDomains("unity").Any(x => x.SubDomain == "foo.bar"), Is.True);
Assert.That(group.GetSubDomains("UniRx").Any(x => x == ""), Is.True); Assert.That(group.GetSubDomains("UniRx").Any(x => x.SubDomain == ""), Is.True);
Assert.That(group.GetSubDomains("UniRx").Any(x => x == "Async"), Is.True); Assert.That(group.GetSubDomains("UniRx").Any(x => x.SubDomain == "Async"), Is.True);
Assert.That(group.GetSubDomains("zenject").Any(x => x == ""), Is.True); Assert.That(group.GetSubDomains("zenject").Any(x => x.SubDomain == ""), Is.True);
Assert.That(group.GetSubDomains("zenject").Any(x => x == "test-framework"), Is.True); Assert.That(group.GetSubDomains("zenject").Any(x => x.SubDomain == "test-framework"), Is.True);
Assert.That(group.GetSubDomains("MyAsmdef").Any(x => x == ""), Is.True); Assert.That(group.GetSubDomains("MyAsmdef").Any(x => x.SubDomain == ""), Is.True);
Assert.That(group.GetSubDomains("MyAsmdef2_Test").Any(x => x == ""), Is.True); Assert.That(group.GetSubDomains("MyAsmdef2_Test").Any(x => x.SubDomain == ""), Is.True);
Assert.That(group.GetSubDomains("MyAsmdef3").Any(x => x == "hoge"), Is.True); Assert.That(group.GetSubDomains("MyAsmdef3").Any(x => x.SubDomain == "hoge"), Is.True);
Assert.That(group.GetSubDomains("MyAsmdef3").Count(x => x == "hoge"), Is.EqualTo(2)); Assert.That(group.GetSubDomains("MyAsmdef3").Count(x => x.SubDomain == "hoge"), Is.EqualTo(2));
} }
} }
} }