diff --git a/OpenRA.Mods.Common/Widgets/Logic/AssetBrowserLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/AssetBrowserLogic.cs index 767902d0b5..dcc5265630 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/AssetBrowserLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/AssetBrowserLogic.cs @@ -47,6 +47,10 @@ namespace OpenRA.Mods.Common.Widgets.Logic bool isVideoLoaded = false; int currentFrame; + LabelWidget errorLabelWidget; + SpriteFont errorFont; + bool IsErrorLabelVisible { get { return errorLabelWidget != null && errorLabelWidget.Visible; } } + [ObjectCreator.UseCtor] public AssetBrowserLogic(Widget widget, Action onExit, ModData modData, World world, Dictionary logicArgs) { @@ -84,12 +88,16 @@ namespace OpenRA.Mods.Common.Widgets.Logic spriteWidget.GetSprite = () => currentSprites != null ? currentSprites[currentFrame] : null; currentPalette = spriteWidget.Palette; spriteWidget.GetPalette = () => currentPalette; - spriteWidget.IsVisible = () => !isVideoLoaded; + spriteWidget.IsVisible = () => !isVideoLoaded && !IsErrorLabelVisible; } var playerWidget = panel.GetOrNull("PLAYER"); if (playerWidget != null) - playerWidget.IsVisible = () => isVideoLoaded; + playerWidget.IsVisible = () => isVideoLoaded && !IsErrorLabelVisible; + + errorLabelWidget = panel.GetOrNull("ERROR"); + if (errorLabelWidget != null) + errorFont = Game.Renderer.Fonts[errorLabelWidget.Font]; var paletteDropDown = panel.GetOrNull("PALETTE_SELECTOR"); if (paletteDropDown != null) @@ -314,25 +322,44 @@ namespace OpenRA.Mods.Common.Widgets.Logic if (!modData.DefaultFileSystem.Exists(filename)) return false; - if (Path.GetExtension(filename.ToLowerInvariant()) == ".vqa") - { - player = panel.Get("PLAYER"); - currentFilename = filename; - player.Load(filename); - player.DrawOverlay = false; - isVideoLoaded = true; - frameSlider.MaximumValue = (float)player.Video.Frames - 1; - frameSlider.Ticks = 0; - return true; - } - else + errorLabelWidget.Visible = false; + + try { + if (Path.GetExtension(filename.ToLowerInvariant()) == ".vqa") + { + player = panel.Get("PLAYER"); + currentFilename = filename; + player.Load(filename); + player.DrawOverlay = false; + isVideoLoaded = true; + frameSlider.MaximumValue = (float)player.Video.Frames - 1; + frameSlider.Ticks = 0; + return true; + } + currentFilename = filename; currentSprites = world.Map.Rules.Sequences.SpriteCache[filename]; currentFrame = 0; frameSlider.MaximumValue = (float)currentSprites.Length - 1; frameSlider.Ticks = currentSprites.Length; } + catch (Exception ex) + { + if (errorLabelWidget != null) + { + errorLabelWidget.Text = WidgetUtils.TruncateText(errorLabelWidget.Text.Replace("{filename}", filename), + errorLabelWidget.Bounds.Width, errorFont); + + currentSprites = new Sprite[0]; + errorLabelWidget.Visible = true; + } + + Log.AddChannel("assetbrowser", "assetbrowser.log"); + Log.Write("assetbrowser", "Error reading {0}:{3} {1}{3}{2}", filename, ex.Message, ex.StackTrace, Environment.NewLine); + + return false; + } return true; } diff --git a/mods/cnc/chrome/assetbrowser.yaml b/mods/cnc/chrome/assetbrowser.yaml index 8d9191c9ea..b70d781f13 100644 --- a/mods/cnc/chrome/assetbrowser.yaml +++ b/mods/cnc/chrome/assetbrowser.yaml @@ -105,6 +105,13 @@ Container@ASSETBROWSER_PANEL: Width: PARENT_RIGHT Height: PARENT_BOTTOM AspectRatio: 1 + Label@ERROR: + X: 5 + Width: 490 - 10 + Height: 325 + Align: Center + Visible: false + Text: Error displaying {filename} check assetbrowser.log Container@FRAME_SELECTOR: X: 190 Y: 395 diff --git a/mods/ra/chrome/assetbrowser.yaml b/mods/ra/chrome/assetbrowser.yaml index b7d13719aa..c7cf5a0237 100644 --- a/mods/ra/chrome/assetbrowser.yaml +++ b/mods/ra/chrome/assetbrowser.yaml @@ -100,6 +100,13 @@ Background@ASSETBROWSER_PANEL: Width: PARENT_RIGHT Height: PARENT_BOTTOM AspectRatio: 1 + Label@ERROR: + X: 5 + Width: 490 - 10 + Height: 330 + Align: Center + Visible: false + Text: Error displaying {filename} check assetbrowser.log Container@FRAME_SELECTOR: X: 190 Y: 425