Skip to content

Commit 56dc36a

Browse files
committed
Add initial implementation of moving component categories
1 parent 4f74275 commit 56dc36a

4 files changed

Lines changed: 100 additions & 1 deletion

File tree

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using ComponentSelectorAdditions.Events;
2+
using FrooxEngine;
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Text;
6+
7+
namespace ComponentSelectorAdditions
8+
{
9+
// Make this have source and target to actually remove the types from the source?
10+
// Removal would be optional, of course
11+
public sealed class CategoryOverride
12+
{
13+
private readonly Func<EnumerateComponentsEvent, IEnumerable<ComponentResult>> _getAdditionalComponents;
14+
public CategoryNode<Type> TargetCategory { get; }
15+
16+
public CategoryOverride(CategoryNode<Type> targetCategory, Func<EnumerateComponentsEvent, IEnumerable<ComponentResult>> getAdditionalComponents)
17+
{
18+
TargetCategory = targetCategory;
19+
_getAdditionalComponents = getAdditionalComponents;
20+
}
21+
22+
public IEnumerable<ComponentResult> GetAdditionalComponents(EnumerateComponentsEvent eventData)
23+
=> _getAdditionalComponents(eventData);
24+
}
25+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
using ComponentSelectorAdditions.Events;
2+
using EnumerableToolkit;
3+
using FrooxEngine;
4+
using MonkeyLoader.Resonite;
5+
using System;
6+
using System.Collections.Generic;
7+
using System.Collections.Immutable;
8+
using System.Linq;
9+
using System.Text;
10+
11+
namespace ComponentSelectorAdditions
12+
{
13+
public sealed class CategoryOverrideHandler : ResoniteCancelableEventHandlerMonkey<CategoryOverrideHandler, EnumerateComponentsEvent>
14+
{
15+
private static readonly Dictionary<CategoryNode<Type>, HashSet<CategoryOverride>> _overridesByCategory = new();
16+
17+
/// <inheritdoc/>
18+
public override int Priority => HarmonyLib.Priority.VeryLow;
19+
20+
/// <inheritdoc/>
21+
public override bool SkipCanceled => false;
22+
23+
public static bool AddOverride(CategoryOverride categoryOverride)
24+
=> _overridesByCategory.GetOrCreateValue(categoryOverride.TargetCategory).Add(categoryOverride);
25+
26+
public static IEnumerable<CategoryOverride> GetOverrides(CategoryNode<Type> category)
27+
=> _overridesByCategory.TryGetValue(category, out var overrides) ? overrides.AsSafeEnumerable() : Enumerable.Empty<CategoryOverride>();
28+
29+
public static bool HasAnyOverride(CategoryNode<Type> category)
30+
=> _overridesByCategory.TryGetValue(category, out var overrides) && overrides.Count > 0;
31+
32+
public static bool HasOverride(CategoryOverride categoryOverride)
33+
=> _overridesByCategory.TryGetValue(categoryOverride.TargetCategory, out var overrides) && overrides.Contains(categoryOverride);
34+
35+
public static bool RemoveOverride(CategoryOverride categoryOverride)
36+
=> _overridesByCategory.TryGetValue(categoryOverride.TargetCategory, out var overrides) && overrides.Remove(categoryOverride);
37+
38+
/// <inheritdoc/>
39+
protected override void Handle(EnumerateComponentsEvent eventData)
40+
{
41+
foreach (var categoryOverride in GetOverrides(eventData.RootCategory))
42+
{
43+
foreach (var additionalResult in categoryOverride.GetAdditionalComponents(eventData))
44+
eventData.AddItem(additionalResult);
45+
}
46+
}
47+
48+
/// <inheritdoc/>
49+
protected override bool OnEngineReady()
50+
{
51+
var transformDriversCategory = WorkerInitializer.ComponentLibrary.GetSubcategory("Transform/Drivers");
52+
53+
var convertibleValueDrivers = WorkerInitializer.ComponentLibrary.GetSubcategory("Uncategorized").Elements
54+
.Where(type => type.Name.StartsWith("Convertible") && type.Name.Contains("Driver"))
55+
.Select(type => new ComponentResult(transformDriversCategory, type, "Convertible Value Driver"))
56+
.ToImmutableArray();
57+
58+
AddOverride(new(transformDriversCategory, _ => convertibleValueDrivers));
59+
60+
return base.OnEngineReady();
61+
}
62+
}
63+
}

ComponentSelectorAdditions/ComponentResult.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,20 @@ public sealed class ComponentResult
6363
/// <param name="category">The category that should be shown as the <see cref="Type">Type's</see> parent.</param>
6464
/// <param name="type">The component / node <see cref="System.Type"/>.</param>
6565
public ComponentResult(CategoryNode<Type>? category, Type type)
66+
: this(category, type, type.GetCustomAttribute<GroupingAttribute>()?.GroupName)
67+
{ }
68+
69+
/// <summary>
70+
/// Creates a new component / node <see cref="System.Type"/> result with the given category and group.
71+
/// </summary>
72+
/// <param name="category">The category that should be shown as the <see cref="Type">Type's</see> parent.</param>
73+
/// <param name="type">The component / node <see cref="System.Type"/>.</param>
74+
/// <param name="group">The full name of the <paramref name="type"/>'s <see cref="GroupingAttribute.GroupName">group</see> <see cref="Group">identifier</see>.</param>
75+
public ComponentResult(CategoryNode<Type>? category, Type type, string? group)
6676
{
6777
Type = type;
6878
Category = category;
69-
Group = type.GetCustomAttribute<GroupingAttribute>()?.GroupName;
79+
Group = group;
7080
GroupName = Group?.Split('.').Last();
7181
}
7282

ComponentSelectorAdditions/Events/EnumerateCategoriesEvent.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public override IEnumerable<CategoryNode<Type>> Items
1616
public SelectorPath Path { get; }
1717

1818
public CategoryNode<Type> RootCategory { get; }
19+
1920
public ComponentSelector Selector { get; }
2021

2122
/// <inheritdoc/>

0 commit comments

Comments
 (0)