diff --git a/OpenRA.Mods.Common/UpdateRules/UpdateRule.cs b/OpenRA.Mods.Common/UpdateRules/UpdateRule.cs
index 9b77bda5fe..d84a9017ff 100644
--- a/OpenRA.Mods.Common/UpdateRules/UpdateRule.cs
+++ b/OpenRA.Mods.Common/UpdateRules/UpdateRule.cs
@@ -24,8 +24,13 @@ namespace OpenRA.Mods.Common.UpdateRules
/// An enumerable of manual steps to be run by the user
public delegate IEnumerable TopLevelNodeTransform(ModData modData, MiniYamlNode node);
+ /// Defines a transformation that is run on each widget node in a chrome yaml file set.
+ /// An enumerable of manual steps to be run by the user
+ public delegate IEnumerable ChromeNodeTransform(ModData modData, MiniYamlNode widgetNode);
+
public virtual IEnumerable UpdateActorNode(ModData modData, MiniYamlNode actorNode) { yield break; }
public virtual IEnumerable UpdateWeaponNode(ModData modData, MiniYamlNode weaponNode) { yield break; }
+ public virtual IEnumerable UpdateChromeNode(ModData modData, MiniYamlNode chromeNode) { yield break; }
public virtual IEnumerable UpdateTilesetNode(ModData modData, MiniYamlNode tilesetNode) { yield break; }
public virtual IEnumerable BeforeUpdate(ModData modData) { yield break; }
diff --git a/OpenRA.Mods.Common/UpdateRules/UpdateUtils.cs b/OpenRA.Mods.Common/UpdateRules/UpdateUtils.cs
index 3bdfa160d2..74ebf7c1f1 100644
--- a/OpenRA.Mods.Common/UpdateRules/UpdateUtils.cs
+++ b/OpenRA.Mods.Common/UpdateRules/UpdateUtils.cs
@@ -109,6 +109,7 @@ namespace OpenRA.Mods.Common.UpdateRules
manualSteps.AddRange(ApplyTopLevelTransform(modData, modRules, rule.UpdateActorNode));
manualSteps.AddRange(ApplyTopLevelTransform(modData, modWeapons, rule.UpdateWeaponNode));
manualSteps.AddRange(ApplyTopLevelTransform(modData, modTilesets, rule.UpdateTilesetNode));
+ manualSteps.AddRange(ApplyChromeTransform(modData, modChromeLayout, rule.UpdateChromeNode));
manualSteps.AddRange(rule.AfterUpdate(modData));
files = modRules.ToList();
@@ -119,6 +120,29 @@ namespace OpenRA.Mods.Common.UpdateRules
return manualSteps;
}
+ static IEnumerable ApplyChromeTransformInner(ModData modData, MiniYamlNode current, UpdateRule.ChromeNodeTransform transform)
+ {
+ foreach (var manualStep in transform(modData, current))
+ yield return manualStep;
+
+ var childrenNode = current.Value.Nodes.FirstOrDefault(n => n.Key == "Children");
+ if (childrenNode != null)
+ foreach (var node in childrenNode.Value.Nodes)
+ foreach (var manualStep in ApplyChromeTransformInner(modData, node, transform))
+ yield return manualStep;
+ }
+
+ static IEnumerable ApplyChromeTransform(ModData modData, YamlFileSet files, UpdateRule.ChromeNodeTransform transform)
+ {
+ if (transform == null)
+ yield break;
+
+ foreach (var file in files)
+ foreach (var node in file.Item3)
+ foreach (var manualStep in ApplyChromeTransformInner(modData, node, transform))
+ yield return manualStep;
+ }
+
static IEnumerable ApplyTopLevelTransform(ModData modData, YamlFileSet files, UpdateRule.TopLevelNodeTransform transform)
{
if (transform == null)