@@ -456,6 +456,7 @@ public void Load()
456
456
457
457
var backgroundControls = dialogConfig [ dlg_controlsBackground ] ;
458
458
var foregroundControls = dialogConfig [ dlg_controls ] ;
459
+ var failedToLoadList = new List < string > ( ) ;
459
460
if ( backgroundControls != null )
460
461
{
461
462
var controls = getControls ( backgroundControls ) ;
@@ -466,6 +467,10 @@ public void Load()
466
467
{
467
468
this . BackgroundControls . Add ( control ) ;
468
469
}
470
+ else
471
+ {
472
+ failedToLoadList . Add ( node . Name ) ;
473
+ }
469
474
}
470
475
}
471
476
if ( foregroundControls != null )
@@ -478,8 +483,20 @@ public void Load()
478
483
{
479
484
this . ForegroundControls . Add ( control ) ;
480
485
}
486
+ else
487
+ {
488
+ failedToLoadList . Add ( node . Name ) ;
489
+ }
481
490
}
482
491
}
492
+ if ( failedToLoadList . Any ( ) )
493
+ {
494
+ MessageBox . Show (
495
+ String . Format ( Properties . Language . UiEditor_FailedToLoad_Body_0names , String . Concat ( "\n - " , String . Join ( "\n - " , failedToLoadList ) ) ) ,
496
+ Properties . Language . UiEditor_FailedToLoad_Caption ,
497
+ MessageBoxButton . OK ,
498
+ MessageBoxImage . Information ) ;
499
+ }
483
500
}
484
501
this . HasChanges = false ;
485
502
}
@@ -497,75 +514,82 @@ private ControlBase LoadControl(SqfVm.ClrVirtualmachine vm, SqfVm.Config node)
497
514
{
498
515
return null ;
499
516
}
500
- var targetType = attributes . First ( ) . TargetType ;
501
- var instance = targetType . CreateInstance < ControlBase > ( ) ;
502
- instance . ClassName = node . Name ;
503
- foreach ( var propertyInfo in targetType . GetProperties ( ) . Where ( ( it ) => it . SetMethod != null ) )
517
+ try
504
518
{
505
- var armaNameAttributes = Attribute . GetCustomAttributes ( propertyInfo , typeof ( ArmaNameAttribute ) , true ) . Cast < ArmaNameAttribute > ( ) . ToArray ( ) ;
506
- if ( ! armaNameAttributes . Any ( ) )
507
- {
508
- continue ;
509
- }
510
- var armaNameAttribute = armaNameAttributes . First ( ) ;
511
- var value = node [ armaNameAttribute . Title ] ? . Value ;
512
- if ( value is null )
513
- {
514
- continue ;
515
- }
516
- if ( propertyInfo . PropertyType . IsEquivalentTo ( typeof ( System . Windows . Media . Color ) ) )
519
+ var targetType = attributes . First ( ) . TargetType ;
520
+ var instance = targetType . CreateInstance < ControlBase > ( ) ;
521
+ instance . ClassName = node . Name ;
522
+ foreach ( var propertyInfo in targetType . GetProperties ( ) . Where ( ( it ) => it . SetMethod != null ) )
517
523
{
518
- var arraylist = value as System . Collections . ArrayList ;
519
- propertyInfo . SetValue ( instance ,
520
- System . Windows . Media . Color . FromArgb (
521
- ( byte ) ( 255 * Convert . ToDouble ( arraylist . Count < 4 ? 0 : arraylist [ 3 ] , System . Globalization . CultureInfo . InvariantCulture ) ) ,
522
- ( byte ) ( 255 * Convert . ToDouble ( arraylist . Count < 1 ? 0 : arraylist [ 0 ] , System . Globalization . CultureInfo . InvariantCulture ) ) ,
523
- ( byte ) ( 255 * Convert . ToDouble ( arraylist . Count < 2 ? 0 : arraylist [ 1 ] , System . Globalization . CultureInfo . InvariantCulture ) ) ,
524
- ( byte ) ( 255 * Convert . ToDouble ( arraylist . Count < 3 ? 0 : arraylist [ 2 ] , System . Globalization . CultureInfo . InvariantCulture ) )
525
- ) ,
526
- null ) ;
527
- }
528
- else if ( propertyInfo . PropertyType . IsEnum )
529
- {
530
- propertyInfo . SetValue ( instance , Convert . ToInt32 ( value , System . Globalization . CultureInfo . InvariantCulture ) , null ) ;
531
- }
532
- else if ( value is string s )
533
- {
534
- if ( propertyInfo . PropertyType . IsEquivalentTo ( typeof ( string ) ) )
524
+ var armaNameAttributes = Attribute . GetCustomAttributes ( propertyInfo , typeof ( ArmaNameAttribute ) , true ) . Cast < ArmaNameAttribute > ( ) . ToArray ( ) ;
525
+ if ( ! armaNameAttributes . Any ( ) )
535
526
{
536
- propertyInfo . SetValue ( instance , Convert . ChangeType ( s . Trim ( '"' ) , propertyInfo . PropertyType , System . Globalization . CultureInfo . InvariantCulture ) , null ) ;
527
+ continue ;
537
528
}
538
- else
529
+ var armaNameAttribute = armaNameAttributes . First ( ) ;
530
+ var value = node [ armaNameAttribute . Title ] ? . Value ;
531
+ if ( value is null )
539
532
{
540
- var res = vm . Evaluate ( s ) ;
541
- var resval = Convert . ChangeType ( res . Data . Trim ( '"' ) , propertyInfo . PropertyType , System . Globalization . CultureInfo . InvariantCulture ) ;
542
- if ( new string [ ] { "x" , "y" , "w" , "h" } . Contains ( armaNameAttribute . Title ) )
533
+ continue ;
534
+ }
535
+ if ( propertyInfo . PropertyType . IsEquivalentTo ( typeof ( System . Windows . Media . Color ) ) )
536
+ {
537
+ var arraylist = value as System . Collections . ArrayList ;
538
+ propertyInfo . SetValue ( instance ,
539
+ System . Windows . Media . Color . FromArgb (
540
+ ( byte ) ( 255 * Convert . ToDouble ( arraylist . Count < 4 ? 0 : arraylist [ 3 ] , System . Globalization . CultureInfo . InvariantCulture ) ) ,
541
+ ( byte ) ( 255 * Convert . ToDouble ( arraylist . Count < 1 ? 0 : arraylist [ 0 ] , System . Globalization . CultureInfo . InvariantCulture ) ) ,
542
+ ( byte ) ( 255 * Convert . ToDouble ( arraylist . Count < 2 ? 0 : arraylist [ 1 ] , System . Globalization . CultureInfo . InvariantCulture ) ) ,
543
+ ( byte ) ( 255 * Convert . ToDouble ( arraylist . Count < 3 ? 0 : arraylist [ 2 ] , System . Globalization . CultureInfo . InvariantCulture ) )
544
+ ) ,
545
+ null ) ;
546
+ }
547
+ else if ( propertyInfo . PropertyType . IsEnum )
548
+ {
549
+ propertyInfo . SetValue ( instance , Convert . ToInt32 ( value , System . Globalization . CultureInfo . InvariantCulture ) , null ) ;
550
+ }
551
+ else if ( value is string s )
552
+ {
553
+ if ( propertyInfo . PropertyType . IsEquivalentTo ( typeof ( string ) ) )
543
554
{
544
- switch ( armaNameAttribute . Title )
545
- {
546
- case "x" :
547
- case "w" :
548
- propertyInfo . SetValue ( instance , this . CanvasManager . Width * ( double ) resval , null ) ;
549
- break ;
550
- case "y" :
551
- case "h" :
552
- propertyInfo . SetValue ( instance , this . CanvasManager . Height * ( double ) resval , null ) ;
553
- break ;
554
- }
555
- continue ;
555
+ propertyInfo . SetValue ( instance , Convert . ChangeType ( s . Trim ( '"' ) , propertyInfo . PropertyType , System . Globalization . CultureInfo . InvariantCulture ) , null ) ;
556
556
}
557
557
else
558
558
{
559
- propertyInfo . SetValue ( instance , resval , null ) ;
559
+ var res = vm . Evaluate ( s ) ;
560
+ var resval = Convert . ChangeType ( res . Data . Trim ( '"' ) , propertyInfo . PropertyType , System . Globalization . CultureInfo . InvariantCulture ) ;
561
+ if ( new string [ ] { "x" , "y" , "w" , "h" } . Contains ( armaNameAttribute . Title ) )
562
+ {
563
+ switch ( armaNameAttribute . Title )
564
+ {
565
+ case "x" :
566
+ case "w" :
567
+ propertyInfo . SetValue ( instance , this . CanvasManager . Width * ( double ) resval , null ) ;
568
+ break ;
569
+ case "y" :
570
+ case "h" :
571
+ propertyInfo . SetValue ( instance , this . CanvasManager . Height * ( double ) resval , null ) ;
572
+ break ;
573
+ }
574
+ continue ;
575
+ }
576
+ else
577
+ {
578
+ propertyInfo . SetValue ( instance , resval , null ) ;
579
+ }
560
580
}
561
581
}
582
+ else
583
+ {
584
+ propertyInfo . SetValue ( instance , Convert . ChangeType ( value , propertyInfo . PropertyType , System . Globalization . CultureInfo . InvariantCulture ) , null ) ;
585
+ }
562
586
}
563
- else
564
- {
565
- propertyInfo . SetValue ( instance , Convert . ChangeType ( value , propertyInfo . PropertyType , System . Globalization . CultureInfo . InvariantCulture ) , null ) ;
566
- }
587
+ return instance ;
588
+ }
589
+ catch
590
+ { // Any conversion exception is a load-fail, return null.
591
+ return null ;
567
592
}
568
- return instance ;
569
593
}
570
594
571
595
private void ClrVirtualmachine_OnLog ( object sender , SqfVm . LogEventArgs eventArgs )
0 commit comments