From 9a8772967ae77157038f6427a378835dcecc0a6b Mon Sep 17 00:00:00 2001 From: naninunenoy Date: Mon, 30 Nov 2020 01:40:16 +0900 Subject: [PATCH] on/off by top domain toggle --- .../AsmdefSelectionView.cs | 57 +++++++++++++++++-- .../Editor/AsmdefSelectionView/IToggle.cs | 6 ++ .../AsmdefSelectionView/IToggle.cs.meta | 3 + .../Editor/AsmdefSelectionView/ToggleGroup.cs | 28 +++++++++ .../AsmdefSelectionView/ToggleGroup.cs.meta | 3 + .../AsmdefSelectionView/UiElementToggle.cs | 10 ++++ .../UiElementToggle.cs.meta | 3 + .../Editor/DependencyNode/DomainGroup.cs | 9 ++- .../Editor/Tests/DomainGroupTest.cs | 22 +++---- 9 files changed, 120 insertions(+), 21 deletions(-) create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/IToggle.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/IToggle.cs.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/ToggleGroup.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/ToggleGroup.cs.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/UiElementToggle.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/UiElementToggle.cs.meta diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/AsmdefSelectionView.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/AsmdefSelectionView.cs index 846e2a1..d70216c 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/AsmdefSelectionView.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/AsmdefSelectionView.cs @@ -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 toggleDict; + Dictionary topToggleDict; + Dictionary toggleDict; IToggleCheckDelegate toggleDelegate; public void OnEnable() { graphWindow = GetWindow(); @@ -35,7 +38,7 @@ namespace AsmdefHelper.DependencyGraph.Editor { } public void SetAsmdef(Assembly[] assemblies, IToggleCheckDelegate toggleDelegate_) { - toggleDict = new Dictionary(assemblies.Length); + toggleDict = new Dictionary(assemblies.Length); var sortedAssemblies = assemblies.OrderBy(x => x.name).ToArray(); var scrollView = rootVisualElement.Q(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(); + 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(); + 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(); + 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(); + 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)); diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/IToggle.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/IToggle.cs new file mode 100644 index 0000000..11dae39 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/IToggle.cs @@ -0,0 +1,6 @@ +namespace AsmdefHelper.DependencyGraph.Editor { + public interface IToggle { + bool IsOn { set; get; } + string Name { set; get; } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/IToggle.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/IToggle.cs.meta new file mode 100644 index 0000000..f41232a --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/IToggle.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4f8c1aea6924490e9d1f3745569b7c03 +timeCreated: 1606663328 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/ToggleGroup.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/ToggleGroup.cs new file mode 100644 index 0000000..b19ce62 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/ToggleGroup.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; + +namespace AsmdefHelper.DependencyGraph.Editor { + public class ToggleGroup : IToggle { + readonly IToggle masterToggle; + readonly IEnumerable slaveToggles; + + public ToggleGroup(IToggle masterToggle, IEnumerable 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; + } + } + } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/ToggleGroup.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/ToggleGroup.cs.meta new file mode 100644 index 0000000..99276dc --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/ToggleGroup.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5308ff649752450ba423e8ce799f2048 +timeCreated: 1606663303 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/UiElementToggle.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/UiElementToggle.cs new file mode 100644 index 0000000..f974783 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/UiElementToggle.cs @@ -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; } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/UiElementToggle.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/UiElementToggle.cs.meta new file mode 100644 index 0000000..4fd95f0 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefSelectionView/UiElementToggle.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: faa82404bed34442b46aceb699aa2fd6 +timeCreated: 1606663359 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/DomainGroup.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/DomainGroup.cs index 35a45b2..7d2802f 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/DomainGroup.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/DomainGroup.cs @@ -57,12 +57,11 @@ namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode { .Keys .Except(GetSoloDomains()); - public IEnumerable GetSubDomains(string topDomain) { - if (dict.TryGetValue(topDomain, out var list)) - { - return list.Select(x => x.SubDomain); + public IEnumerable GetSubDomains(string topDomain) { + if (dict.TryGetValue(topDomain, out var list)) { + return list; } - return new string[0]; + return new DomainUnit[0]; } } } diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/Tests/DomainGroupTest.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/Tests/DomainGroupTest.cs index 48e329f..bdc705a 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/Tests/DomainGroupTest.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/Tests/DomainGroupTest.cs @@ -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)); } } }