1010using System . Reflection ;
1111using EnumerableToolkit ;
1212using MonkeyLoader . Resonite ;
13+ using MonkeyLoader . Resonite . UI . Inspectors ;
1314
1415namespace ArrayEditing
1516{
16- [ HarmonyPatchCategory ( nameof ( SyncArrayEditor ) ) ]
17- [ HarmonyPatch ( typeof ( SyncMemberEditorBuilder ) , nameof ( SyncMemberEditorBuilder . BuildArray ) ) ]
18- internal sealed class SyncArrayEditor : ResoniteMonkey < SyncArrayEditor >
17+ internal sealed class ArrayEditor : ResoniteCancelableEventHandlerMonkey < ArrayEditor , BuildArrayEditorEvent >
1918 {
20- private static readonly MethodInfo _addLinearValueProxying = AccessTools . Method ( typeof ( SyncArrayEditor ) , nameof ( AddLinearValueProxying ) ) ;
21- private static readonly MethodInfo _addListReferenceProxying = AccessTools . Method ( typeof ( SyncArrayEditor ) , nameof ( AddListReferenceProxying ) ) ;
22- private static readonly MethodInfo _addListValueProxying = AccessTools . Method ( typeof ( SyncArrayEditor ) , nameof ( AddListValueProxying ) ) ;
23- private static readonly MethodInfo _addCurveValueProxying = AccessTools . Method ( typeof ( SyncArrayEditor ) , nameof ( AddCurveValueProxying ) ) ;
19+ private static readonly MethodInfo _addCurveValueProxying = AccessTools . Method ( typeof ( ArrayEditor ) , nameof ( AddCurveValueProxying ) ) ;
20+ private static readonly MethodInfo _addLinearValueProxying = AccessTools . Method ( typeof ( ArrayEditor ) , nameof ( AddLinearValueProxying ) ) ;
21+ private static readonly MethodInfo _addListReferenceProxying = AccessTools . Method ( typeof ( ArrayEditor ) , nameof ( AddListReferenceProxying ) ) ;
22+ private static readonly MethodInfo _addListValueProxying = AccessTools . Method ( typeof ( ArrayEditor ) , nameof ( AddListValueProxying ) ) ;
2423 private static readonly Type _iWorldElementType = typeof ( IWorldElement ) ;
2524 private static readonly Type _particleBurstType = typeof ( ParticleBurst ) ;
2625
2726 public override bool CanBeDisabled => true ;
2827
29- protected override IEnumerable < IFeaturePatch > GetFeaturePatches ( ) => Enumerable . Empty < IFeaturePatch > ( ) ;
28+ public override int Priority => HarmonyLib . Priority . High ;
29+
30+ public override bool SkipCanceled => true ;
31+
32+ protected override bool AppliesTo ( BuildArrayEditorEvent eventData ) => Enabled ;
33+
34+ protected override IEnumerable < IFeaturePatch > GetFeaturePatches ( ) => [ ] ;
35+
36+ protected override void Handle ( BuildArrayEditorEvent eventData )
37+ => eventData . Canceled = BuildArray ( eventData . Member , eventData . Name , eventData . FieldInfo , eventData . UI , eventData . LabelSize ! . Value ) ;
38+
39+ private static void AddCurveValueProxying < T > ( SyncArray < CurveKey < T > > array , SyncElementList < ValueGradientDriver < T > . Point > list )
40+ where T : IEquatable < T >
41+ {
42+ foreach ( var key in array )
43+ {
44+ var point = list . Add ( ) ;
45+ point . Position . Value = key . time ;
46+ point . Value . Value = key . value ;
47+ }
48+
49+ AddUpdateProxies ( array , list , list . Elements ) ;
50+
51+ list . ElementsAdded += ( list , startIndex , count ) =>
52+ {
53+ var addedElements = list . Elements . Skip ( startIndex ) . Take ( count ) . ToArray ( ) ;
54+ var buffer = addedElements . Select ( point => new CurveKey < T > ( point . Position , point . Value ) ) . ToArray ( ) ;
55+
56+ array . Insert ( buffer , startIndex ) ;
57+ AddUpdateProxies ( array , list , addedElements ) ;
58+ } ;
59+
60+ list . ElementsRemoved += ( list , startIndex , count ) => array . Remove ( startIndex , count ) ;
61+ }
3062
3163 private static void AddLinearValueProxying < T > ( SyncArray < LinearKey < T > > array , SyncElementList < ValueGradientDriver < T > . Point > list )
3264 where T : IEquatable < T >
@@ -144,30 +176,6 @@ private static void AddTubePointProxying(SyncArray<TubePoint> array, SyncElement
144176 list . ElementsRemoved += ( list , startIndex , count ) => array . Remove ( startIndex , count ) ;
145177 }
146178
147- private static void AddCurveValueProxying < T > ( SyncArray < CurveKey < T > > array , SyncElementList < ValueGradientDriver < T > . Point > list )
148- where T : IEquatable < T >
149- {
150- foreach ( var key in array )
151- {
152- var point = list . Add ( ) ;
153- point . Position . Value = key . time ;
154- point . Value . Value = key . value ;
155- }
156-
157- AddUpdateProxies ( array , list , list . Elements ) ;
158-
159- list . ElementsAdded += ( list , startIndex , count ) =>
160- {
161- var addedElements = list . Elements . Skip ( startIndex ) . Take ( count ) . ToArray ( ) ;
162- var buffer = addedElements . Select ( point => new CurveKey < T > ( point . Position , point . Value ) ) . ToArray ( ) ;
163-
164- array . Insert ( buffer , startIndex ) ;
165- AddUpdateProxies ( array , list , addedElements ) ;
166- } ;
167-
168- list . ElementsRemoved += ( list , startIndex , count ) => array . Remove ( startIndex , count ) ;
169- }
170-
171179 private static void AddUpdateProxies < T > ( SyncArray < LinearKey < T > > array ,
172180 SyncElementList < ValueGradientDriver < T > . Point > list , IEnumerable < ValueGradientDriver < T > . Point > elements )
173181 where T : IEquatable < T >
@@ -249,23 +257,10 @@ private static void AddUpdateProxies<T>(SyncArray<CurveKey<T>> array,
249257 }
250258 }
251259
252- private static Component GetOrAttachComponent ( Slot targetSlot , Type type , out bool attachedNew )
260+ private static bool BuildArray ( ISyncArray array , string name , FieldInfo fieldInfo , UIBuilder ui , float labelSize )
253261 {
254- attachedNew = false ;
255- if ( targetSlot . GetComponent ( type ) is not Component comp )
256- {
257- comp = targetSlot . AttachComponent ( type ) ;
258- attachedNew = true ;
259- }
260- return comp ;
261- }
262-
263- private static bool Prefix ( ISyncArray array , string name , FieldInfo fieldInfo , UIBuilder ui , float labelSize )
264- {
265- if ( ! Enabled ) return true ;
266-
267262 if ( ! TryGetGenericParameters ( typeof ( SyncArray < > ) , array . GetType ( ) , out var genericParameters ) )
268- return true ;
263+ return false ;
269264
270265 var isSyncLinear = TryGetGenericParameters ( typeof ( SyncLinear < > ) , array . GetType ( ) , out var syncLinearGenericParameters ) ;
271266
@@ -295,7 +290,7 @@ private static bool Prefix(ISyncArray array, string name, FieldInfo fieldInfo, U
295290 if ( isSyncLinear && SupportsLerp ( syncLinearType ! ) )
296291 {
297292 var gradientType = typeof ( ValueGradientDriver < > ) . MakeGenericType ( syncLinearType ) ;
298- var gradient = GetOrAttachComponent ( proxySlot , gradientType , out bool attachedNew ) ;
293+ var gradient = GetOrAttachComponent ( proxySlot , gradientType , out var attachedNew ) ;
299294
300295 list = ( ISyncList ) gradient . GetSyncMember ( nameof ( ValueGradientDriver < float > . Points ) ) ;
301296 listField = gradient . GetSyncMemberFieldInfo ( nameof ( ValueGradientDriver < float > . Points ) ) ;
@@ -305,27 +300,27 @@ private static bool Prefix(ISyncArray array, string name, FieldInfo fieldInfo, U
305300 if ( isParticleBurst )
306301 AddParticleBurstListProxying ( ( SyncArray < LinearKey < ParticleBurst > > ) array , ( SyncElementList < ValueGradientDriver < int2 > . Point > ) list ) ;
307302 else
308- _addLinearValueProxying . MakeGenericMethod ( syncLinearType ) . Invoke ( null , new object [ ] { array , list } ) ;
303+ _addLinearValueProxying . MakeGenericMethod ( syncLinearType ) . Invoke ( null , [ array , list ] ) ;
309304 }
310305 }
311306 else if ( isSyncCurve && SupportsLerp ( syncCurveType ! ) )
312307 {
313308 var gradientType = typeof ( ValueGradientDriver < > ) . MakeGenericType ( syncCurveType ) ;
314- var gradient = GetOrAttachComponent ( proxySlot , gradientType , out bool attachedNew ) ;
309+ var gradient = GetOrAttachComponent ( proxySlot , gradientType , out var attachedNew ) ;
315310
316311 list = ( ISyncList ) gradient . GetSyncMember ( nameof ( ValueGradientDriver < float > . Points ) ) ;
317312 listField = gradient . GetSyncMemberFieldInfo ( nameof ( ValueGradientDriver < float > . Points ) ) ;
318313
319314 if ( attachedNew )
320315 {
321- _addCurveValueProxying . MakeGenericMethod ( syncCurveType ) . Invoke ( null , new object [ ] { array , list } ) ;
316+ _addCurveValueProxying . MakeGenericMethod ( syncCurveType ) . Invoke ( null , [ array , list ] ) ;
322317 }
323318 }
324319 else
325320 {
326321 if ( arrayType == typeof ( TubePoint ) )
327322 {
328- var gradient = GetOrAttachComponent ( proxySlot , typeof ( ValueGradientDriver < float3 > ) , out bool attachedNew ) ;
323+ var gradient = GetOrAttachComponent ( proxySlot , typeof ( ValueGradientDriver < float3 > ) , out var attachedNew ) ;
329324
330325 list = ( ISyncList ) gradient . GetSyncMember ( nameof ( ValueGradientDriver < float3 > . Points ) ) ;
331326 listField = gradient . GetSyncMemberFieldInfo ( nameof ( ValueGradientDriver < float3 > . Points ) ) ;
@@ -338,27 +333,27 @@ private static bool Prefix(ISyncArray array, string name, FieldInfo fieldInfo, U
338333 else if ( Coder . IsEnginePrimitive ( arrayType ) )
339334 {
340335 var multiplexerType = typeof ( ValueMultiplexer < > ) . MakeGenericType ( arrayType ) ;
341- var multiplexer = GetOrAttachComponent ( proxySlot , multiplexerType , out bool attachedNew ) ;
336+ var multiplexer = GetOrAttachComponent ( proxySlot , multiplexerType , out var attachedNew ) ;
342337 list = ( ISyncList ) multiplexer . GetSyncMember ( nameof ( ValueMultiplexer < float > . Values ) ) ;
343338 listField = multiplexer . GetSyncMemberFieldInfo ( nameof ( ValueMultiplexer < float > . Values ) ) ;
344339
345340 if ( attachedNew )
346- _addListValueProxying . MakeGenericMethod ( arrayType ) . Invoke ( null , new object [ ] { array , list } ) ;
341+ _addListValueProxying . MakeGenericMethod ( arrayType ) . Invoke ( null , [ array , list ] ) ;
347342 }
348343 else if ( _iWorldElementType . IsAssignableFrom ( arrayType ) )
349344 {
350345 var multiplexerType = typeof ( ReferenceMultiplexer < > ) . MakeGenericType ( arrayType ) ;
351- var multiplexer = GetOrAttachComponent ( proxySlot , multiplexerType , out bool attachedNew ) ;
346+ var multiplexer = GetOrAttachComponent ( proxySlot , multiplexerType , out var attachedNew ) ;
352347 list = ( ISyncList ) multiplexer . GetSyncMember ( nameof ( ReferenceMultiplexer < Slot > . References ) ) ;
353348 listField = multiplexer . GetSyncMemberFieldInfo ( nameof ( ReferenceMultiplexer < Slot > . References ) ) ;
354349
355350 if ( attachedNew )
356- _addListReferenceProxying . MakeGenericMethod ( arrayType ) . Invoke ( null , new object [ ] { array , list } ) ;
351+ _addListReferenceProxying . MakeGenericMethod ( arrayType ) . Invoke ( null , [ array , list ] ) ;
357352 }
358353 else
359354 {
360355 proxySlot . Destroy ( ) ;
361- return true ;
356+ return false ;
362357 }
363358 }
364359
@@ -392,7 +387,20 @@ void ArrayChanged(IChangeable changeable)
392387 ui . Text ( in text ) ;
393388 }
394389
395- return false ;
390+ return true ;
391+ }
392+
393+ private static Component GetOrAttachComponent ( Slot targetSlot , Type type , out bool attachedNew )
394+ {
395+ attachedNew = false ;
396+
397+ if ( targetSlot . GetComponent ( type ) is not Component comp )
398+ {
399+ comp = targetSlot . AttachComponent ( type ) ;
400+ attachedNew = true ;
401+ }
402+
403+ return comp ;
396404 }
397405
398406 private static bool SupportsLerp ( Type type )
@@ -417,44 +425,4 @@ private static bool TryGetGenericParameters(Type baseType, Type concreteType, [N
417425 return TryGetGenericParameters ( baseType , concreteType . BaseType , out genericParameters ) ;
418426 }
419427 }
420-
421- internal sealed class ListUI_Improvements : ResoniteMonkey < ListUI_Improvements >
422- {
423- public override bool CanBeDisabled => true ;
424-
425- protected override IEnumerable < IFeaturePatch > GetFeaturePatches ( ) => Enumerable . Empty < IFeaturePatch > ( ) ;
426-
427- [ HarmonyPatchCategory ( nameof ( ListUI_Improvements ) ) ]
428- [ HarmonyPatch ( typeof ( SyncMemberEditorBuilder ) , "GenerateMemberField" ) ]
429- class SyncMemberEditorBuilder_GenerateMemberField_Patch
430- {
431- private static bool Prefix ( ISyncMember member , string name , UIBuilder ui , float labelSize )
432- {
433- if ( Enabled && member . Parent is ISyncList && member is SyncObject )
434- {
435- ui . CurrentRect . Slot . AttachComponent < HorizontalLayout > ( ) ;
436- if ( ui . CurrentRect . Slot . GetComponent < LayoutElement > ( ) is LayoutElement layoutElement )
437- {
438- layoutElement . MinWidth . Value = 48f ;
439- layoutElement . FlexibleWidth . Value = - 1f ;
440- }
441- }
442- return true ;
443- }
444- }
445-
446- [ HarmonyPatchCategory ( nameof ( ListUI_Improvements ) ) ]
447- [ HarmonyPatch ( typeof ( ListEditor ) , "BuildListElement" ) ]
448- class ListEditor_BuildListElement_Patch
449- {
450- private static bool Prefix ( ISyncList list , ISyncMember member , string name , UIBuilder ui )
451- {
452- if ( Enabled )
453- {
454- ui . Style . MinHeight = 24f ;
455- }
456- return true ;
457- }
458- }
459- }
460428}
0 commit comments