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.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));
|
||||
|
@ -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
|
||||
.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];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user