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