10
10
using System . Reflection ;
11
11
using EnumerableToolkit ;
12
12
using MonkeyLoader . Resonite ;
13
+ using MonkeyLoader . Resonite . UI . Inspectors ;
13
14
14
15
namespace ArrayEditing
15
16
{
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 >
19
18
{
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 ) ) ;
24
23
private static readonly Type _iWorldElementType = typeof ( IWorldElement ) ;
25
24
private static readonly Type _particleBurstType = typeof ( ParticleBurst ) ;
26
25
27
26
public override bool CanBeDisabled => true ;
28
27
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
+ }
30
62
31
63
private static void AddLinearValueProxying < T > ( SyncArray < LinearKey < T > > array , SyncElementList < ValueGradientDriver < T > . Point > list )
32
64
where T : IEquatable < T >
@@ -144,30 +176,6 @@ private static void AddTubePointProxying(SyncArray<TubePoint> array, SyncElement
144
176
list . ElementsRemoved += ( list , startIndex , count ) => array . Remove ( startIndex , count ) ;
145
177
}
146
178
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
-
171
179
private static void AddUpdateProxies < T > ( SyncArray < LinearKey < T > > array ,
172
180
SyncElementList < ValueGradientDriver < T > . Point > list , IEnumerable < ValueGradientDriver < T > . Point > elements )
173
181
where T : IEquatable < T >
@@ -249,23 +257,10 @@ private static void AddUpdateProxies<T>(SyncArray<CurveKey<T>> array,
249
257
}
250
258
}
251
259
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 )
253
261
{
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
-
267
262
if ( ! TryGetGenericParameters ( typeof ( SyncArray < > ) , array . GetType ( ) , out var genericParameters ) )
268
- return true ;
263
+ return false ;
269
264
270
265
var isSyncLinear = TryGetGenericParameters ( typeof ( SyncLinear < > ) , array . GetType ( ) , out var syncLinearGenericParameters ) ;
271
266
@@ -295,7 +290,7 @@ private static bool Prefix(ISyncArray array, string name, FieldInfo fieldInfo, U
295
290
if ( isSyncLinear && SupportsLerp ( syncLinearType ! ) )
296
291
{
297
292
var gradientType = typeof ( ValueGradientDriver < > ) . MakeGenericType ( syncLinearType ) ;
298
- var gradient = GetOrAttachComponent ( proxySlot , gradientType , out bool attachedNew ) ;
293
+ var gradient = GetOrAttachComponent ( proxySlot , gradientType , out var attachedNew ) ;
299
294
300
295
list = ( ISyncList ) gradient . GetSyncMember ( nameof ( ValueGradientDriver < float > . Points ) ) ;
301
296
listField = gradient . GetSyncMemberFieldInfo ( nameof ( ValueGradientDriver < float > . Points ) ) ;
@@ -305,27 +300,27 @@ private static bool Prefix(ISyncArray array, string name, FieldInfo fieldInfo, U
305
300
if ( isParticleBurst )
306
301
AddParticleBurstListProxying ( ( SyncArray < LinearKey < ParticleBurst > > ) array , ( SyncElementList < ValueGradientDriver < int2 > . Point > ) list ) ;
307
302
else
308
- _addLinearValueProxying . MakeGenericMethod ( syncLinearType ) . Invoke ( null , new object [ ] { array , list } ) ;
303
+ _addLinearValueProxying . MakeGenericMethod ( syncLinearType ) . Invoke ( null , [ array , list ] ) ;
309
304
}
310
305
}
311
306
else if ( isSyncCurve && SupportsLerp ( syncCurveType ! ) )
312
307
{
313
308
var gradientType = typeof ( ValueGradientDriver < > ) . MakeGenericType ( syncCurveType ) ;
314
- var gradient = GetOrAttachComponent ( proxySlot , gradientType , out bool attachedNew ) ;
309
+ var gradient = GetOrAttachComponent ( proxySlot , gradientType , out var attachedNew ) ;
315
310
316
311
list = ( ISyncList ) gradient . GetSyncMember ( nameof ( ValueGradientDriver < float > . Points ) ) ;
317
312
listField = gradient . GetSyncMemberFieldInfo ( nameof ( ValueGradientDriver < float > . Points ) ) ;
318
313
319
314
if ( attachedNew )
320
315
{
321
- _addCurveValueProxying . MakeGenericMethod ( syncCurveType ) . Invoke ( null , new object [ ] { array , list } ) ;
316
+ _addCurveValueProxying . MakeGenericMethod ( syncCurveType ) . Invoke ( null , [ array , list ] ) ;
322
317
}
323
318
}
324
319
else
325
320
{
326
321
if ( arrayType == typeof ( TubePoint ) )
327
322
{
328
- var gradient = GetOrAttachComponent ( proxySlot , typeof ( ValueGradientDriver < float3 > ) , out bool attachedNew ) ;
323
+ var gradient = GetOrAttachComponent ( proxySlot , typeof ( ValueGradientDriver < float3 > ) , out var attachedNew ) ;
329
324
330
325
list = ( ISyncList ) gradient . GetSyncMember ( nameof ( ValueGradientDriver < float3 > . Points ) ) ;
331
326
listField = gradient . GetSyncMemberFieldInfo ( nameof ( ValueGradientDriver < float3 > . Points ) ) ;
@@ -338,27 +333,27 @@ private static bool Prefix(ISyncArray array, string name, FieldInfo fieldInfo, U
338
333
else if ( Coder . IsEnginePrimitive ( arrayType ) )
339
334
{
340
335
var multiplexerType = typeof ( ValueMultiplexer < > ) . MakeGenericType ( arrayType ) ;
341
- var multiplexer = GetOrAttachComponent ( proxySlot , multiplexerType , out bool attachedNew ) ;
336
+ var multiplexer = GetOrAttachComponent ( proxySlot , multiplexerType , out var attachedNew ) ;
342
337
list = ( ISyncList ) multiplexer . GetSyncMember ( nameof ( ValueMultiplexer < float > . Values ) ) ;
343
338
listField = multiplexer . GetSyncMemberFieldInfo ( nameof ( ValueMultiplexer < float > . Values ) ) ;
344
339
345
340
if ( attachedNew )
346
- _addListValueProxying . MakeGenericMethod ( arrayType ) . Invoke ( null , new object [ ] { array , list } ) ;
341
+ _addListValueProxying . MakeGenericMethod ( arrayType ) . Invoke ( null , [ array , list ] ) ;
347
342
}
348
343
else if ( _iWorldElementType . IsAssignableFrom ( arrayType ) )
349
344
{
350
345
var multiplexerType = typeof ( ReferenceMultiplexer < > ) . MakeGenericType ( arrayType ) ;
351
- var multiplexer = GetOrAttachComponent ( proxySlot , multiplexerType , out bool attachedNew ) ;
346
+ var multiplexer = GetOrAttachComponent ( proxySlot , multiplexerType , out var attachedNew ) ;
352
347
list = ( ISyncList ) multiplexer . GetSyncMember ( nameof ( ReferenceMultiplexer < Slot > . References ) ) ;
353
348
listField = multiplexer . GetSyncMemberFieldInfo ( nameof ( ReferenceMultiplexer < Slot > . References ) ) ;
354
349
355
350
if ( attachedNew )
356
- _addListReferenceProxying . MakeGenericMethod ( arrayType ) . Invoke ( null , new object [ ] { array , list } ) ;
351
+ _addListReferenceProxying . MakeGenericMethod ( arrayType ) . Invoke ( null , [ array , list ] ) ;
357
352
}
358
353
else
359
354
{
360
355
proxySlot . Destroy ( ) ;
361
- return true ;
356
+ return false ;
362
357
}
363
358
}
364
359
@@ -392,7 +387,20 @@ void ArrayChanged(IChangeable changeable)
392
387
ui . Text ( in text ) ;
393
388
}
394
389
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 ;
396
404
}
397
405
398
406
private static bool SupportsLerp ( Type type )
@@ -417,44 +425,4 @@ private static bool TryGetGenericParameters(Type baseType, Type concreteType, [N
417
425
return TryGetGenericParameters ( baseType , concreteType . BaseType , out genericParameters ) ;
418
426
}
419
427
}
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
- }
460
428
}
0 commit comments