diff --git a/OpenRA.Mods.RA/Widgets/Logic/MissionObjectivesLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/MissionObjectivesLogic.cs index e011256c46..241c2de30f 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/MissionObjectivesLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/MissionObjectivesLogic.cs @@ -8,6 +8,7 @@ */ #endregion +using System; using System.Linq; using OpenRA.Mods.RA.Missions; using OpenRA.Network; @@ -56,31 +57,47 @@ namespace OpenRA.Mods.RA.Widgets.Logic public void UpdateObjectives(bool notify) { if (notify) - { objectivesButton.Highlighted = true; - } + primaryPanel.RemoveChildren(); secondaryPanel.RemoveChildren(); + foreach (var o in objectives.Objectives.Where(o => o.Status != ObjectiveStatus.Inactive)) { var objective = o; - if (objective.Type == ObjectiveType.Secondary) + + Widget widget; + LabelWidget objectiveText; + LabelWidget objectiveStatus; + + if (objective.Type == ObjectiveType.Primary) { - var template = secondaryTemplate.Clone(); - template.Get("SECONDARY_OBJECTIVE").GetText = () => objective.Text; - template.Get("SECONDARY_STATUS").GetText = () => GetObjectiveStatusText(objective.Status); - secondaryPanel.AddChild(template); + widget = primaryTemplate.Clone(); + objectiveText = widget.Get("PRIMARY_OBJECTIVE"); + objectiveStatus = widget.Get("PRIMARY_STATUS"); + SetupWidget(widget, objectiveText, objectiveStatus, objective); + primaryPanel.AddChild(widget); } else { - var template = primaryTemplate.Clone(); - template.Get("PRIMARY_OBJECTIVE").GetText = () => objective.Text; - template.Get("PRIMARY_STATUS").GetText = () => GetObjectiveStatusText(objective.Status); - primaryPanel.AddChild(template); + widget = secondaryTemplate.Clone(); + objectiveText = widget.Get("SECONDARY_OBJECTIVE"); + objectiveStatus = widget.Get("SECONDARY_STATUS"); + SetupWidget(widget, objectiveText, objectiveStatus, objective); + secondaryPanel.AddChild(widget); } } } + void SetupWidget(Widget widget, LabelWidget objectiveText, LabelWidget objectiveStatus, Objective objective) + { + var font = Game.Renderer.Fonts[objectiveText.Font]; + var text = WidgetUtils.WrapText(objective.Text, objectiveText.Bounds.Width, font); + widget.Bounds.Height = objectiveText.Bounds.Height = objectiveStatus.Bounds.Height = font.Measure(text).Y; + objectiveText.GetText = () => text; + objectiveStatus.GetText = () => GetObjectiveStatusText(objective.Status); + } + static string GetObjectiveStatusText(ObjectiveStatus status) { switch (status) diff --git a/mods/ra/chrome/ingame-objectives.yaml b/mods/ra/chrome/ingame-objectives.yaml index a4628eaa2d..2eef5f4980 100644 --- a/mods/ra/chrome/ingame-objectives.yaml +++ b/mods/ra/chrome/ingame-objectives.yaml @@ -34,13 +34,12 @@ Background@MISSION_OBJECTIVES: Y:70 Width:PARENT_RIGHT-50 Height:200 - ItemSpacing:5 + ItemSpacing:20 Children: Container@PRIMARY_OBJECTIVE_TEMPLATE: X:15 - Y:0-15 + Y:0 Width:PARENT_RIGHT - Height:60 Children: Label@PRIMARY_OBJECTIVE: X:0 @@ -75,13 +74,12 @@ Background@MISSION_OBJECTIVES: Y:305 Width:PARENT_RIGHT-50 Height:200 - ItemSpacing:5 + ItemSpacing:20 Children: Container@SECONDARY_OBJECTIVE_TEMPLATE: X:15 - Y:0-15 + Y:0 Width:PARENT_RIGHT - Height:60 Children: Label@SECONDARY_OBJECTIVE: X:0