diff --git a/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs index 63e0b3170a..d55e524501 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs @@ -23,17 +23,15 @@ namespace OpenRA.Mods.RA.Widgets.Logic { Widget panel; - static ShpImageWidget spriteImage; - static TextFieldWidget filenameInput; - static SliderWidget frameSlider; - static ButtonWidget playButton, pauseButton; - static ScrollPanelWidget assetList; - static ScrollItemWidget template; + ShpImageWidget spriteImage; + TextFieldWidget filenameInput; + SliderWidget frameSlider; + ButtonWidget playButton, pauseButton; + ScrollPanelWidget assetList; + ScrollItemWidget template; - public enum SourceType { Folders, Packages } - public static SourceType AssetSource = SourceType.Folders; - - public static List AvailableShps = new List(); + IFolder AssetSource = null; + List AvailableShps = new List(); [ObjectCreator.UseCtor] public AssetBrowserLogic(Widget widget, Action onExit, World world) @@ -42,8 +40,16 @@ namespace OpenRA.Mods.RA.Widgets.Logic var sourceDropdown = panel.Get("SOURCE_SELECTOR"); sourceDropdown.OnMouseDown = _ => ShowSourceDropdown(sourceDropdown); - sourceDropdown.GetText = () => AssetSource == SourceType.Folders ? "Folders" - : AssetSource == SourceType.Packages ? "Packages" : "None"; + sourceDropdown.GetText = () => + { + var name = AssetSource != null ? AssetSource.Name : "All Packages"; + if (name.Length > 15) + name = "..."+name.Substring(name.Length - 15); + + return name; + }; + + AssetSource = FileSystem.MountedFolders.First(); spriteImage = panel.Get("SPRITE"); @@ -176,30 +182,22 @@ namespace OpenRA.Mods.RA.Widgets.Logic panel.Get("CLOSE_BUTTON").OnClick = () => { Ui.CloseWindow(); onExit(); }; } - static void AddAsset(ScrollPanelWidget list, string filepath, ScrollItemWidget template) + void AddAsset(ScrollPanelWidget list, string filepath, ScrollItemWidget template) { var sprite = Path.GetFileNameWithoutExtension(filepath); - var filename = Path.GetFileName(filepath); - var item = ScrollItemWidget.Setup(template, - () => spriteImage != null && spriteImage.Image == sprite, + () => spriteImage.Image == sprite, () => LoadAsset(sprite)); - item.Get("TITLE").GetText = () => filename; + item.Get("TITLE").GetText = () => filepath; list.AddChild(item); } - static bool LoadAsset(string sprite) + bool LoadAsset(string sprite) { if (sprite == null) return false; - if (!sprite.ToLower().Contains("r8")) - { - filenameInput.Text = sprite+".shp"; - sprite = Path.GetFileNameWithoutExtension(sprite); - } - spriteImage.Frame = 0; spriteImage.Image = sprite; frameSlider.MaximumValue = (float)spriteImage.FrameCount; @@ -207,67 +205,46 @@ namespace OpenRA.Mods.RA.Widgets.Logic return true; } - public static bool ShowSourceDropdown(DropDownButtonWidget dropdown) + bool ShowSourceDropdown(DropDownButtonWidget dropdown) { - var options = new Dictionary() - { - { "Folders", SourceType.Folders }, - { "Packages", SourceType.Packages }, - }; - - Func setupItem = (o, itemTemplate) => + Func setupItem = (source, itemTemplate) => { var item = ScrollItemWidget.Setup(itemTemplate, - () => AssetSource == options[o], - () => { AssetSource = options[o]; PopulateAssetList(); }); - item.Get("LABEL").GetText = () => o; + () => AssetSource == source, + () => { AssetSource = source; PopulateAssetList(); }); + item.Get("LABEL").GetText = () => source != null ? source.Name : "All Packages"; return item; }; - - dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, options.Keys, setupItem); + + // TODO: Re-enable "All Packages" once list generation is done in a background thread + //var sources = new[] { (IFolder)null }.Concat(FileSystem.MountedFolders); + + var sources = FileSystem.MountedFolders; + dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 250, sources, setupItem); return true; } - public static void PopulateAssetList() + void PopulateAssetList() { assetList.RemoveChildren(); AvailableShps.Clear(); - foreach (var folder in FileSystem.FolderPaths) + // TODO: This is too slow to run in the main thread + //var files = AssetSource != null ? AssetSource.AllFileNames() : + // FileSystem.MountedFolders.SelectMany(f => f.AllFileNames()); + + if (AssetSource == null) + return; + + var files = AssetSource.AllFileNames(); + foreach (var file in files) { - if (AssetSource == SourceType.Folders) + if (file.EndsWith(".shp")) { - if (Directory.Exists(folder)) - { - var shps = Directory.GetFiles(folder, "*.shp"); - foreach (var shp in shps) - { - AddAsset(assetList, shp, template); - AvailableShps.Add(Path.GetFileName(shp)); - } - } - } - else if (AssetSource == SourceType.Packages) - { - if (Directory.Exists(folder)) - { - var mixs = Directory.GetFiles(folder, "*.mix"); - foreach (var mix in mixs) - { - var package = new MixFile(mix, 0); - foreach (string hiddenFile in package.AllFileNames()) - { - if (hiddenFile.Contains("shp")) - { - AddAsset(assetList, hiddenFile, template); - AvailableShps.Add(hiddenFile); - } - } - } - } + AddAsset(assetList, file, template); + AvailableShps.Add(file); } } } - } }