Skip to content

Commit ee6a4b9

Browse files
committed
Added a list of controls that failed to load
1 parent a1b498d commit ee6a4b9

File tree

3 files changed

+104
-56
lines changed

3 files changed

+104
-56
lines changed

Arma.Studio.UiEditor/Properties/Language.Designer.cs

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Arma.Studio.UiEditor/Properties/Language.resx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,4 +306,10 @@
306306
<data name="UiEditor_HighlightAll" xml:space="preserve">
307307
<value>Highlight all</value>
308308
</data>
309+
<data name="UiEditor_FailedToLoad_Body_0names" xml:space="preserve">
310+
<value>Failed to load the following classes: {0}</value>
311+
</data>
312+
<data name="UiEditor_FailedToLoad_Caption" xml:space="preserve">
313+
<value>Failed to load all classes</value>
314+
</data>
309315
</root>

Arma.Studio.UiEditor/UI/UiEditorDataContext.cs

Lines changed: 80 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,7 @@ public void Load()
456456

457457
var backgroundControls = dialogConfig[dlg_controlsBackground];
458458
var foregroundControls = dialogConfig[dlg_controls];
459+
var failedToLoadList = new List<string>();
459460
if (backgroundControls != null)
460461
{
461462
var controls = getControls(backgroundControls);
@@ -466,6 +467,10 @@ public void Load()
466467
{
467468
this.BackgroundControls.Add(control);
468469
}
470+
else
471+
{
472+
failedToLoadList.Add(node.Name);
473+
}
469474
}
470475
}
471476
if (foregroundControls != null)
@@ -478,8 +483,20 @@ public void Load()
478483
{
479484
this.ForegroundControls.Add(control);
480485
}
486+
else
487+
{
488+
failedToLoadList.Add(node.Name);
489+
}
481490
}
482491
}
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+
}
483500
}
484501
this.HasChanges = false;
485502
}
@@ -497,75 +514,82 @@ private ControlBase LoadControl(SqfVm.ClrVirtualmachine vm, SqfVm.Config node)
497514
{
498515
return null;
499516
}
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
504518
{
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))
517523
{
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())
535526
{
536-
propertyInfo.SetValue(instance, Convert.ChangeType(s.Trim('"'), propertyInfo.PropertyType, System.Globalization.CultureInfo.InvariantCulture), null);
527+
continue;
537528
}
538-
else
529+
var armaNameAttribute = armaNameAttributes.First();
530+
var value = node[armaNameAttribute.Title]?.Value;
531+
if (value is null)
539532
{
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)))
543554
{
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);
556556
}
557557
else
558558
{
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+
}
560580
}
561581
}
582+
else
583+
{
584+
propertyInfo.SetValue(instance, Convert.ChangeType(value, propertyInfo.PropertyType, System.Globalization.CultureInfo.InvariantCulture), null);
585+
}
562586
}
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;
567592
}
568-
return instance;
569593
}
570594

571595
private void ClrVirtualmachine_OnLog(object sender, SqfVm.LogEventArgs eventArgs)

0 commit comments

Comments
 (0)