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+ }
0 commit comments