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.Linq;
using System.Threading.Tasks;
using AsmdefHelper.DependencyGraph.Editor.DependencyNode;
using UnityEditor;
using UnityEditor.Compilation;
using UnityEngine;
using UnityEngine.UIElements;
namespace AsmdefHelper.DependencyGraph.Editor {
@ -12,7 +14,8 @@ namespace AsmdefHelper.DependencyGraph.Editor {
const int toggleCount = 1000;
static EditorWindow graphWindow;
Dictionary<string, (bool, Toggle)> toggleDict;
Dictionary<string, (bool, IToggle)> topToggleDict;
Dictionary<string, (bool, IToggle)> toggleDict;
IToggleCheckDelegate toggleDelegate;
public void OnEnable() {
graphWindow = GetWindow<AsmdefGraphEditorWindow>();
@ -35,7 +38,7 @@ namespace AsmdefHelper.DependencyGraph.Editor {
}
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 scrollView = rootVisualElement.Q<ScrollView>(className: "ScrollView");
for (var i = 0; i < toggleCount; i++) {
@ -44,21 +47,65 @@ namespace AsmdefHelper.DependencyGraph.Editor {
var assemblyName = sortedAssemblies[i].name;
toggle.text = assemblyName;
toggle.value = true;
toggleDict.Add(assemblyName, (true, toggle));
toggleDict.Add(assemblyName, (true, new UiElementToggle(toggle)));
} else {
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_;
}
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が無さそう)
var updated = new Dictionary<string, (bool, Toggle)>();
updated.Clear();
foreach (var pair in toggleDict) {
var (prev, toggle) = pair.Value;
var current = toggle.value;
var current = toggle.IsOn;
if (prev != current) {
toggleDelegate?.OnSelectionChanged(pair.Key, current);
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
.Except(GetSoloDomains());
public IEnumerable<string> GetSubDomains(string topDomain) {
if (dict.TryGetValue(topDomain, out var list))
{
return list.Select(x => x.SubDomain);
public IEnumerable<DomainUnit> GetSubDomains(string topDomain) {
if (dict.TryGetValue(topDomain, out var list)) {
return list;
}
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.GetSoloDomains().Count(), Is.EqualTo(2));
Assert.That(group.GetSubDomains("unity").Any(x => x == "hoge"), Is.True);
Assert.That(group.GetSubDomains("unity").Any(x => x == "fuga"), Is.True);
Assert.That(group.GetSubDomains("unity").Any(x => x == "foo.bar"), Is.True);
Assert.That(group.GetSubDomains("UniRx").Any(x => x == ""), Is.True);
Assert.That(group.GetSubDomains("UniRx").Any(x => x == "Async"), Is.True);
Assert.That(group.GetSubDomains("zenject").Any(x => x == ""), Is.True);
Assert.That(group.GetSubDomains("zenject").Any(x => x == "test-framework"), Is.True);
Assert.That(group.GetSubDomains("MyAsmdef").Any(x => x == ""), Is.True);
Assert.That(group.GetSubDomains("MyAsmdef2_Test").Any(x => x == ""), Is.True);
Assert.That(group.GetSubDomains("MyAsmdef3").Any(x => x == "hoge"), Is.True);
Assert.That(group.GetSubDomains("MyAsmdef3").Count(x => x == "hoge"), Is.EqualTo(2));
Assert.That(group.GetSubDomains("unity").Any(x => x.SubDomain == "hoge"), Is.True);
Assert.That(group.GetSubDomains("unity").Any(x => x.SubDomain == "fuga"), Is.True);
Assert.That(group.GetSubDomains("unity").Any(x => x.SubDomain == "foo.bar"), Is.True);
Assert.That(group.GetSubDomains("UniRx").Any(x => x.SubDomain == ""), Is.True);
Assert.That(group.GetSubDomains("UniRx").Any(x => x.SubDomain == "Async"), Is.True);
Assert.That(group.GetSubDomains("zenject").Any(x => x.SubDomain == ""), Is.True);
Assert.That(group.GetSubDomains("zenject").Any(x => x.SubDomain == "test-framework"), Is.True);
Assert.That(group.GetSubDomains("MyAsmdef").Any(x => x.SubDomain == ""), Is.True);
Assert.That(group.GetSubDomains("MyAsmdef2_Test").Any(x => x.SubDomain == ""), Is.True);
Assert.That(group.GetSubDomains("MyAsmdef3").Any(x => x.SubDomain == "hoge"), Is.True);
Assert.That(group.GetSubDomains("MyAsmdef3").Count(x => x.SubDomain == "hoge"), Is.EqualTo(2));
}
}
}