on/off by top domain toggle
This commit is contained in:
parent
35961651b3
commit
9a8772967a
@ -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));
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
namespace AsmdefHelper.DependencyGraph.Editor {
|
||||||
|
public interface IToggle {
|
||||||
|
bool IsOn { set; get; }
|
||||||
|
string Name { set; get; }
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 4f8c1aea6924490e9d1f3745569b7c03
|
||||||
|
timeCreated: 1606663328
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 5308ff649752450ba423e8ce799f2048
|
||||||
|
timeCreated: 1606663303
|
@ -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; }
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: faa82404bed34442b46aceb699aa2fd6
|
||||||
|
timeCreated: 1606663359
|
@ -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];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user