Refactor MapPreviewLogic

and add a states for updating map via MapCache.GetUpdatedMap
This commit is contained in:
Gustas
2022-09-19 22:21:58 +03:00
committed by Matthias Mailänder
parent 2c4a135c2b
commit a9cf728ee1
5 changed files with 407 additions and 409 deletions

View File

@@ -190,6 +190,15 @@ namespace OpenRA.Mods.Common.Widgets.Logic
{ "getSpawnOccupants", (Func<Dictionary<int, SpawnOccupant>>)(() => spawnOccupants) }, { "getSpawnOccupants", (Func<Dictionary<int, SpawnOccupant>>)(() => spawnOccupants) },
{ "getDisabledSpawnPoints", (Func<HashSet<int>>)(() => orderManager.LobbyInfo.DisabledSpawnPoints) }, { "getDisabledSpawnPoints", (Func<HashSet<int>>)(() => orderManager.LobbyInfo.DisabledSpawnPoints) },
{ "showUnoccupiedSpawnpoints", true }, { "showUnoccupiedSpawnpoints", true },
{ "mapUpdatesEnabled", true },
{
"onMapUpdate", (Action<string>)(uid =>
{
orderManager.IssueOrder(Order.Command("map " + uid));
Game.Settings.Server.Map = uid;
Game.Settings.Save();
})
},
}); });
mapContainer.IsVisible = () => panel != PanelType.Servers; mapContainer.IsVisible = () => panel != PanelType.Servers;
@@ -242,7 +251,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
{ {
{ "initialMap", modData.MapCache.PickLastModifiedMap(MapVisibility.Lobby) ?? map.Uid }, { "initialMap", modData.MapCache.PickLastModifiedMap(MapVisibility.Lobby) ?? map.Uid },
{ "initialTab", MapClassification.System }, { "initialTab", MapClassification.System },
{ "onExit", Game.IsHost ? UpdateSelectedMap : modData.MapCache.UpdateMaps }, { "onExit", modData.MapCache.UpdateMaps },
{ "onSelect", Game.IsHost ? onSelect : null }, { "onSelect", Game.IsHost ? onSelect : null },
{ "filter", MapVisibility.Lobby }, { "filter", MapVisibility.Lobby },
}); });
@@ -419,7 +428,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
orderManager.IssueOrder(Order.Command("startgame")); orderManager.IssueOrder(Order.Command("startgame"));
} }
else else
UpdateSelectedMap(); modData.MapCache.UpdateMaps();
} }
var startGameButton = lobby.GetOrNull<ButtonWidget>("START_GAME_BUTTON"); var startGameButton = lobby.GetOrNull<ButtonWidget>("START_GAME_BUTTON");
@@ -904,20 +913,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic
onStart(); onStart();
} }
void UpdateSelectedMap()
{
if (modData.MapCache[map.Uid].Status == MapStatus.Available)
return;
var uid = modData.MapCache.GetUpdatedMap(map.Uid);
if (uid != null)
{
orderManager.IssueOrder(Order.Command("map " + uid));
Game.Settings.Server.Map = uid;
Game.Settings.Save();
}
}
} }
public class LobbyFaction public class LobbyFaction

View File

@@ -38,64 +38,80 @@ namespace OpenRA.Mods.Common.Widgets.Logic
const string CreatedBy = "label-created-by"; const string CreatedBy = "label-created-by";
readonly int blinkTickLength = 10; readonly int blinkTickLength = 10;
bool installHighlighted; readonly Dictionary<PreviewStatus, Widget[]> previewWidgets = new();
readonly Func<(MapPreview Map, Session.MapStatus Status)> getMap;
enum PreviewStatus { Unknown, Playable, Incompatible, Validating, DownloadAvailable, Searching, Downloading, DownloadError, Unavailable, UpdateAvailable, UpdateDownloadAvailable }
PreviewStatus currentStatus;
bool blink;
int blinkTick; int blinkTick;
readonly ButtonWidget retryButton;
bool mapUpdateAvailable = false;
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
internal MapPreviewLogic(Widget widget, ModData modData, OrderManager orderManager, Func<(MapPreview Map, Session.MapStatus Status)> getMap, internal MapPreviewLogic(Widget widget, ModData modData, OrderManager orderManager, Func<(MapPreview Map, Session.MapStatus Status)> getMap,
Action<MapPreviewWidget, MapPreview, MouseInput> onMouseDown, Func<Dictionary<int, SpawnOccupant>> getSpawnOccupants, Action<MapPreviewWidget, MapPreview, MouseInput> onMouseDown, Func<Dictionary<int, SpawnOccupant>> getSpawnOccupants,
Func<HashSet<int>> getDisabledSpawnPoints, bool showUnoccupiedSpawnpoints) bool mapUpdatesEnabled, Action<string> onMapUpdate, Func<HashSet<int>> getDisabledSpawnPoints, bool showUnoccupiedSpawnpoints)
{ {
this.getMap = getMap;
Widget SetupMapPreview(Widget parent)
{
var preview = parent.Get<MapPreviewWidget>("MAP_PREVIEW");
preview.Preview = () => getMap().Map;
preview.OnMouseDown = mi => onMouseDown(preview, getMap().Map, mi);
preview.SpawnOccupants = getSpawnOccupants;
preview.DisabledSpawnPoints = getDisabledSpawnPoints;
preview.ShowUnoccupiedSpawnpoints = showUnoccupiedSpawnpoints;
var titleLabel = parent.Get<LabelWithTooltipWidget>("MAP_TITLE");
titleLabel.IsVisible = () => getMap().Map != MapCache.UnknownMap;
var font = Game.Renderer.Fonts[titleLabel.Font];
var titleCache = new CachedTransform<string, string>(str =>
{
var truncatedText = WidgetUtils.TruncateText(str, titleLabel.Bounds.Width, font);
if (str != truncatedText)
titleLabel.GetTooltipText = () => str;
else
titleLabel.GetTooltipText = null;
return truncatedText;
});
titleLabel.GetText = () => titleCache.Update(getMap().Map.Title);
return parent;
}
var authorCache = new CachedTransform<string, string>(
text => TranslationProvider.GetString(CreatedBy, Translation.Arguments("author", text)));
Widget SetupAuthorAndMapType(Widget parent)
{
var typeLabel = parent.Get<LabelWidget>("MAP_TYPE");
var typeCache = new CachedTransform<MapPreview, string>(
m => m.Categories.FirstOrDefault() ?? "");
typeLabel.GetText = () => typeCache.Update(getMap().Map);
var authorLabel = parent.Get<LabelWidget>("MAP_AUTHOR");
var font = Game.Renderer.Fonts[authorLabel.Font];
var truncateCache = new CachedTransform<MapPreview, string>(
m => WidgetUtils.TruncateText(authorCache.Update(m.Author), authorLabel.Bounds.Width, font));
authorLabel.GetText = () => truncateCache.Update(getMap().Map);
return parent;
}
var mapRepository = modData.Manifest.Get<WebServices>().MapRepository; var mapRepository = modData.Manifest.Get<WebServices>().MapRepository;
var available = widget.GetOrNull("MAP_AVAILABLE"); Widget SetUpInstallButton(Widget parent)
if (available != null)
{ {
available.IsVisible = () => var button = parent.Get<ButtonWidget>("MAP_INSTALL");
{ button.IsHighlighted = () => blink;
var (map, serverStatus) = getMap(); button.OnClick = () =>
var isPlayable = (serverStatus & Session.MapStatus.Playable) == Session.MapStatus.Playable;
return map.Status == MapStatus.Available && isPlayable;
};
SetupWidgets(available, getMap, onMouseDown, getSpawnOccupants, getDisabledSpawnPoints, showUnoccupiedSpawnpoints);
}
var invalid = widget.GetOrNull("MAP_INVALID");
if (invalid != null)
{
invalid.IsVisible = () =>
{
var (map, serverStatus) = getMap();
return map.Status == MapStatus.Available && (serverStatus & Session.MapStatus.Incompatible) != 0;
};
SetupWidgets(invalid, getMap, onMouseDown, getSpawnOccupants, getDisabledSpawnPoints, showUnoccupiedSpawnpoints);
}
var validating = widget.GetOrNull("MAP_VALIDATING");
if (validating != null)
{
validating.IsVisible = () =>
{
var (map, serverStatus) = getMap();
return map.Status == MapStatus.Available && (serverStatus & Session.MapStatus.Validating) != 0;
};
SetupWidgets(validating, getMap, onMouseDown, getSpawnOccupants, getDisabledSpawnPoints, showUnoccupiedSpawnpoints);
}
var download = widget.GetOrNull("MAP_DOWNLOADABLE");
if (download != null)
{
download.IsVisible = () => getMap().Map.Status == MapStatus.DownloadAvailable;
SetupWidgets(download, getMap, onMouseDown, getSpawnOccupants, getDisabledSpawnPoints, showUnoccupiedSpawnpoints);
var install = download.GetOrNull<ButtonWidget>("MAP_INSTALL");
if (install != null)
{
install.OnClick = () =>
{ {
getMap().Map.Install(mapRepository, () => getMap().Map.Install(mapRepository, () =>
{ {
@@ -104,77 +120,51 @@ namespace OpenRA.Mods.Common.Widgets.Logic
}); });
}; };
install.IsHighlighted = () => installHighlighted; return parent;
}
} }
var progress = widget.GetOrNull("MAP_PROGRESS"); var updateButton = widget.Get<ButtonWidget>("MAP_UPDATE");
if (progress != null) updateButton.IsHighlighted = () => blink;
updateButton.OnClick = () =>
{ {
progress.IsVisible = () => var uid = getMap().Map.Uid;
{ var newUid = modData.MapCache.GetUpdatedMap(uid);
var (map, _) = getMap(); if (newUid != null && newUid != uid)
return map.Status != MapStatus.Available && map.Status != MapStatus.DownloadAvailable; onMapUpdate(newUid);
}; };
SetupWidgets(progress, getMap, onMouseDown, getSpawnOccupants, getDisabledSpawnPoints, showUnoccupiedSpawnpoints); Widget SetUpDownloadProgress(Widget parent)
var statusSearching = progress.GetOrNull("MAP_STATUS_SEARCHING");
if (statusSearching != null)
{ {
statusSearching.IsVisible = () => var progressbar = parent.Get<ProgressBarWidget>("MAP_PROGRESSBAR");
{ progressbar.IsIndeterminate = () => getMap().Map.DownloadPercentage == 0;
var (map, _) = getMap(); progressbar.GetPercentage = () => getMap().Map.DownloadPercentage;
return map.Status == MapStatus.Searching;
};
}
var statusUnavailable = progress.GetOrNull("MAP_STATUS_UNAVAILABLE"); var downloadingLabel = parent.Get<LabelWidget>("MAP_STATUS_DOWNLOADING");
if (statusUnavailable != null) downloadingLabel.GetText = () =>
{
statusUnavailable.IsVisible = () =>
{
var (map, _) = getMap();
return map.Status == MapStatus.Unavailable && map != MapCache.UnknownMap;
};
}
var statusError = progress.GetOrNull("MAP_STATUS_ERROR");
if (statusError != null)
statusError.IsVisible = () => getMap().Map.Status == MapStatus.DownloadError;
var statusDownloading = progress.GetOrNull<LabelWidget>("MAP_STATUS_DOWNLOADING");
if (statusDownloading != null)
{
statusDownloading.IsVisible = () => getMap().Map.Status == MapStatus.Downloading;
statusDownloading.GetText = () =>
{ {
var (map, _) = getMap(); var (map, _) = getMap();
if (map.DownloadBytes == 0) if (map.DownloadBytes == 0)
return TranslationProvider.GetString(Connecting); return TranslationProvider.GetString(Connecting);
// Server does not provide the total file length // Server does not provide the total file length.
if (map.DownloadPercentage == 0) if (map.DownloadPercentage == 0)
TranslationProvider.GetString(Downloading, Translation.Arguments("size", map.DownloadBytes / 1024)); return TranslationProvider.GetString(Downloading, Translation.Arguments("size", map.DownloadBytes / 1024));
return TranslationProvider.GetString(DownloadingPercentage, Translation.Arguments("size", map.DownloadBytes / 1024, "progress", map.DownloadPercentage)); return TranslationProvider.GetString(DownloadingPercentage, Translation.Arguments("size", map.DownloadBytes / 1024, "progress", map.DownloadPercentage));
}; };
return parent;
} }
var retry = progress.GetOrNull<ButtonWidget>("MAP_RETRY"); retryButton = widget.Get<ButtonWidget>("MAP_RETRY");
if (retry != null) retryButton.OnClick = () =>
{
retry.IsVisible = () =>
{ {
retryTriggered = true;
var (map, _) = getMap(); var (map, _) = getMap();
return (map.Status == MapStatus.DownloadError || map.Status == MapStatus.Unavailable) && map != MapCache.UnknownMap;
};
retry.OnClick = () => var uid = modData.MapCache.GetUpdatedMap(map.Uid);
{ mapUpdateAvailable = mapUpdatesEnabled && uid != null && map.Uid != uid;
modData.MapCache.UpdateMaps();
var (map, _) = getMap();
if (map.Status == MapStatus.DownloadError) if (map.Status == MapStatus.DownloadError)
{ {
map.Install(mapRepository, () => map.Install(mapRepository, () =>
@@ -187,77 +177,122 @@ namespace OpenRA.Mods.Common.Widgets.Logic
modData.MapCache.QueryRemoteMapDetails(mapRepository, new[] { map.Uid }); modData.MapCache.QueryRemoteMapDetails(mapRepository, new[] { map.Uid });
}; };
retry.GetText = () => getMap().Map.Status == MapStatus.DownloadError var retryInstall = TranslationProvider.GetString(RetryInstall);
? TranslationProvider.GetString(RetryInstall) var retrySearch = TranslationProvider.GetString(RetrySearch);
: TranslationProvider.GetString(RetrySearch); retryButton.GetText = () => getMap().Map.Status == MapStatus.DownloadError ? retryInstall : retrySearch;
var previewLarge = SetupMapPreview(widget.Get("MAP_LARGE"));
var previewSmall = SetupMapPreview(widget.Get("MAP_SMALL"));
// Widgets to be made visible.
previewWidgets[PreviewStatus.Unknown] = new Widget[] { previewLarge };
previewWidgets[PreviewStatus.Playable] = new Widget[] { previewLarge, SetupAuthorAndMapType(widget.Get("MAP_AVAILABLE")) };
previewWidgets[PreviewStatus.Incompatible] = new Widget[] { previewLarge, widget.Get("MAP_INCOMPATIBLE") };
previewWidgets[PreviewStatus.Validating] = new Widget[] { previewSmall, widget.Get("MAP_VALIDATING") };
previewWidgets[PreviewStatus.UpdateAvailable] = new Widget[] { previewSmall, widget.Get("MAP_UPDATE_AVAILABLE"), updateButton };
previewWidgets[PreviewStatus.DownloadAvailable] = new Widget[] { previewSmall, SetUpInstallButton(SetupAuthorAndMapType(widget.Get("MAP_DOWNLOAD_AVAILABLE"))) };
previewWidgets[PreviewStatus.UpdateDownloadAvailable] = new Widget[] { previewSmall, SetUpInstallButton(widget.Get("MAP_UPDATE_DOWNLOAD_AVAILABLE")), updateButton };
previewWidgets[PreviewStatus.Searching] = new Widget[] { previewSmall, widget.Get("MAP_SEARCHING") };
previewWidgets[PreviewStatus.Downloading] = new Widget[] { previewSmall, SetUpDownloadProgress(widget.Get("MAP_DOWNLOADING")) };
previewWidgets[PreviewStatus.Unavailable] = new Widget[] { previewSmall, widget.Get("MAP_UNAVAILABLE"), retryButton };
previewWidgets[PreviewStatus.DownloadError] = new Widget[] { previewSmall, widget.Get("MAP_ERROR"), retryButton };
// Hide all widgets.
foreach (var preview in previewWidgets)
foreach (var p in preview.Value)
p.IsVisible = () => false;
} }
var progressbar = progress.GetOrNull<ProgressBarWidget>("MAP_PROGRESSBAR"); Widget[] visibleWidgets = Array.Empty<Widget>();
if (progressbar != null)
void UpdateVisibility()
{ {
progressbar.IsIndeterminate = () => getMap().Map.DownloadPercentage == 0; foreach (var widget in visibleWidgets)
progressbar.GetPercentage = () => getMap().Map.DownloadPercentage; widget.IsVisible = () => false;
progressbar.IsVisible = () => getMap().Map.Status == MapStatus.Downloading;
} visibleWidgets = previewWidgets[currentStatus];
} foreach (var widget in visibleWidgets)
widget.IsVisible = () => true;
} }
bool retryTriggered = false;
public override void Tick() public override void Tick()
{ {
if (++blinkTick >= blinkTickLength) if (++blinkTick >= blinkTickLength)
{ {
installHighlighted ^= true; blink ^= true;
blinkTick = 0; blinkTick = 0;
} }
}
static void SetupWidgets(Widget parent, var (map, serverStatus) = getMap();
Func<(MapPreview Map, Session.MapStatus Status)> getMap,
Action<MapPreviewWidget, MapPreview, MouseInput> onMouseDown,
Func<Dictionary<int, SpawnOccupant>> getSpawnOccupants,
Func<HashSet<int>> getDisabledSpawnPoints,
bool showUnoccupiedSpawnpoints)
{
var preview = parent.Get<MapPreviewWidget>("MAP_PREVIEW");
preview.Preview = () => getMap().Map;
preview.OnMouseDown = mi => onMouseDown(preview, getMap().Map, mi);
preview.SpawnOccupants = getSpawnOccupants;
preview.DisabledSpawnPoints = getDisabledSpawnPoints;
preview.ShowUnoccupiedSpawnpoints = showUnoccupiedSpawnpoints;
var titleLabel = parent.GetOrNull<LabelWithTooltipWidget>("MAP_TITLE"); // Combine Session.MapStatus and MapStatus into PreviewStatus.
if (titleLabel != null) PreviewStatus? status = null;
{ if (map == MapCache.UnknownMap)
titleLabel.IsVisible = () => getMap().Map != MapCache.UnknownMap; status = PreviewStatus.Unknown;
var font = Game.Renderer.Fonts[titleLabel.Font];
var title = new CachedTransform<MapPreview, string>(m =>
{
var truncated = WidgetUtils.TruncateText(m.Title, titleLabel.Bounds.Width, font);
if (m.Title != truncated)
titleLabel.GetTooltipText = () => m.Title;
else else
titleLabel.GetTooltipText = null; {
switch (map.Status)
return truncated; {
}); case MapStatus.Available:
titleLabel.GetText = () => title.Update(getMap().Map); if (serverStatus.HasFlag(Session.MapStatus.Playable))
status = PreviewStatus.Playable;
else if (serverStatus.HasFlag(Session.MapStatus.Incompatible))
status = PreviewStatus.Incompatible;
else if (serverStatus.HasFlag(Session.MapStatus.Validating))
status = PreviewStatus.Validating;
else
return;
break;
case MapStatus.DownloadAvailable:
if (mapUpdateAvailable)
status = PreviewStatus.UpdateDownloadAvailable;
else
status = PreviewStatus.DownloadAvailable;
break;
case MapStatus.Searching:
status = PreviewStatus.Searching;
break;
case MapStatus.Unavailable:
if (mapUpdateAvailable)
status = PreviewStatus.UpdateAvailable;
else
status = PreviewStatus.Unavailable;
break;
case MapStatus.DownloadError:
status = PreviewStatus.DownloadError;
break;
case MapStatus.Downloading:
status = PreviewStatus.Downloading;
break;
}
} }
var typeLabel = parent.GetOrNull<LabelWidget>("MAP_TYPE"); // Trigger only on status change.
if (typeLabel != null) if (status != null && status != currentStatus)
{ {
var type = new CachedTransform<MapPreview, string>(m => m.Categories.FirstOrDefault() ?? ""); // When a map becomes invalid, make sure the `Retry` button is triggered.
typeLabel.GetText = () => type.Update(getMap().Map); if (status == PreviewStatus.Unavailable || status == PreviewStatus.UpdateAvailable)
{
if (retryTriggered)
retryTriggered = false;
else
{
retryButton.OnClick();
if (map.Status == MapStatus.Searching)
status = PreviewStatus.Searching;
else if (mapUpdateAvailable)
status = PreviewStatus.UpdateAvailable;
else
status = PreviewStatus.Unavailable;
} }
}
else if (status != PreviewStatus.Searching)
retryTriggered = false;
var authorLabel = parent.GetOrNull<LabelWidget>("MAP_AUTHOR"); currentStatus = status.Value;
if (authorLabel != null) UpdateVisibility();
{
var font = Game.Renderer.Fonts[authorLabel.Font];
var author = new CachedTransform<MapPreview, string>(
m => WidgetUtils.TruncateText(TranslationProvider.GetString(CreatedBy, Translation.Arguments("author", m.Author)), authorLabel.Bounds.Width, font));
authorLabel.GetText = () => author.Update(getMap().Map);
} }
} }
} }

View File

@@ -176,6 +176,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
{ "getSpawnOccupants", (Func<Dictionary<int, SpawnOccupant>>)(() => spawnOccupants.Update(selectedReplay)) }, { "getSpawnOccupants", (Func<Dictionary<int, SpawnOccupant>>)(() => spawnOccupants.Update(selectedReplay)) },
{ "getDisabledSpawnPoints", (Func<HashSet<int>>)(() => disabledSpawnPoints.Update(selectedReplay)) }, { "getDisabledSpawnPoints", (Func<HashSet<int>>)(() => disabledSpawnPoints.Update(selectedReplay)) },
{ "showUnoccupiedSpawnpoints", false }, { "showUnoccupiedSpawnpoints", false },
{ "mapUpdatesEnabled", false },
{ "onMapUpdate", (Action<string>)(_ => { }) },
}); });
var replayDuration = new CachedTransform<ReplayMetadata, string>(r => var replayDuration = new CachedTransform<ReplayMetadata, string>(r =>

View File

@@ -3,7 +3,7 @@ Container@MAP_PREVIEW:
Width: PARENT_RIGHT Width: PARENT_RIGHT
Height: PARENT_BOTTOM Height: PARENT_BOTTOM
Children: Children:
Container@MAP_AVAILABLE: Container@MAP_LARGE:
Width: PARENT_RIGHT Width: PARENT_RIGHT
Height: PARENT_BOTTOM Height: PARENT_BOTTOM
Children: Children:
@@ -26,6 +26,33 @@ Container@MAP_PREVIEW:
Align: Center Align: Center
TooltipContainer: TOOLTIP_CONTAINER TooltipContainer: TOOLTIP_CONTAINER
TooltipTemplate: SIMPLE_TOOLTIP TooltipTemplate: SIMPLE_TOOLTIP
Container@MAP_SMALL:
Width: PARENT_RIGHT
Height: PARENT_BOTTOM
Children:
Background@MAP_BG:
Width: PARENT_RIGHT
Height: 142
Background: panel-gray
Children:
MapPreview@MAP_PREVIEW:
X: 1
Y: 1
Width: PARENT_RIGHT - 2
Height: PARENT_BOTTOM - 2
TooltipContainer: TOOLTIP_CONTAINER
LabelWithTooltip@MAP_TITLE:
Y: 143
Width: PARENT_RIGHT
Height: 25
Font: Bold
Align: Center
TooltipContainer: TOOLTIP_CONTAINER
TooltipTemplate: SIMPLE_TOOLTIP
Container@MAP_AVAILABLE:
Width: PARENT_RIGHT
Height: PARENT_BOTTOM
Children:
Label@MAP_TYPE: Label@MAP_TYPE:
Y: 188 Y: 188
Width: PARENT_RIGHT Width: PARENT_RIGHT
@@ -39,29 +66,10 @@ Container@MAP_PREVIEW:
Height: 25 Height: 25
Font: Tiny Font: Tiny
Align: Center Align: Center
Container@MAP_INVALID: Container@MAP_INCOMPATIBLE:
Width: PARENT_RIGHT Width: PARENT_RIGHT
Height: PARENT_BOTTOM Height: PARENT_BOTTOM
Children: Children:
Background@MAP_BG:
Width: PARENT_RIGHT
Height: 174
Background: panel-gray
Children:
MapPreview@MAP_PREVIEW:
X: 1
Y: 1
Width: PARENT_RIGHT - 2
Height: PARENT_BOTTOM - 2
TooltipContainer: TOOLTIP_CONTAINER
LabelWithTooltip@MAP_TITLE:
Y: 173
Width: PARENT_RIGHT
Height: 25
Font: Bold
Align: Center
TooltipContainer: TOOLTIP_CONTAINER
TooltipTemplate: SIMPLE_TOOLTIP
Label@MAP_STATUS_A: Label@MAP_STATUS_A:
Y: 188 Y: 188
Width: PARENT_RIGHT Width: PARENT_RIGHT
@@ -81,25 +89,6 @@ Container@MAP_PREVIEW:
Width: PARENT_RIGHT Width: PARENT_RIGHT
Height: PARENT_BOTTOM Height: PARENT_BOTTOM
Children: Children:
Background@MAP_BG:
Width: PARENT_RIGHT
Height: 158
Background: panel-gray
Children:
MapPreview@MAP_PREVIEW:
X: 1
Y: 1
Width: PARENT_RIGHT - 2
Height: PARENT_BOTTOM - 2
TooltipContainer: TOOLTIP_CONTAINER
LabelWithTooltip@MAP_TITLE:
Y: 159
Width: PARENT_RIGHT
Height: 25
Font: Bold
Align: Center
TooltipContainer: TOOLTIP_CONTAINER
TooltipTemplate: SIMPLE_TOOLTIP
Label@MAP_STATUS_VALIDATING: Label@MAP_STATUS_VALIDATING:
Y: 174 Y: 174
Width: PARENT_RIGHT Width: PARENT_RIGHT
@@ -108,34 +97,15 @@ Container@MAP_PREVIEW:
Align: Center Align: Center
Text: Validating... Text: Validating...
IgnoreMouseOver: true IgnoreMouseOver: true
ProgressBar@MAP_PROGRESSBAR: ProgressBar@MAP_VALIDATING_BAR:
Y: 194 Y: 194
Width: PARENT_RIGHT Width: PARENT_RIGHT
Height: 25 Height: 25
Indeterminate: True Indeterminate: True
Container@MAP_DOWNLOADABLE: Container@MAP_DOWNLOAD_AVAILABLE:
Width: PARENT_RIGHT Width: PARENT_RIGHT
Height: PARENT_BOTTOM Height: PARENT_BOTTOM
Children: Children:
Background@MAP_BG:
Width: PARENT_RIGHT
Height: 142
Background: panel-gray
Children:
MapPreview@MAP_PREVIEW:
X: 1
Y: 1
Width: PARENT_RIGHT - 2
Height: PARENT_BOTTOM - 2
TooltipContainer: TOOLTIP_CONTAINER
LabelWithTooltip@MAP_TITLE:
Y: 143
Width: PARENT_RIGHT
Height: 25
Font: Bold
Align: Center
TooltipContainer: TOOLTIP_CONTAINER
TooltipTemplate: SIMPLE_TOOLTIP
Label@MAP_TYPE: Label@MAP_TYPE:
Y: 158 Y: 158
Width: PARENT_RIGHT Width: PARENT_RIGHT
@@ -154,30 +124,21 @@ Container@MAP_PREVIEW:
Width: PARENT_RIGHT Width: PARENT_RIGHT
Height: 25 Height: 25
Text: Install Map Text: Install Map
Container@MAP_PROGRESS: Button@MAP_UPDATE:
Y: 195
Width: PARENT_RIGHT
Height: 25
Text: Update Map
Container@MAP_UPDATE_DOWNLOAD_AVAILABLE:
Width: PARENT_RIGHT Width: PARENT_RIGHT
Height: PARENT_BOTTOM Height: PARENT_BOTTOM
Children: Children:
Background@MAP_BG: Button@MAP_INSTALL:
Width: PARENT_RIGHT Y: 166
Height: 142
Background: panel-gray
Children:
MapPreview@MAP_PREVIEW:
X: 1
Y: 1
Width: PARENT_RIGHT - 2
Height: PARENT_BOTTOM - 2
TooltipContainer: TOOLTIP_CONTAINER
LabelWithTooltip@MAP_TITLE:
Y: 143
Width: PARENT_RIGHT Width: PARENT_RIGHT
Height: 25 Height: 25
Font: Bold Text: Install Map
Align: Center Label@MAP_SEARCHING:
TooltipContainer: TOOLTIP_CONTAINER
TooltipTemplate: SIMPLE_TOOLTIP
Label@MAP_STATUS_SEARCHING:
Y: 158 Y: 158
Width: PARENT_RIGHT Width: PARENT_RIGHT
Height: 25 Height: 25
@@ -185,7 +146,7 @@ Container@MAP_PREVIEW:
Align: Center Align: Center
Text: Searching OpenRA Resource Center... Text: Searching OpenRA Resource Center...
IgnoreMouseOver: true IgnoreMouseOver: true
Container@MAP_STATUS_UNAVAILABLE: Container@MAP_UNAVAILABLE:
Width: PARENT_RIGHT Width: PARENT_RIGHT
Children: Children:
Label@a: Label@a:
@@ -202,13 +163,17 @@ Container@MAP_PREVIEW:
Font: Tiny Font: Tiny
Align: Center Align: Center
Text: OpenRA Resource Center Text: OpenRA Resource Center
Label@MAP_STATUS_ERROR: Label@MAP_ERROR:
Y: 158 Y: 158
Width: PARENT_RIGHT Width: PARENT_RIGHT
Height: 25 Height: 25
Font: Tiny Font: Tiny
Align: Center Align: Center
Text: An error occurred during installation Text: An error occurred during installation
Container@MAP_DOWNLOADING:
Width: PARENT_RIGHT
Height: PARENT_BOTTOM
Children:
Label@MAP_STATUS_DOWNLOADING: Label@MAP_STATUS_DOWNLOADING:
Y: 158 Y: 158
Width: PARENT_RIGHT Width: PARENT_RIGHT
@@ -224,3 +189,20 @@ Container@MAP_PREVIEW:
Y: 194 Y: 194
Width: PARENT_RIGHT Width: PARENT_RIGHT
Height: 25 Height: 25
Container@MAP_UPDATE_AVAILABLE:
Width: PARENT_RIGHT
Children:
Label@a:
Y: 158
Width: PARENT_RIGHT
Height: 25
Font: Tiny
Align: Center
Text: A new version of the map
Label@b:
Y: 171
Width: PARENT_RIGHT
Height: 25
Font: Tiny
Align: Center
Text: was found on your computer

View File

@@ -3,7 +3,7 @@ Container@MAP_PREVIEW:
Width: PARENT_RIGHT Width: PARENT_RIGHT
Height: PARENT_BOTTOM Height: PARENT_BOTTOM
Children: Children:
Container@MAP_AVAILABLE: Container@MAP_LARGE:
Width: PARENT_RIGHT Width: PARENT_RIGHT
Height: PARENT_BOTTOM Height: PARENT_BOTTOM
Children: Children:
@@ -26,6 +26,33 @@ Container@MAP_PREVIEW:
Align: Center Align: Center
TooltipContainer: TOOLTIP_CONTAINER TooltipContainer: TOOLTIP_CONTAINER
TooltipTemplate: SIMPLE_TOOLTIP TooltipTemplate: SIMPLE_TOOLTIP
Container@MAP_SMALL:
Width: PARENT_RIGHT
Height: PARENT_BOTTOM
Children:
Background@MAP_BG:
Width: PARENT_RIGHT
Height: 142
Background: dialog3
Children:
MapPreview@MAP_PREVIEW:
X: 1
Y: 1
Width: PARENT_RIGHT - 2
Height: PARENT_BOTTOM - 2
TooltipContainer: TOOLTIP_CONTAINER
LabelWithTooltip@MAP_TITLE:
Y: 143
Width: PARENT_RIGHT
Height: 25
Font: Bold
Align: Center
TooltipContainer: TOOLTIP_CONTAINER
TooltipTemplate: SIMPLE_TOOLTIP
Container@MAP_AVAILABLE:
Width: PARENT_RIGHT
Height: PARENT_BOTTOM
Children:
Label@MAP_TYPE: Label@MAP_TYPE:
Y: 188 Y: 188
Width: PARENT_RIGHT Width: PARENT_RIGHT
@@ -39,29 +66,10 @@ Container@MAP_PREVIEW:
Height: 25 Height: 25
Font: Tiny Font: Tiny
Align: Center Align: Center
Container@MAP_INVALID: Container@MAP_INCOMPATIBLE:
Width: PARENT_RIGHT Width: PARENT_RIGHT
Height: PARENT_BOTTOM Height: PARENT_BOTTOM
Children: Children:
Background@MAP_BG:
Width: PARENT_RIGHT
Height: 174
Background: dialog3
Children:
MapPreview@MAP_PREVIEW:
X: 1
Y: 1
Width: PARENT_RIGHT - 2
Height: PARENT_BOTTOM - 2
TooltipContainer: TOOLTIP_CONTAINER
LabelWithTooltip@MAP_TITLE:
Y: 173
Width: PARENT_RIGHT
Height: 25
Font: Bold
Align: Center
TooltipContainer: TOOLTIP_CONTAINER
TooltipTemplate: SIMPLE_TOOLTIP
Label@MAP_STATUS_A: Label@MAP_STATUS_A:
Y: 188 Y: 188
Width: PARENT_RIGHT Width: PARENT_RIGHT
@@ -81,25 +89,6 @@ Container@MAP_PREVIEW:
Width: PARENT_RIGHT Width: PARENT_RIGHT
Height: PARENT_BOTTOM Height: PARENT_BOTTOM
Children: Children:
Background@MAP_BG:
Width: PARENT_RIGHT
Height: 158
Background: dialog3
Children:
MapPreview@MAP_PREVIEW:
X: 1
Y: 1
Width: PARENT_RIGHT - 2
Height: PARENT_BOTTOM - 2
TooltipContainer: TOOLTIP_CONTAINER
LabelWithTooltip@MAP_TITLE:
Y: 159
Width: PARENT_RIGHT
Height: 25
Font: Bold
Align: Center
TooltipContainer: TOOLTIP_CONTAINER
TooltipTemplate: SIMPLE_TOOLTIP
Label@MAP_STATUS_VALIDATING: Label@MAP_STATUS_VALIDATING:
Y: 174 Y: 174
Width: PARENT_RIGHT Width: PARENT_RIGHT
@@ -108,34 +97,15 @@ Container@MAP_PREVIEW:
Align: Center Align: Center
Text: Validating... Text: Validating...
IgnoreMouseOver: true IgnoreMouseOver: true
ProgressBar@MAP_PROGRESSBAR: ProgressBar@MAP_VALIDATING_BAR:
Y: 194 Y: 194
Width: PARENT_RIGHT Width: PARENT_RIGHT
Height: 25 Height: 25
Indeterminate: True Indeterminate: True
Container@MAP_DOWNLOADABLE: Container@MAP_DOWNLOAD_AVAILABLE:
Width: PARENT_RIGHT Width: PARENT_RIGHT
Height: PARENT_BOTTOM Height: PARENT_BOTTOM
Children: Children:
Background@MAP_BG:
Width: PARENT_RIGHT
Height: 142
Background: dialog3
Children:
MapPreview@MAP_PREVIEW:
X: 1
Y: 1
Width: PARENT_RIGHT - 2
Height: PARENT_BOTTOM - 2
TooltipContainer: TOOLTIP_CONTAINER
LabelWithTooltip@MAP_TITLE:
Y: 143
Width: PARENT_RIGHT
Height: 25
Font: Bold
Align: Center
TooltipContainer: TOOLTIP_CONTAINER
TooltipTemplate: SIMPLE_TOOLTIP
Label@MAP_TYPE: Label@MAP_TYPE:
Y: 158 Y: 158
Width: PARENT_RIGHT Width: PARENT_RIGHT
@@ -155,30 +125,23 @@ Container@MAP_PREVIEW:
Height: 25 Height: 25
Font: Bold Font: Bold
Text: Install Map Text: Install Map
Container@MAP_PROGRESS: Button@MAP_UPDATE:
Width: PARENT_RIGHT Y: 195
Height: PARENT_BOTTOM
Children:
Background@MAP_BG:
Width: PARENT_RIGHT
Height: 142
Background: dialog3
Children:
MapPreview@MAP_PREVIEW:
X: 1
Y: 1
Width: PARENT_RIGHT - 2
Height: PARENT_BOTTOM - 2
TooltipContainer: TOOLTIP_CONTAINER
LabelWithTooltip@MAP_TITLE:
Y: 143
Width: PARENT_RIGHT Width: PARENT_RIGHT
Height: 25 Height: 25
Font: Bold Font: Bold
Align: Center Text: Update Map
TooltipContainer: TOOLTIP_CONTAINER Container@MAP_UPDATE_DOWNLOAD_AVAILABLE:
TooltipTemplate: SIMPLE_TOOLTIP Width: PARENT_RIGHT
Label@MAP_STATUS_SEARCHING: Height: PARENT_BOTTOM
Children:
Button@MAP_INSTALL:
Y: 166
Width: PARENT_RIGHT
Height: 25
Font: Bold
Text: Install Map
Label@MAP_SEARCHING:
Y: 158 Y: 158
Width: PARENT_RIGHT Width: PARENT_RIGHT
Height: 25 Height: 25
@@ -186,7 +149,7 @@ Container@MAP_PREVIEW:
Align: Center Align: Center
Text: Searching OpenRA Resource Center... Text: Searching OpenRA Resource Center...
IgnoreMouseOver: true IgnoreMouseOver: true
Container@MAP_STATUS_UNAVAILABLE: Container@MAP_UNAVAILABLE:
Width: PARENT_RIGHT Width: PARENT_RIGHT
Children: Children:
Label@a: Label@a:
@@ -203,13 +166,17 @@ Container@MAP_PREVIEW:
Font: Tiny Font: Tiny
Align: Center Align: Center
Text: OpenRA Resource Center Text: OpenRA Resource Center
Label@MAP_STATUS_ERROR: Label@MAP_ERROR:
Y: 158 Y: 158
Width: PARENT_RIGHT Width: PARENT_RIGHT
Height: 25 Height: 25
Font: Tiny Font: Tiny
Align: Center Align: Center
Text: An error occurred during installation Text: An error occurred during installation
Container@MAP_DOWNLOADING:
Width: PARENT_RIGHT
Height: PARENT_BOTTOM
Children:
Label@MAP_STATUS_DOWNLOADING: Label@MAP_STATUS_DOWNLOADING:
Y: 158 Y: 158
Width: PARENT_RIGHT Width: PARENT_RIGHT
@@ -226,3 +193,20 @@ Container@MAP_PREVIEW:
Width: PARENT_RIGHT Width: PARENT_RIGHT
Height: 25 Height: 25
Font: Bold Font: Bold
Container@MAP_UPDATE_AVAILABLE:
Width: PARENT_RIGHT
Children:
Label@a:
Y: 158
Width: PARENT_RIGHT
Height: 25
Font: Tiny
Align: Center
Text: A new version of the map
Label@b:
Y: 171
Width: PARENT_RIGHT
Height: 25
Font: Tiny
Align: Center
Text: was found on your computer