From d1251d412f54aa0f0b8208a4a41bfc131888533c Mon Sep 17 00:00:00 2001 From: Pavlos Touboulidis Date: Fri, 4 Jul 2014 16:33:26 +0300 Subject: [PATCH] Instant filtering by file name in the asset browser --- .../Widgets/Logic/AssetBrowserLogic.cs | 45 ++++++++++++++++--- mods/cnc/chrome/assetbrowser.yaml | 11 +---- mods/ra/chrome/assetbrowser.yaml | 11 +---- 3 files changed, 43 insertions(+), 24 deletions(-) diff --git a/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs index c7bff743e5..43e8812d98 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs @@ -101,7 +101,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic } filenameInput = panel.Get("FILENAME_INPUT"); - filenameInput.OnEnterKey = () => LoadAsset(filenameInput.Text); + filenameInput.OnTextEdited = () => ApplyFilter(filenameInput.Text); var frameContainer = panel.GetOrNull("FRAME_SELECTOR"); if (frameContainer != null) @@ -148,10 +148,6 @@ namespace OpenRA.Mods.RA.Widgets.Logic if (prevButton != null) prevButton.OnClick = SelectPreviousFrame; - var loadButton = panel.GetOrNull("LOAD_BUTTON"); - if (loadButton != null) - loadButton.OnClick = () => LoadAsset(filenameInput.Text); - assetList = panel.Get("ASSET_LIST"); template = panel.Get("ASSET_TEMPLATE"); PopulateAssetList(); @@ -175,13 +171,50 @@ namespace OpenRA.Mods.RA.Widgets.Logic currentFrame = currentSprites.Length - 1; } + Dictionary assetVisByName = new Dictionary(); + + bool FilterAsset(string filename) + { + var filter = filenameInput.Text; + + if (string.IsNullOrWhiteSpace(filter)) + return true; + + if (filename.IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0) + return true; + + return false; + } + + void ApplyFilter(string filename) + { + assetVisByName.Clear(); + assetList.Layout.AdjustChildren(); + assetList.ScrollToTop(); + + // Select the first visible + var firstVisible = assetVisByName.FirstOrDefault(kvp => kvp.Value); + if (firstVisible.Key != null) + LoadAsset(firstVisible.Key); + } + void AddAsset(ScrollPanelWidget list, string filepath, ScrollItemWidget template) { var filename = Path.GetFileName(filepath); var item = ScrollItemWidget.Setup(template, () => currentFilename == filename, - () => { filenameInput.Text = filename; LoadAsset(filename); }); + () => { LoadAsset(filename); }); item.Get("TITLE").GetText = () => filepath; + item.IsVisible = () => + { + bool visible; + if (assetVisByName.TryGetValue(filepath, out visible)) + return visible; + + visible = FilterAsset(filepath); + assetVisByName.Add(filepath, visible); + return visible; + }; list.AddChild(item); } diff --git a/mods/cnc/chrome/assetbrowser.yaml b/mods/cnc/chrome/assetbrowser.yaml index 9c0c974b03..07254566b5 100644 --- a/mods/cnc/chrome/assetbrowser.yaml +++ b/mods/cnc/chrome/assetbrowser.yaml @@ -39,6 +39,7 @@ Container@ASSETBROWSER_PANEL: Y: 65 Width: 160 Height: 275 + CollapseHiddenChildren: True Children: ScrollItem@ASSET_TEMPLATE: Width: PARENT_RIGHT-27 @@ -58,20 +59,12 @@ Container@ASSETBROWSER_PANEL: Height: 25 Font: TinyBold Align: Center - Text: Search for file + Text: Filter by name TextField@FILENAME_INPUT: X: 15 Y: 365 Width: 160 Height: 25 - Button@LOAD_BUTTON: - X: 15 - Y: 395 - Width: 160 - Height: 25 - Text: Load - Font: Bold - Key: return Label@PALETTE_DESC: X: PARENT_RIGHT-WIDTH-270 Y: 30 diff --git a/mods/ra/chrome/assetbrowser.yaml b/mods/ra/chrome/assetbrowser.yaml index 4a33a33277..bf6734f644 100644 --- a/mods/ra/chrome/assetbrowser.yaml +++ b/mods/ra/chrome/assetbrowser.yaml @@ -34,6 +34,7 @@ Background@ASSETBROWSER_PANEL: Y: 90 Width: 160 Height: 275 + CollapseHiddenChildren: True Children: ScrollItem@ASSET_TEMPLATE: Width: PARENT_RIGHT-27 @@ -53,20 +54,12 @@ Background@ASSETBROWSER_PANEL: Height: 25 Font: TinyBold Align: Center - Text: Search for file + Text: Filter by name TextField@FILENAME_INPUT: X: 20 Y: 395 Width: 160 Height: 25 - Button@LOAD_BUTTON: - X: 20 - Y: 425 - Width: 160 - Height: 25 - Text: Load - Font: Bold - Key: return Label@PALETTE_DESC: X: PARENT_RIGHT-WIDTH-270 Y: 60