Instant filtering by file name in the asset browser

This commit is contained in:
Pavlos Touboulidis
2014-07-04 16:33:26 +03:00
parent 3c502117a5
commit d1251d412f
3 changed files with 43 additions and 24 deletions

View File

@@ -101,7 +101,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
} }
filenameInput = panel.Get<TextFieldWidget>("FILENAME_INPUT"); filenameInput = panel.Get<TextFieldWidget>("FILENAME_INPUT");
filenameInput.OnEnterKey = () => LoadAsset(filenameInput.Text); filenameInput.OnTextEdited = () => ApplyFilter(filenameInput.Text);
var frameContainer = panel.GetOrNull("FRAME_SELECTOR"); var frameContainer = panel.GetOrNull("FRAME_SELECTOR");
if (frameContainer != null) if (frameContainer != null)
@@ -148,10 +148,6 @@ namespace OpenRA.Mods.RA.Widgets.Logic
if (prevButton != null) if (prevButton != null)
prevButton.OnClick = SelectPreviousFrame; 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();
@@ -175,13 +171,50 @@ namespace OpenRA.Mods.RA.Widgets.Logic
currentFrame = currentSprites.Length - 1; currentFrame = currentSprites.Length - 1;
} }
Dictionary<string, bool> assetVisByName = new Dictionary<string, bool>();
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) 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,
() => currentFilename == filename, () => currentFilename == filename,
() => { filenameInput.Text = filename; LoadAsset(filename); }); () => { LoadAsset(filename); });
item.Get<LabelWidget>("TITLE").GetText = () => filepath; item.Get<LabelWidget>("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); list.AddChild(item);
} }

View File

@@ -39,6 +39,7 @@ Container@ASSETBROWSER_PANEL:
Y: 65 Y: 65
Width: 160 Width: 160
Height: 275 Height: 275
CollapseHiddenChildren: True
Children: Children:
ScrollItem@ASSET_TEMPLATE: ScrollItem@ASSET_TEMPLATE:
Width: PARENT_RIGHT-27 Width: PARENT_RIGHT-27
@@ -58,20 +59,12 @@ Container@ASSETBROWSER_PANEL:
Height: 25 Height: 25
Font: TinyBold Font: TinyBold
Align: Center Align: Center
Text: Search for file Text: Filter by name
TextField@FILENAME_INPUT: TextField@FILENAME_INPUT:
X: 15 X: 15
Y: 365 Y: 365
Width: 160 Width: 160
Height: 25 Height: 25
Button@LOAD_BUTTON:
X: 15
Y: 395
Width: 160
Height: 25
Text: Load
Font: Bold
Key: return
Label@PALETTE_DESC: Label@PALETTE_DESC:
X: PARENT_RIGHT-WIDTH-270 X: PARENT_RIGHT-WIDTH-270
Y: 30 Y: 30

View File

@@ -34,6 +34,7 @@ Background@ASSETBROWSER_PANEL:
Y: 90 Y: 90
Width: 160 Width: 160
Height: 275 Height: 275
CollapseHiddenChildren: True
Children: Children:
ScrollItem@ASSET_TEMPLATE: ScrollItem@ASSET_TEMPLATE:
Width: PARENT_RIGHT-27 Width: PARENT_RIGHT-27
@@ -53,20 +54,12 @@ Background@ASSETBROWSER_PANEL:
Height: 25 Height: 25
Font: TinyBold Font: TinyBold
Align: Center Align: Center
Text: Search for file Text: Filter by name
TextField@FILENAME_INPUT: TextField@FILENAME_INPUT:
X: 20 X: 20
Y: 395 Y: 395
Width: 160 Width: 160
Height: 25 Height: 25
Button@LOAD_BUTTON:
X: 20
Y: 425
Width: 160
Height: 25
Text: Load
Font: Bold
Key: return
Label@PALETTE_DESC: Label@PALETTE_DESC:
X: PARENT_RIGHT-WIDTH-270 X: PARENT_RIGHT-WIDTH-270
Y: 60 Y: 60