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.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<ButtonWidget>("LOAD_BUTTON");
if (loadButton != null)
loadButton.OnClick = () => LoadAsset(filenameInput.Text);
assetList = panel.Get<ScrollPanelWidget>("ASSET_LIST");
template = panel.Get<ScrollItemWidget>("ASSET_TEMPLATE");
PopulateAssetList();
@@ -175,13 +171,50 @@ namespace OpenRA.Mods.RA.Widgets.Logic
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)
{
var filename = Path.GetFileName(filepath);
var item = ScrollItemWidget.Setup(template,
() => currentFilename == filename,
() => { filenameInput.Text = filename; LoadAsset(filename); });
() => { LoadAsset(filename); });
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);
}