Clean up the AssetBrowser logic.

This commit is contained in:
Paul Chote
2014-04-01 22:19:54 +13:00
parent 1ea48b0167
commit bf0c7297e2
3 changed files with 125 additions and 75 deletions

View File

@@ -14,6 +14,7 @@ using System.Globalization;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using OpenRA.FileFormats; using OpenRA.FileFormats;
using OpenRA.Graphics;
using OpenRA.Traits; using OpenRA.Traits;
using OpenRA.Widgets; using OpenRA.Widgets;
@@ -23,17 +24,19 @@ namespace OpenRA.Mods.RA.Widgets.Logic
{ {
Widget panel; Widget panel;
ShpImageWidget spriteWidget;
TextFieldWidget filenameInput; TextFieldWidget filenameInput;
SliderWidget frameSlider; SliderWidget frameSlider;
ButtonWidget playButton, pauseButton;
ScrollPanelWidget assetList; ScrollPanelWidget assetList;
ScrollItemWidget template; ScrollItemWidget template;
IFolder assetSource = null; IFolder assetSource = null;
List<string> availableShps = new List<string>(); List<string> availableShps = new List<string>();
bool animateFrames = false;
PaletteFromFile currentPalette; string currentPalette;
string currentFilename;
Sprite[] currentSprites;
int currentFrame;
static readonly string[] AllowedExtensions = { ".shp", ".r8", "tmp", ".tem", ".des", ".sno", ".int" }; static readonly string[] AllowedExtensions = { ".shp", ".r8", "tmp", ".tem", ".des", ".sno", ".int" };
@@ -41,94 +44,139 @@ namespace OpenRA.Mods.RA.Widgets.Logic
public AssetBrowserLogic(Widget widget, Action onExit, World world) public AssetBrowserLogic(Widget widget, Action onExit, World world)
{ {
panel = widget; panel = widget;
assetSource = FileSystem.MountedFolders.First();
var sourceDropdown = panel.Get<DropDownButtonWidget>("SOURCE_SELECTOR"); var ticker = panel.GetOrNull<LogicTickerWidget>("ANIMATION_TICKER");
if (ticker != null)
{
ticker.OnTick = () =>
{
if (animateFrames)
SelectNextFrame();
};
}
var sourceDropdown = panel.GetOrNull<DropDownButtonWidget>("SOURCE_SELECTOR");
if (sourceDropdown != null)
{
sourceDropdown.OnMouseDown = _ => ShowSourceDropdown(sourceDropdown); sourceDropdown.OnMouseDown = _ => ShowSourceDropdown(sourceDropdown);
sourceDropdown.GetText = () => sourceDropdown.GetText = () =>
{ {
var name = assetSource != null ? assetSource.Name.Replace(Platform.SupportDir, "^") : "All Packages"; var name = assetSource != null ? assetSource.Name.Replace(Platform.SupportDir, "^") : "All Packages";
if (name.Length > 15) if (name.Length > 15)
name = "..." + name.Substring(name.Length - 15); name = "..." + name.Substring(name.Length - 15);
return name; return name;
}; };
}
assetSource = FileSystem.MountedFolders.First(); var spriteWidget = panel.GetOrNull<SpriteWidget>("SPRITE");
if (spriteWidget != null)
{
spriteWidget.GetSprite = () => currentSprites != null ? currentSprites[currentFrame] : null;
currentPalette = spriteWidget.Palette;
spriteWidget.GetPalette = () => currentPalette;
}
spriteWidget = panel.Get<ShpImageWidget>("SPRITE"); var paletteDropDown = panel.GetOrNull<DropDownButtonWidget>("PALETTE_SELECTOR");
if (paletteDropDown != null)
currentPalette = world.WorldActor.TraitsImplementing<PaletteFromFile>().First(p => p.Name == spriteWidget.Palette); {
var paletteDropDown = panel.Get<DropDownButtonWidget>("PALETTE_SELECTOR");
paletteDropDown.OnMouseDown = _ => ShowPaletteDropdown(paletteDropDown, world); paletteDropDown.OnMouseDown = _ => ShowPaletteDropdown(paletteDropDown, world);
paletteDropDown.GetText = () => currentPalette.Name; paletteDropDown.GetText = () => currentPalette;
}
var colorPreview = panel.Get<ColorPreviewManagerWidget>("COLOR_MANAGER"); var colorPreview = panel.GetOrNull<ColorPreviewManagerWidget>("COLOR_MANAGER");
if (colorPreview != null)
colorPreview.Color = Game.Settings.Player.Color; colorPreview.Color = Game.Settings.Player.Color;
var color = panel.Get<DropDownButtonWidget>("COLOR"); var colorDropdown = panel.GetOrNull<DropDownButtonWidget>("COLOR");
color.IsDisabled = () => currentPalette.Name != colorPreview.Palette; if (colorDropdown != null)
color.OnMouseDown = _ => ShowColorDropDown(color, colorPreview, world); {
var block = panel.Get<ColorBlockWidget>("COLORBLOCK"); colorDropdown.IsDisabled = () => currentPalette != colorPreview.Palette;
block.GetColor = () => Game.Settings.Player.Color.RGB; colorDropdown.OnMouseDown = _ => ShowColorDropDown(colorDropdown, colorPreview, world);
panel.Get<ColorBlockWidget>("COLORBLOCK").GetColor = () => Game.Settings.Player.Color.RGB;
}
filenameInput = panel.Get<TextFieldWidget>("FILENAME_INPUT"); filenameInput = panel.Get<TextFieldWidget>("FILENAME_INPUT");
filenameInput.OnEnterKey = () => LoadAsset(filenameInput.Text); filenameInput.OnEnterKey = () => LoadAsset(filenameInput.Text);
var frameContainer = panel.GetOrNull("FRAME_SELECTOR");
if (frameContainer != null)
frameContainer.IsVisible = () => currentSprites != null && currentSprites.Length > 1;
frameSlider = panel.Get<SliderWidget>("FRAME_SLIDER"); frameSlider = panel.Get<SliderWidget>("FRAME_SLIDER");
frameSlider.MaximumValue = (float)spriteWidget.FrameCount; frameSlider.OnChange += x => { currentFrame = (int)Math.Round(x); };
frameSlider.Ticks = spriteWidget.FrameCount + 1; frameSlider.GetValue = () => currentFrame;
frameSlider.IsVisible = () => spriteWidget.FrameCount > 0;
frameSlider.OnChange += x => { spriteWidget.Frame = (int)Math.Round(x); };
frameSlider.GetValue = () => spriteWidget.Frame;
panel.Get<LabelWidget>("FRAME_COUNT").GetText = () => "{0} / {1}".F(spriteWidget.Frame + 1, spriteWidget.FrameCount + 1); var frameText = panel.GetOrNull<LabelWidget>("FRAME_COUNT");
if (frameText != null)
frameText.GetText = () => "{0} / {1}".F(currentFrame + 1, currentSprites.Length);
playButton = panel.Get<ButtonWidget>("BUTTON_PLAY"); var playButton = panel.GetOrNull<ButtonWidget>("BUTTON_PLAY");
playButton.OnClick = () => if (playButton != null)
{ {
spriteWidget.LoopAnimation = true; playButton.OnClick = () => animateFrames = true;
playButton.Visible = false; playButton.IsVisible = () => !animateFrames;
pauseButton.Visible = true; }
};
pauseButton = panel.Get<ButtonWidget>("BUTTON_PAUSE");
pauseButton.OnClick = () =>
{
spriteWidget.LoopAnimation = false;
playButton.Visible = true;
pauseButton.Visible = false;
};
panel.Get<ButtonWidget>("BUTTON_STOP").OnClick = () => var pauseButton = panel.GetOrNull<ButtonWidget>("BUTTON_PAUSE");
if (pauseButton != null)
{
pauseButton.OnClick = () => animateFrames = false;
pauseButton.IsVisible = () => animateFrames;
}
var stopButton = panel.GetOrNull<ButtonWidget>("BUTTON_STOP");
if (stopButton != null)
{
stopButton.OnClick = () =>
{ {
spriteWidget.LoopAnimation = false;
frameSlider.Value = 0; frameSlider.Value = 0;
spriteWidget.Frame = 0; currentFrame = 0;
playButton.Visible = true; animateFrames = false;
pauseButton.Visible = false;
}; };
}
panel.Get<ButtonWidget>("BUTTON_NEXT").OnClick = () => { spriteWidget.RenderNextFrame(); }; var nextButton = panel.GetOrNull<ButtonWidget>("BUTTON_NEXT");
panel.Get<ButtonWidget>("BUTTON_PREV").OnClick = () => { spriteWidget.RenderPreviousFrame(); }; if (nextButton != null)
nextButton.OnClick = SelectNextFrame;
panel.Get<ButtonWidget>("LOAD_BUTTON").OnClick = () => var prevButton = panel.GetOrNull<ButtonWidget>("BUTTON_PREV");
{ if (prevButton != null)
LoadAsset(filenameInput.Text); prevButton.OnClick = SelectPreviousFrame;
};
var loadButton = panel.GetOrNull<ButtonWidget>("LOAD_BUTTON");
if (loadButton != null)
loadButton.OnClick = () => LoadAsset(filenameInput.Text);
assetList = panel.Get<ScrollPanelWidget>("ASSET_LIST"); assetList = panel.Get<ScrollPanelWidget>("ASSET_LIST");
template = panel.Get<ScrollItemWidget>("ASSET_TEMPLATE"); template = panel.Get<ScrollItemWidget>("ASSET_TEMPLATE");
PopulateAssetList(); PopulateAssetList();
panel.Get<ButtonWidget>("CLOSE_BUTTON").OnClick = () => { Ui.CloseWindow(); onExit(); }; var closeButton = panel.GetOrNull<ButtonWidget>("CLOSE_BUTTON");
if (closeButton != null)
closeButton.OnClick = () => { Ui.CloseWindow(); onExit(); };
}
void SelectNextFrame()
{
currentFrame++;
if (currentFrame >= currentSprites.Length)
currentFrame = 0;
}
void SelectPreviousFrame()
{
currentFrame--;
if (currentFrame < 0)
currentFrame = currentSprites.Length - 1;
} }
void AddAsset(ScrollPanelWidget list, string filepath, ScrollItemWidget template) void AddAsset(ScrollPanelWidget list, string filepath, ScrollItemWidget template)
{ {
var filename = Path.GetFileName(filepath); var filename = Path.GetFileName(filepath);
var item = ScrollItemWidget.Setup(template, var item = ScrollItemWidget.Setup(template,
() => spriteWidget.Image == filename, () => currentFilename == filename,
() => { filenameInput.Text = filename; LoadAsset(filename); }); () => { filenameInput.Text = filename; LoadAsset(filename); });
item.Get<LabelWidget>("TITLE").GetText = () => filepath; item.Get<LabelWidget>("TITLE").GetText = () => filepath;
@@ -143,10 +191,12 @@ namespace OpenRA.Mods.RA.Widgets.Logic
if (!FileSystem.Exists(filename)) if (!FileSystem.Exists(filename))
return false; return false;
spriteWidget.Frame = 0; currentFilename = filename;
spriteWidget.Image = filename; currentSprites = Game.modData.SpriteLoader.LoadAllSprites(filename);
frameSlider.MaximumValue = (float)spriteWidget.FrameCount; currentFrame = 0;
frameSlider.Ticks = spriteWidget.FrameCount + 1; frameSlider.MaximumValue = (float)currentSprites.Length - 1;
frameSlider.Ticks = currentSprites.Length;
return true; return true;
} }
@@ -196,10 +246,12 @@ namespace OpenRA.Mods.RA.Widgets.Logic
{ {
Func<PaletteFromFile, ScrollItemWidget, ScrollItemWidget> setupItem = (palette, itemTemplate) => Func<PaletteFromFile, ScrollItemWidget, ScrollItemWidget> setupItem = (palette, itemTemplate) =>
{ {
var name = palette.Name;
var item = ScrollItemWidget.Setup(itemTemplate, var item = ScrollItemWidget.Setup(itemTemplate,
() => currentPalette.Name == palette.Name, () => currentPalette == name,
() => { currentPalette = palette; spriteWidget.Palette = currentPalette.Name; }); () => currentPalette = name);
item.Get<LabelWidget>("LABEL").GetText = () => palette.Name; item.Get<LabelWidget>("LABEL").GetText = () => name;
return item; return item;
}; };

View File

@@ -5,6 +5,7 @@ Container@ASSETBROWSER_PANEL:
Width:695 Width:695
Height:435 Height:435
Children: Children:
LogicTicker@ANIMATION_TICKER:
ColorPreviewManager@COLOR_MANAGER: ColorPreviewManager@COLOR_MANAGER:
Label@ASSETBROWSER_TITLE: Label@ASSETBROWSER_TITLE:
Width:PARENT_RIGHT Width:PARENT_RIGHT
@@ -63,7 +64,6 @@ Container@ASSETBROWSER_PANEL:
Y:365 Y:365
Width:160 Width:160
Height:25 Height:25
Text:mouse2.shp
Button@LOAD_BUTTON: Button@LOAD_BUTTON:
X:15 X:15
Y:395 Y:395
@@ -104,10 +104,9 @@ Container@ASSETBROWSER_PANEL:
Height:325 Height:325
Background:scrollpanel-bg Background:scrollpanel-bg
Children: Children:
ShpImage@SPRITE: Sprite@SPRITE:
Width:PARENT_RIGHT Width:PARENT_RIGHT
Height:PARENT_BOTTOM Height:PARENT_BOTTOM
Image:mouse2
Container@FRAME_SELECTOR: Container@FRAME_SELECTOR:
X:190 X:190
Y:395 Y:395

View File

@@ -5,6 +5,7 @@ Background@ASSETBROWSER_PANEL:
Width:700 Width:700
Height:500 Height:500
Children: Children:
LogicTicker@ANIMATION_TICKER:
ColorPreviewManager@COLOR_MANAGER: ColorPreviewManager@COLOR_MANAGER:
Label@ASSETBROWSER_TITLE: Label@ASSETBROWSER_TITLE:
Y:20 Y:20
@@ -58,7 +59,6 @@ Background@ASSETBROWSER_PANEL:
Y:395 Y:395
Width:160 Width:160
Height:25 Height:25
Text:mouse.shp
Button@LOAD_BUTTON: Button@LOAD_BUTTON:
X:20 X:20
Y:425 Y:425
@@ -99,10 +99,9 @@ Background@ASSETBROWSER_PANEL:
Height:330 Height:330
Background:dialog3 Background:dialog3
Children: Children:
ShpImage@SPRITE: Sprite@SPRITE:
Width:PARENT_RIGHT Width:PARENT_RIGHT
Height:PARENT_BOTTOM Height:PARENT_BOTTOM
Image:mouse
Container@FRAME_SELECTOR: Container@FRAME_SELECTOR:
X:190 X:190
Y:425 Y:425