From d973ed307f1448f83572a94e91444df7a16d7630 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 17 Nov 2013 16:07:32 +0100 Subject: [PATCH 1/7] don't crash the asset browser when loading sprites with 1 frame closes #4125 --- OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs index 3499d592f3..8750eb8005 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs @@ -58,6 +58,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic frameSlider = panel.Get("FRAME_SLIDER"); frameSlider.MaximumValue = (float)spriteImage.FrameCount; frameSlider.Ticks = spriteImage.FrameCount+1; + frameSlider.IsVisible = () => spriteImage.FrameCount > 0; frameSlider.OnChange += x => { spriteImage.Frame = (int)Math.Round(x); }; frameSlider.GetValue = () => spriteImage.Frame; From f6bd53c15ef4a536cddfa7f1fc04b4cb85f111b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 17 Nov 2013 16:09:23 +0100 Subject: [PATCH 2/7] StyleCop --- .../Widgets/Logic/AssetBrowserLogic.cs | 65 +++++++++---------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs index 8750eb8005..88626ddd5a 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs @@ -28,8 +28,8 @@ namespace OpenRA.Mods.RA.Widgets.Logic ScrollPanelWidget assetList; ScrollItemWidget template; - IFolder AssetSource = null; - List AvailableShps = new List(); + IFolder assetSource = null; + List availableShps = new List(); [ObjectCreator.UseCtor] public AssetBrowserLogic(Widget widget, Action onExit, World world) @@ -40,24 +40,24 @@ namespace OpenRA.Mods.RA.Widgets.Logic sourceDropdown.OnMouseDown = _ => ShowSourceDropdown(sourceDropdown); sourceDropdown.GetText = () => { - var name = AssetSource != null ? AssetSource.Name : "All Packages"; + var name = assetSource != null ? assetSource.Name : "All Packages"; if (name.Length > 15) - name = "..."+name.Substring(name.Length - 15); + name = "..." + name.Substring(name.Length - 15); return name; }; - AssetSource = FileSystem.MountedFolders.First(); + assetSource = FileSystem.MountedFolders.First(); spriteImage = panel.Get("SPRITE"); filenameInput = panel.Get("FILENAME_INPUT"); - filenameInput.Text = spriteImage.Image+".shp"; + filenameInput.Text = spriteImage.Image + ".shp"; filenameInput.OnEnterKey = () => LoadAsset(filenameInput.Text); frameSlider = panel.Get("FRAME_SLIDER"); frameSlider.MaximumValue = (float)spriteImage.FrameCount; - frameSlider.Ticks = spriteImage.FrameCount+1; + frameSlider.Ticks = spriteImage.FrameCount + 1; frameSlider.IsVisible = () => spriteImage.FrameCount > 0; frameSlider.OnChange += x => { spriteImage.Frame = (int)Math.Round(x); }; frameSlider.GetValue = () => spriteImage.Frame; @@ -108,13 +108,13 @@ namespace OpenRA.Mods.RA.Widgets.Logic { var ExtractGameFiles = new string[][] { - new string[] {"--extract", modID, palette, "--userdir"}, - new string[] {"--extract", modID, "{0}.shp".F(spriteImage.Image), "--userdir"}, + new string[] { "--extract", modID, palette, "--userdir" }, + new string[] { "--extract", modID, "{0}.shp".F(spriteImage.Image), "--userdir" }, }; - + var ExportToPng = new string[][] { - new string[] {"--png", Platform.SupportDir+"{0}.shp".F(spriteImage.Image), Platform.SupportDir+palette}, + new string[] { "--png", Platform.SupportDir + "{0}.shp".F(spriteImage.Image), Platform.SupportDir + palette }, }; var ImportFromPng = new string[][] { }; @@ -123,9 +123,9 @@ namespace OpenRA.Mods.RA.Widgets.Logic { { "ExtractGameFiles", ExtractGameFiles }, { "ExportToPng", ExportToPng }, - { "ImportFromPng", ImportFromPng} + { "ImportFromPng", ImportFromPng } }; - + Ui.OpenWindow("CONVERT_ASSETS_PANEL", args); }; @@ -134,13 +134,13 @@ namespace OpenRA.Mods.RA.Widgets.Logic var ExtractGameFilesList = new List(); var ExportToPngList = new List(); - ExtractGameFilesList.Add(new string[] { "--extract", modID, palette, "--userdir"} ); + ExtractGameFilesList.Add(new string[] { "--extract", modID, palette, "--userdir" }); - foreach (var shp in AvailableShps) + foreach (var shp in availableShps) { - ExtractGameFilesList.Add(new string[] { "--extract", modID, shp, "--userdir" } ); - ExportToPngList.Add(new string[] { "--png", Platform.SupportDir+shp, Platform.SupportDir+palette } ); - Console.WriteLine(Platform.SupportDir+shp); + ExtractGameFilesList.Add(new string[] { "--extract", modID, shp, "--userdir" }); + ExportToPngList.Add(new string[] { "--png", Platform.SupportDir + shp, Platform.SupportDir + palette }); + Console.WriteLine(Platform.SupportDir + shp); } var ExtractGameFiles = ExtractGameFilesList.ToArray(); @@ -153,11 +153,10 @@ namespace OpenRA.Mods.RA.Widgets.Logic { "ExportToPng", ExportToPng }, { "ImportFromPng", ImportFromPng } }; - + Ui.OpenWindow("CONVERT_ASSETS_PANEL", args); }; - panel.Get("IMPORT_BUTTON").OnClick = () => { var imageSizeInput = panel.Get("IMAGE_SIZE_INPUT"); @@ -167,16 +166,16 @@ namespace OpenRA.Mods.RA.Widgets.Logic var ExportToPng = new string[][] { }; var ImportFromPng = new string[][] { - new string[] {"--shp", Platform.SupportDir+imageFilename.Text, imageSizeInput.Text}, + new string[] { "--shp", Platform.SupportDir + imageFilename.Text, imageSizeInput.Text }, }; var args = new WidgetArgs() { { "ExtractGameFiles", ExtractGameFiles }, { "ExportToPng", ExportToPng }, - { "ImportFromPng", ImportFromPng} + { "ImportFromPng", ImportFromPng } }; - + Ui.OpenWindow("CONVERT_ASSETS_PANEL", args); }; @@ -202,7 +201,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic spriteImage.Frame = 0; spriteImage.Image = sprite; frameSlider.MaximumValue = (float)spriteImage.FrameCount; - frameSlider.Ticks = spriteImage.FrameCount+1; + frameSlider.Ticks = spriteImage.FrameCount + 1; return true; } @@ -211,14 +210,14 @@ namespace OpenRA.Mods.RA.Widgets.Logic Func setupItem = (source, itemTemplate) => { var item = ScrollItemWidget.Setup(itemTemplate, - () => AssetSource == source, - () => { AssetSource = source; PopulateAssetList(); }); + () => assetSource == source, + () => { assetSource = source; PopulateAssetList(); }); item.Get("LABEL").GetText = () => source != null ? source.Name : "All Packages"; return item; }; // TODO: Re-enable "All Packages" once list generation is done in a background thread - //var sources = new[] { (IFolder)null }.Concat(FileSystem.MountedFolders); + ///var sources = new[] { (IFolder)null }.Concat(FileSystem.MountedFolders); var sources = FileSystem.MountedFolders; dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 250, sources, setupItem); @@ -228,22 +227,22 @@ namespace OpenRA.Mods.RA.Widgets.Logic void PopulateAssetList() { assetList.RemoveChildren(); - AvailableShps.Clear(); + availableShps.Clear(); // TODO: This is too slow to run in the main thread - //var files = AssetSource != null ? AssetSource.AllFileNames() : - // FileSystem.MountedFolders.SelectMany(f => f.AllFileNames()); + ///var files = AssetSource != null ? AssetSource.AllFileNames() : + /// FileSystem.MountedFolders.SelectMany(f => f.AllFileNames()); - if (AssetSource == null) + if (assetSource == null) return; - var files = AssetSource.AllFileNames(); + var files = assetSource.AllFileNames(); foreach (var file in files) { if (file.EndsWith(".shp")) { AddAsset(assetList, file, template); - AvailableShps.Add(file); + availableShps.Add(file); } } } From 6171ea7cf37469f87a16ee25e49316e8c47ea400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 17 Nov 2013 17:19:47 +0100 Subject: [PATCH 3/7] harden asset browser against invalid user input and allow R8 closes #3980 --- .../Widgets/Logic/AssetBrowserLogic.cs | 22 +++++++++++++------ mods/d2k/chrome/assetbrowser.yaml | 3 ++- mods/ra/chrome/assetbrowser.yaml | 1 + 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs index 88626ddd5a..f4681dd5ea 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs @@ -10,6 +10,7 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Linq; using OpenRA.FileFormats; @@ -52,7 +53,6 @@ namespace OpenRA.Mods.RA.Widgets.Logic spriteImage = panel.Get("SPRITE"); filenameInput = panel.Get("FILENAME_INPUT"); - filenameInput.Text = spriteImage.Image + ".shp"; filenameInput.OnEnterKey = () => LoadAsset(filenameInput.Text); frameSlider = panel.Get("FRAME_SLIDER"); @@ -184,20 +184,28 @@ namespace OpenRA.Mods.RA.Widgets.Logic void AddAsset(ScrollPanelWidget list, string filepath, ScrollItemWidget template) { - var sprite = Path.GetFileNameWithoutExtension(filepath); + var r8 = filepath.EndsWith(".r8", true, CultureInfo.InvariantCulture); + var filename = Path.GetFileName(filepath); + var sprite = r8 ? filename : Path.GetFileNameWithoutExtension(filepath); var item = ScrollItemWidget.Setup(template, () => spriteImage.Image == sprite, - () => LoadAsset(sprite)); + () => {filenameInput.Text = filename; LoadAsset(filename); }); item.Get("TITLE").GetText = () => filepath; list.AddChild(item); } - bool LoadAsset(string sprite) + bool LoadAsset(string filename) { - if (sprite == null) + if (string.IsNullOrEmpty(filename)) return false; + if (!FileSystem.Exists(filename)) + return false; + + var r8 = filename.EndsWith(".r8", true, CultureInfo.InvariantCulture); + var sprite = r8 ? filename : Path.GetFileNameWithoutExtension(filename); + spriteImage.Frame = 0; spriteImage.Image = sprite; frameSlider.MaximumValue = (float)spriteImage.FrameCount; @@ -220,7 +228,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic ///var sources = new[] { (IFolder)null }.Concat(FileSystem.MountedFolders); var sources = FileSystem.MountedFolders; - dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 250, sources, setupItem); + dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 280, sources, setupItem); return true; } @@ -239,7 +247,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic var files = assetSource.AllFileNames(); foreach (var file in files) { - if (file.EndsWith(".shp")) + if (file.EndsWith(".shp", true, CultureInfo.InvariantCulture) || file.EndsWith(".r8", true, CultureInfo.InvariantCulture)) { AddAsset(assetList, file, template); availableShps.Add(file); diff --git a/mods/d2k/chrome/assetbrowser.yaml b/mods/d2k/chrome/assetbrowser.yaml index 65289f5767..2b7b238e20 100644 --- a/mods/d2k/chrome/assetbrowser.yaml +++ b/mods/d2k/chrome/assetbrowser.yaml @@ -42,6 +42,7 @@ Background@ASSETBROWSER_BG: Y:280 Width:140 Height:25 + Text:mouse.r8 Button@LOAD_BUTTON: X:40 Y:310 @@ -69,7 +70,7 @@ Background@ASSETBROWSER_BG: Y:4 Width:246 Height:246 - Image:DATA.R8 + Image:mouse.r8 Palette:colorpicker Label@ACTIONS_TITLE: X:PARENT_RIGHT - 150 diff --git a/mods/ra/chrome/assetbrowser.yaml b/mods/ra/chrome/assetbrowser.yaml index fb77ec748c..1539db03a9 100644 --- a/mods/ra/chrome/assetbrowser.yaml +++ b/mods/ra/chrome/assetbrowser.yaml @@ -42,6 +42,7 @@ Background@ASSETBROWSER_BG: Y:280 Width:140 Height:25 + Text: mouse.shp Button@LOAD_BUTTON: X:40 Y:310 From d9ac907315add85f324bd18d1b4dff3b1ee639ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 17 Nov 2013 17:22:20 +0100 Subject: [PATCH 4/7] abbreviate the user support folder as in mod.yaml --- OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs index f4681dd5ea..d1e473eafb 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs @@ -41,7 +41,8 @@ namespace OpenRA.Mods.RA.Widgets.Logic sourceDropdown.OnMouseDown = _ => ShowSourceDropdown(sourceDropdown); sourceDropdown.GetText = () => { - var name = assetSource != null ? assetSource.Name : "All Packages"; + var name = assetSource != null ? assetSource.Name.Replace(Platform.SupportDir, "^") : "All Packages"; + if (name.Length > 15) name = "..." + name.Substring(name.Length - 15); @@ -220,7 +221,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic var item = ScrollItemWidget.Setup(itemTemplate, () => assetSource == source, () => { assetSource = source; PopulateAssetList(); }); - item.Get("LABEL").GetText = () => source != null ? source.Name : "All Packages"; + item.Get("LABEL").GetText = () => source != null ? source.Name.Replace(Platform.SupportDir, "^") : "All Packages"; return item; }; From e981275cb1191fc83ff3abb5f80aeee39930d7f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 17 Nov 2013 20:20:45 +0100 Subject: [PATCH 5/7] added a palette chooser and colorpicker dropdown to the browser --- OpenRA.Mods.RA/PaletteFromFile.cs | 10 ++ .../Widgets/Logic/AssetBrowserLogic.cs | 108 +++++++++++++----- mods/d2k/chrome/assetbrowser.yaml | 23 +++- mods/ra/chrome/assetbrowser.yaml | 25 ++-- 4 files changed, 127 insertions(+), 39 deletions(-) diff --git a/OpenRA.Mods.RA/PaletteFromFile.cs b/OpenRA.Mods.RA/PaletteFromFile.cs index fc1642eda7..49694df320 100644 --- a/OpenRA.Mods.RA/PaletteFromFile.cs +++ b/OpenRA.Mods.RA/PaletteFromFile.cs @@ -44,5 +44,15 @@ namespace OpenRA.Mods.RA if (info.Tileset == null || info.Tileset.ToLowerInvariant() == world.Map.Tileset.ToLowerInvariant()) wr.AddPalette(info.Name, new Palette(FileSystem.Open(info.Filename), info.ShadowIndex), info.AllowModifiers); } + + public string Filename + { + get { return info.Filename; } + } + + public string Name + { + get { return info.Name; } + } } } diff --git a/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs index d1e473eafb..6039b3610d 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs @@ -14,6 +14,7 @@ using System.Globalization; using System.IO; using System.Linq; using OpenRA.FileFormats; +using OpenRA.Traits; using OpenRA.Widgets; namespace OpenRA.Mods.RA.Widgets.Logic @@ -22,7 +23,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic { Widget panel; - ShpImageWidget spriteImage; + ShpImageWidget spriteWidget; TextFieldWidget filenameInput; SliderWidget frameSlider; ButtonWidget playButton, pauseButton; @@ -32,6 +33,8 @@ namespace OpenRA.Mods.RA.Widgets.Logic IFolder assetSource = null; List availableShps = new List(); + PaletteFromFile currentPalette; + [ObjectCreator.UseCtor] public AssetBrowserLogic(Widget widget, Action onExit, World world) { @@ -51,46 +54,60 @@ namespace OpenRA.Mods.RA.Widgets.Logic assetSource = FileSystem.MountedFolders.First(); - spriteImage = panel.Get("SPRITE"); + spriteWidget = panel.Get("SPRITE"); + + currentPalette = world.WorldActor.TraitsImplementing().First(p => p.Name == spriteWidget.Palette); + + var paletteDropDown = panel.Get("PALETTE_SELECTOR"); + paletteDropDown.OnMouseDown = _ => ShowPaletteDropdown(paletteDropDown, world); + + var colorPreview = panel.Get("COLOR_MANAGER"); + colorPreview.Color = Game.Settings.Player.Color; + + var color = panel.Get("COLOR"); + color.IsDisabled = () => currentPalette.Name != colorPreview.Palette; + color.OnMouseDown = _ => ShowColorDropDown(color, colorPreview, world); + var block = panel.Get("COLORBLOCK"); + block.GetColor = () => Game.Settings.Player.Color.RGB; filenameInput = panel.Get("FILENAME_INPUT"); filenameInput.OnEnterKey = () => LoadAsset(filenameInput.Text); frameSlider = panel.Get("FRAME_SLIDER"); - frameSlider.MaximumValue = (float)spriteImage.FrameCount; - frameSlider.Ticks = spriteImage.FrameCount + 1; - frameSlider.IsVisible = () => spriteImage.FrameCount > 0; - frameSlider.OnChange += x => { spriteImage.Frame = (int)Math.Round(x); }; - frameSlider.GetValue = () => spriteImage.Frame; + frameSlider.MaximumValue = (float)spriteWidget.FrameCount; + frameSlider.Ticks = spriteWidget.FrameCount + 1; + frameSlider.IsVisible = () => spriteWidget.FrameCount > 0; + frameSlider.OnChange += x => { spriteWidget.Frame = (int)Math.Round(x); }; + frameSlider.GetValue = () => spriteWidget.Frame; - panel.Get("FRAME_COUNT").GetText = () => "{0}/{1}".F(spriteImage.Frame, spriteImage.FrameCount); + panel.Get("FRAME_COUNT").GetText = () => "{0}/{1}".F(spriteWidget.Frame, spriteWidget.FrameCount); playButton = panel.Get("BUTTON_PLAY"); playButton.OnClick = () => { - spriteImage.LoopAnimation = true; + spriteWidget.LoopAnimation = true; playButton.Visible = false; pauseButton.Visible = true; }; pauseButton = panel.Get("BUTTON_PAUSE"); pauseButton.OnClick = () => { - spriteImage.LoopAnimation = false; + spriteWidget.LoopAnimation = false; playButton.Visible = true; pauseButton.Visible = false; }; panel.Get("BUTTON_STOP").OnClick = () => { - spriteImage.LoopAnimation = false; + spriteWidget.LoopAnimation = false; frameSlider.Value = 0; - spriteImage.Frame = 0; + spriteWidget.Frame = 0; playButton.Visible = true; pauseButton.Visible = false; }; - panel.Get("BUTTON_NEXT").OnClick = () => { spriteImage.RenderNextFrame(); }; - panel.Get("BUTTON_PREV").OnClick = () => { spriteImage.RenderPreviousFrame(); }; + panel.Get("BUTTON_NEXT").OnClick = () => { spriteWidget.RenderNextFrame(); }; + panel.Get("BUTTON_PREV").OnClick = () => { spriteWidget.RenderPreviousFrame(); }; panel.Get("LOAD_BUTTON").OnClick = () => { @@ -101,21 +118,23 @@ namespace OpenRA.Mods.RA.Widgets.Logic template = panel.Get("ASSET_TEMPLATE"); PopulateAssetList(); - // TODO: Horrible hack var modID = Game.modData.Manifest.Mod.Id; - var palette = (modID == "d2k") ? "d2k.pal" : "egopal.pal"; + /* TODO: + * This should not invoke the OpenRA.Utility.exe, but use it's functions directly. + * Does not work with SHP(TS) yet?! + */ panel.Get("EXPORT_BUTTON").OnClick = () => { var ExtractGameFiles = new string[][] { - new string[] { "--extract", modID, palette, "--userdir" }, - new string[] { "--extract", modID, "{0}.shp".F(spriteImage.Image), "--userdir" }, + new string[] { "--extract", modID, currentPalette.Filename, "--userdir" }, + new string[] { "--extract", modID, "{0}.shp".F(spriteWidget.Image), "--userdir" }, }; var ExportToPng = new string[][] { - new string[] { "--png", Platform.SupportDir + "{0}.shp".F(spriteImage.Image), Platform.SupportDir + palette }, + new string[] { "--png", Platform.SupportDir + "{0}.shp".F(spriteWidget.Image), Platform.SupportDir + currentPalette.Filename }, }; var ImportFromPng = new string[][] { }; @@ -135,12 +154,12 @@ namespace OpenRA.Mods.RA.Widgets.Logic var ExtractGameFilesList = new List(); var ExportToPngList = new List(); - ExtractGameFilesList.Add(new string[] { "--extract", modID, palette, "--userdir" }); + ExtractGameFilesList.Add(new string[] { "--extract", modID, currentPalette.Filename, "--userdir" }); foreach (var shp in availableShps) { ExtractGameFilesList.Add(new string[] { "--extract", modID, shp, "--userdir" }); - ExportToPngList.Add(new string[] { "--png", Platform.SupportDir + shp, Platform.SupportDir + palette }); + ExportToPngList.Add(new string[] { "--png", Platform.SupportDir + shp, Platform.SupportDir + currentPalette.Filename }); Console.WriteLine(Platform.SupportDir + shp); } @@ -189,7 +208,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic var filename = Path.GetFileName(filepath); var sprite = r8 ? filename : Path.GetFileNameWithoutExtension(filepath); var item = ScrollItemWidget.Setup(template, - () => spriteImage.Image == sprite, + () => spriteWidget.Image == sprite, () => {filenameInput.Text = filename; LoadAsset(filename); }); item.Get("TITLE").GetText = () => filepath; @@ -207,10 +226,10 @@ namespace OpenRA.Mods.RA.Widgets.Logic var r8 = filename.EndsWith(".r8", true, CultureInfo.InvariantCulture); var sprite = r8 ? filename : Path.GetFileNameWithoutExtension(filename); - spriteImage.Frame = 0; - spriteImage.Image = sprite; - frameSlider.MaximumValue = (float)spriteImage.FrameCount; - frameSlider.Ticks = spriteImage.FrameCount + 1; + spriteWidget.Frame = 0; + spriteWidget.Image = sprite; + frameSlider.MaximumValue = (float)spriteWidget.FrameCount; + frameSlider.Ticks = spriteWidget.FrameCount + 1; return true; } @@ -255,5 +274,42 @@ namespace OpenRA.Mods.RA.Widgets.Logic } } } + + bool ShowPaletteDropdown(DropDownButtonWidget dropdown, World world) + { + Func setupItem = (palette, itemTemplate) => + { + var item = ScrollItemWidget.Setup(itemTemplate, + () => currentPalette.Name == palette.Name, + () => { currentPalette = palette; spriteWidget.Palette = currentPalette.Name; }); + item.Get("LABEL").GetText = () => palette.Name; + return item; + }; + + var palettes = world.WorldActor.TraitsImplementing(); + dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 280, palettes, setupItem); + return true; + } + + void ShowColorDropDown(DropDownButtonWidget color, ColorPreviewManagerWidget preview, World world) + { + Action onExit = () => + { + Game.Settings.Player.Color = preview.Color; + Game.Settings.Save(); + }; + + color.RemovePanel(); + + Action onChange = c => preview.Color = c; + + var colorChooser = Game.LoadWidget(world, "COLOR_CHOOSER", null, new WidgetArgs() + { + { "onChange", onChange }, + { "initialColor", Game.Settings.Player.Color } + }); + + color.AttachPanel(colorChooser, onExit); + } } } diff --git a/mods/d2k/chrome/assetbrowser.yaml b/mods/d2k/chrome/assetbrowser.yaml index 2b7b238e20..270cdec6cd 100644 --- a/mods/d2k/chrome/assetbrowser.yaml +++ b/mods/d2k/chrome/assetbrowser.yaml @@ -5,9 +5,10 @@ Background@ASSETBROWSER_BG: Width:700 Height:410 Children: + ColorPreviewManager@COLOR_MANAGER: Label@ASSETBROWSER_TITLE: X:0 - Y:20 + Y:10 Width:PARENT_RIGHT Height:25 Text:Game Asset Viewer & Converter @@ -51,13 +52,24 @@ Background@ASSETBROWSER_BG: Text:Load Font:Bold Key:return - Label@PREVIEW_TITLE: - X:320 + DropDownButton@PALETTE_SELECTOR: + X:230 Y:45 - Width:PARENT_RIGHT + Width:150 Height:25 - Text:Preview Font:Bold + Text:Palette + DropDownButton@COLOR: + X:380 + Y:45 + Width:80 + Height:25 + Children: + ColorBlock@COLORBLOCK: + X:5 + Y:6 + Width:PARENT_RIGHT-35 + Height:PARENT_BOTTOM-12 Background@SPRITE_BG: X:220 Y:80 @@ -71,7 +83,6 @@ Background@ASSETBROWSER_BG: Width:246 Height:246 Image:mouse.r8 - Palette:colorpicker Label@ACTIONS_TITLE: X:PARENT_RIGHT - 150 Y:45 diff --git a/mods/ra/chrome/assetbrowser.yaml b/mods/ra/chrome/assetbrowser.yaml index 1539db03a9..bf313b1c9b 100644 --- a/mods/ra/chrome/assetbrowser.yaml +++ b/mods/ra/chrome/assetbrowser.yaml @@ -5,9 +5,10 @@ Background@ASSETBROWSER_BG: Width:700 Height:410 Children: + ColorPreviewManager@COLOR_MANAGER: Label@ASSETBROWSER_TITLE: X:0 - Y:20 + Y:10 Width:PARENT_RIGHT Height:25 Text:Game Asset Viewer & Converter @@ -42,7 +43,7 @@ Background@ASSETBROWSER_BG: Y:280 Width:140 Height:25 - Text: mouse.shp + Text:mouse.shp Button@LOAD_BUTTON: X:40 Y:310 @@ -51,13 +52,24 @@ Background@ASSETBROWSER_BG: Text:Load Font:Bold Key:return - Label@PREVIEW_TITLE: - X:320 + DropDownButton@PALETTE_SELECTOR: + X:230 Y:45 - Width:PARENT_RIGHT + Width:150 Height:25 - Text:Preview Font:Bold + Text:Palette + DropDownButton@COLOR: + X:380 + Y:45 + Width:80 + Height:25 + Children: + ColorBlock@COLORBLOCK: + X:5 + Y:6 + Width:PARENT_RIGHT-35 + Height:PARENT_BOTTOM-12 Background@SPRITE_BG: X:220 Y:80 @@ -71,7 +83,6 @@ Background@ASSETBROWSER_BG: Width:246 Height:246 Image:mouse - Palette:colorpicker Label@ACTIONS_TITLE: X:PARENT_RIGHT - 150 Y:45 From dd848ddd1194e8c3c80b0f15622b5932ed0830ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 17 Nov 2013 22:43:59 +0100 Subject: [PATCH 6/7] PaulCop clean --- OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs index 6039b3610d..2c7adaaad3 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs @@ -120,10 +120,8 @@ namespace OpenRA.Mods.RA.Widgets.Logic var modID = Game.modData.Manifest.Mod.Id; - /* TODO: - * This should not invoke the OpenRA.Utility.exe, but use it's functions directly. - * Does not work with SHP(TS) yet?! - */ + // TODO: This should not invoke the OpenRA.Utility.exe, but use it's functions directly. + // TODO: Does not work with SHP(TS) yet?! panel.Get("EXPORT_BUTTON").OnClick = () => { var ExtractGameFiles = new string[][] @@ -245,7 +243,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic }; // TODO: Re-enable "All Packages" once list generation is done in a background thread - ///var sources = new[] { (IFolder)null }.Concat(FileSystem.MountedFolders); + // var sources = new[] { (IFolder)null }.Concat(FileSystem.MountedFolders); var sources = FileSystem.MountedFolders; dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 280, sources, setupItem); @@ -258,8 +256,8 @@ namespace OpenRA.Mods.RA.Widgets.Logic availableShps.Clear(); // TODO: This is too slow to run in the main thread - ///var files = AssetSource != null ? AssetSource.AllFileNames() : - /// FileSystem.MountedFolders.SelectMany(f => f.AllFileNames()); + // var files = AssetSource != null ? AssetSource.AllFileNames() : + // FileSystem.MountedFolders.SelectMany(f => f.AllFileNames()); if (assetSource == null) return; From d9148edc8df85a93891b35bdc0951753810ff036 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 17 Nov 2013 23:37:31 +0100 Subject: [PATCH 7/7] updated CHANGELOG --- CHANGELOG | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index cf0f4d2d48..00a6f34af3 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -13,6 +13,10 @@ NEW: Improved the ingame chat interface and input, with it defaulting to Team Chat. Redesigned the settings panel. Re-added move flashes. + Asset Browser: + Fixed crashes when trying to load invalid filenames or sprites with just 1 frame. + Added support for browsing the folders for R8 files. + Added palette chooser and colorpicker dropdown boxes. Red Alert: Added MAD Tank. Fixed a crash in Monster Tank Madness.