Instant filtering by file name in the asset browser
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user