Map Editor - Tiles' filters multiple selection

This commit is contained in:
rob-v
2018-12-31 17:18:54 +01:00
committed by Paul Chote
parent f18d874524
commit 8c94f262b6
5 changed files with 83 additions and 126 deletions

View File

@@ -35,87 +35,44 @@ namespace OpenRA.Mods.Common.Widgets.Logic
}
readonly TileSet tileset;
readonly ScrollPanelWidget panel;
readonly ScrollItemWidget itemTemplate;
readonly TileSelectorTemplate[] allTemplates;
string selectedCategory;
string userSelectedCategory;
[ObjectCreator.UseCtor]
public TileSelectorLogic(Widget widget, World world, WorldRenderer worldRenderer) :
base(widget, world, worldRenderer)
public TileSelectorLogic(Widget widget, World world, WorldRenderer worldRenderer)
: base(widget, world, worldRenderer, "TILETEMPLATE_LIST", "TILEPREVIEW_TEMPLATE")
{
tileset = world.Map.Rules.TileSet;
panel = widget.Get<ScrollPanelWidget>("TILETEMPLATE_LIST");
itemTemplate = panel.Get<ScrollItemWidget>("TILEPREVIEW_TEMPLATE");
panel.Layout = new GridLayout(panel);
allTemplates = tileset.Templates.Values.Select(t => new TileSelectorTemplate(t)).ToArray();
var orderedCategories = allTemplates.SelectMany(t => t.Categories)
allCategories = allTemplates.SelectMany(t => t.Categories)
.Distinct()
.OrderBy(CategoryOrder)
.ToArray();
var searchTextField = widget.Get<TextFieldWidget>("SEARCH_TEXTFIELD");
searchTextField.OnTextEdited = () =>
foreach (var c in allCategories)
{
searchFilter = searchTextField.Text.Trim();
selectedCategory = string.IsNullOrEmpty(searchFilter) ? userSelectedCategory : null;
SelectedCategories.Add(c);
FilteredCategories.Add(c);
}
SearchTextField.OnTextEdited = () =>
{
searchFilter = SearchTextField.Text.Trim();
FilteredCategories.Clear();
if (!string.IsNullOrEmpty(searchFilter))
FilteredCategories.AddRange(
allTemplates.Where(t => t.SearchTerms.Any(
s => s.IndexOf(searchFilter, StringComparison.OrdinalIgnoreCase) >= 0))
.SelectMany(t => t.Categories)
.Distinct()
.OrderBy(CategoryOrder));
else
FilteredCategories.AddRange(allCategories);
InitializePreviews();
};
searchTextField.OnEscKey = () =>
{
searchTextField.Text = "";
searchTextField.YieldKeyboardFocus();
return true;
};
Func<string, string> categoryTitle = s => s != null ? s : "Search Results";
Func<string, ScrollItemWidget, ScrollItemWidget> setupItem = (option, template) =>
{
var item = ScrollItemWidget.Setup(template, () => selectedCategory == option, () =>
{
selectedCategory = option;
if (option != null)
userSelectedCategory = option;
InitializePreviews();
});
var title = categoryTitle(option);
item.Get<LabelWidget>("LABEL").GetText = () => title;
return item;
};
var tileCategorySelector = widget.Get<DropDownButtonWidget>("CATEGORIES_DROPDOWN");
tileCategorySelector.OnClick = () =>
{
if (searchTextField != null)
searchTextField.YieldKeyboardFocus();
var categories = orderedCategories.AsEnumerable();
if (!string.IsNullOrEmpty(searchFilter))
{
var filteredCategories = allTemplates.Where(t => t.SearchTerms.Any(
s => s.IndexOf(searchFilter, StringComparison.OrdinalIgnoreCase) >= 0))
.SelectMany(t => t.Categories)
.Distinct()
.OrderBy(CategoryOrder);
categories = new string[] { null }.Concat(filteredCategories);
}
tileCategorySelector.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 270, categories, setupItem);
};
var actorCategorySelector = widget.Get<DropDownButtonWidget>("CATEGORIES_DROPDOWN");
actorCategorySelector.GetText = () => categoryTitle(selectedCategory);
selectedCategory = userSelectedCategory = orderedCategories.First();
InitializePreviews();
}
@@ -127,18 +84,20 @@ namespace OpenRA.Mods.Common.Widgets.Logic
protected override void InitializePreviews()
{
panel.RemoveChildren();
Panel.RemoveChildren();
if (!SelectedCategories.Any())
return;
foreach (var t in allTemplates)
{
if (selectedCategory != null && !t.Categories.Contains(selectedCategory))
if (!SelectedCategories.Overlaps(t.Categories))
continue;
if (!string.IsNullOrEmpty(searchFilter) && !t.SearchTerms.Any(s => s.IndexOf(searchFilter, StringComparison.OrdinalIgnoreCase) >= 0))
continue;
var tileId = t.Template.Id;
var item = ScrollItemWidget.Setup(itemTemplate,
var item = ScrollItemWidget.Setup(ItemTemplate,
() => { var brush = Editor.CurrentBrush as EditorTileBrush; return brush != null && brush.Template == tileId; },
() => Editor.SetBrush(new EditorTileBrush(Editor, tileId, WorldRenderer)));
@@ -149,7 +108,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
// Scale templates to fit within the panel
var scale = 1f;
while (scale * bounds.Width > itemTemplate.Bounds.Width)
while (scale * bounds.Width > ItemTemplate.Bounds.Width)
scale /= 2;
preview.Template = template;
@@ -162,7 +121,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
item.IsVisible = () => true;
item.GetTooltipText = () => t.Tooltip;
panel.AddChild(item);
Panel.AddChild(item);
}
}
}