diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj index 9ee83b1d88..b7640ad36e 100644 --- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj +++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj @@ -694,6 +694,7 @@ + diff --git a/OpenRA.Mods.Common/Widgets/Logic/Editor/ActorSelectorLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Editor/ActorSelectorLogic.cs index 664a25a7a9..cc71069fdb 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Editor/ActorSelectorLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Editor/ActorSelectorLogic.cs @@ -19,7 +19,7 @@ using OpenRA.Widgets; namespace OpenRA.Mods.Common.Widgets.Logic { - public class ActorSelectorLogic : ChromeLogic + public class ActorSelectorLogic : CommonSelectorLogic { class ActorSelectorActor { @@ -37,30 +37,21 @@ namespace OpenRA.Mods.Common.Widgets.Logic } } - readonly EditorViewportControllerWidget editor; readonly DropDownButtonWidget ownersDropDown; readonly ScrollPanelWidget panel; readonly ScrollItemWidget itemTemplate; readonly Ruleset mapRules; - readonly World world; - readonly WorldRenderer worldRenderer; - readonly string[] allCategories; - readonly HashSet selectedCategories = new HashSet(); - readonly List filteredCategories = new List(); readonly ActorSelectorActor[] allActors; PlayerReference selectedOwner; - string searchFilter; [ObjectCreator.UseCtor] public ActorSelectorLogic(Widget widget, World world, WorldRenderer worldRenderer) + : base(widget, world, worldRenderer) { mapRules = world.Map.Rules; - this.world = world; - this.worldRenderer = worldRenderer; - editor = widget.Parent.Get("MAP_EDITOR"); ownersDropDown = widget.Get("OWNERS_DROPDOWN"); panel = widget.Get("ACTORTEMPLATE_LIST"); @@ -130,7 +121,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic var tooltipText = (tooltip == null ? "Type: " : tooltip.Name + "\nType: ") + a.Name; allActorsTemp.Add(new ActorSelectorActor(a, editorData.Categories, searchTerms.ToArray(), tooltipText)); - } + } allActors = allActorsTemp.ToArray(); @@ -141,27 +132,27 @@ namespace OpenRA.Mods.Common.Widgets.Logic foreach (var c in allCategories) { - selectedCategories.Add(c); - filteredCategories.Add(c); + SelectedCategories.Add(c); + FilteredCategories.Add(c); } var searchTextField = widget.Get("SEARCH_TEXTFIELD"); searchTextField.OnTextEdited = () => { searchFilter = searchTextField.Text.Trim(); - filteredCategories.Clear(); + FilteredCategories.Clear(); if (!string.IsNullOrEmpty(searchFilter)) - filteredCategories.AddRange( + FilteredCategories.AddRange( allActors.Where(t => t.SearchTerms.Any( s => s.IndexOf(searchFilter, StringComparison.OrdinalIgnoreCase) >= 0)) .SelectMany(t => t.Categories) .Distinct() .OrderBy(x => x)); else - filteredCategories.AddRange(allCategories); + FilteredCategories.AddRange(allCategories); - InitializeActorPreviews(); + InitializePreviews(); }; searchTextField.OnEscKey = () => @@ -174,16 +165,16 @@ namespace OpenRA.Mods.Common.Widgets.Logic var actorCategorySelector = widget.Get("CATEGORIES_DROPDOWN"); actorCategorySelector.GetText = () => { - if (selectedCategories.Count == 0) + if (SelectedCategories.Count == 0) return "None"; if (!string.IsNullOrEmpty(searchFilter)) return "Search Results"; - if (selectedCategories.Count == 1) - return selectedCategories.First(); + if (SelectedCategories.Count == 1) + return SelectedCategories.First(); - if (selectedCategories.Count == allCategories.Length) + if (SelectedCategories.Count == allCategories.Length) return "All"; return "Multiple"; @@ -195,10 +186,10 @@ namespace OpenRA.Mods.Common.Widgets.Logic searchTextField.YieldKeyboardFocus(); actorCategorySelector.RemovePanel(); - actorCategorySelector.AttachPanel(CreateCategoriesPanel()); + actorCategorySelector.AttachPanel(CreateCategoriesPanel(panel)); }; - InitializeActorPreviews(); + InitializePreviews(); } void SelectOwner(PlayerReference option) @@ -206,67 +197,18 @@ namespace OpenRA.Mods.Common.Widgets.Logic selectedOwner = option; ownersDropDown.Text = option.Name; ownersDropDown.TextColor = option.Color.RGB; - InitializeActorPreviews(); + InitializePreviews(); } - Widget CreateCategoriesPanel() - { - var categoriesPanel = Ui.LoadWidget("ACTOR_CATEGORY_FILTER_PANEL", null, new WidgetArgs()); - var categoryTemplate = categoriesPanel.Get("CATEGORY_TEMPLATE"); - - var selectButtons = categoriesPanel.Get("SELECT_CATEGORIES_BUTTONS"); - categoriesPanel.AddChild(selectButtons); - - var selectAll = selectButtons.Get("SELECT_ALL"); - selectAll.OnClick = () => - { - selectedCategories.Clear(); - foreach (var c in allCategories) - selectedCategories.Add(c); - - InitializeActorPreviews(); - }; - - var selectNone = selectButtons.Get("SELECT_NONE"); - selectNone.OnClick = () => - { - selectedCategories.Clear(); - InitializeActorPreviews(); - }; - - var categoryHeight = 5 + selectButtons.Bounds.Height; - foreach (var cat in filteredCategories) - { - var category = (CheckboxWidget)categoryTemplate.Clone(); - category.GetText = () => cat; - category.IsChecked = () => selectedCategories.Contains(cat); - category.IsVisible = () => true; - category.OnClick = () => - { - if (!selectedCategories.Remove(cat)) - selectedCategories.Add(cat); - - InitializeActorPreviews(); - }; - - categoriesPanel.AddChild(category); - categoryHeight += categoryTemplate.Bounds.Height; - } - - categoriesPanel.Bounds.Height = Math.Min(categoryHeight, panel.Bounds.Height); - - return categoriesPanel; - } - - void InitializeActorPreviews() + protected override void InitializePreviews() { panel.RemoveChildren(); - if (!selectedCategories.Any()) + if (!SelectedCategories.Any()) return; foreach (var a in allActors) { - if (!selectedCategories.Overlaps(a.Categories)) + if (!SelectedCategories.Overlaps(a.Categories)) continue; if (!string.IsNullOrEmpty(searchFilter) && !a.SearchTerms.Any(s => s.IndexOf(searchFilter, StringComparison.OrdinalIgnoreCase) >= 0)) @@ -283,8 +225,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic try { var item = ScrollItemWidget.Setup(itemTemplate, - () => { var brush = editor.CurrentBrush as EditorActorBrush; return brush != null && brush.Actor == actor; }, - () => editor.SetBrush(new EditorActorBrush(editor, actor, selectedOwner, worldRenderer))); + () => { var brush = Editor.CurrentBrush as EditorActorBrush; return brush != null && brush.Actor == actor; }, + () => Editor.SetBrush(new EditorActorBrush(Editor, actor, selectedOwner, WorldRenderer))); var preview = item.Get("ACTOR_PREVIEW"); preview.SetPreview(actor, td); @@ -309,7 +251,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic catch { Log.Write("debug", "Map editor ignoring actor {0}, because of missing sprites for tileset {1}.", - actor.Name, world.Map.Rules.TileSet.Id); + actor.Name, World.Map.Rules.TileSet.Id); continue; } } diff --git a/OpenRA.Mods.Common/Widgets/Logic/Editor/CommonSelectorLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Editor/CommonSelectorLogic.cs new file mode 100644 index 0000000000..752762efcb --- /dev/null +++ b/OpenRA.Mods.Common/Widgets/Logic/Editor/CommonSelectorLogic.cs @@ -0,0 +1,91 @@ +#region Copyright & License Information +/* + * Copyright 2007-2017 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using OpenRA.Graphics; +using OpenRA.Widgets; + +namespace OpenRA.Mods.Common.Widgets.Logic +{ + public abstract class CommonSelectorLogic : ChromeLogic + { + protected readonly Widget Widget; + protected readonly World World; + protected readonly WorldRenderer WorldRenderer; + protected readonly EditorViewportControllerWidget Editor; + + protected readonly HashSet SelectedCategories = new HashSet(); + protected readonly List FilteredCategories = new List(); + + protected string[] allCategories; + protected string searchFilter; + + public CommonSelectorLogic(Widget widget, World world, WorldRenderer worldRenderer) + { + this.Widget = widget; + this.World = world; + this.WorldRenderer = worldRenderer; + Editor = widget.Parent.Get("MAP_EDITOR"); + } + + protected Widget CreateCategoriesPanel(ScrollPanelWidget panel) + { + var categoriesPanel = Ui.LoadWidget("ACTOR_CATEGORY_FILTER_PANEL", null, new WidgetArgs()); + var categoryTemplate = categoriesPanel.Get("CATEGORY_TEMPLATE"); + + var selectButtons = categoriesPanel.Get("SELECT_CATEGORIES_BUTTONS"); + categoriesPanel.AddChild(selectButtons); + + var selectAll = selectButtons.Get("SELECT_ALL"); + selectAll.OnClick = () => + { + SelectedCategories.Clear(); + foreach (var c in allCategories) + SelectedCategories.Add(c); + + InitializePreviews(); + }; + + var selectNone = selectButtons.Get("SELECT_NONE"); + selectNone.OnClick = () => + { + SelectedCategories.Clear(); + InitializePreviews(); + }; + + var categoryHeight = 5 + selectButtons.Bounds.Height; + foreach (var cat in FilteredCategories) + { + var category = (CheckboxWidget)categoryTemplate.Clone(); + category.GetText = () => cat; + category.IsChecked = () => SelectedCategories.Contains(cat); + category.IsVisible = () => true; + category.OnClick = () => + { + if (!SelectedCategories.Remove(cat)) + SelectedCategories.Add(cat); + + InitializePreviews(); + }; + + categoriesPanel.AddChild(category); + categoryHeight += categoryTemplate.Bounds.Height; + } + + categoriesPanel.Bounds.Height = Math.Min(categoryHeight, panel.Bounds.Height); + + return categoriesPanel; + } + + protected abstract void InitializePreviews(); + } +} diff --git a/OpenRA.Mods.Common/Widgets/Logic/Editor/TileSelectorLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Editor/TileSelectorLogic.cs index 32d46f8665..1b3f2bb25e 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Editor/TileSelectorLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Editor/TileSelectorLogic.cs @@ -16,7 +16,7 @@ using OpenRA.Widgets; namespace OpenRA.Mods.Common.Widgets.Logic { - public class TileSelectorLogic : ChromeLogic + public class TileSelectorLogic : CommonSelectorLogic { class TileSelectorTemplate { @@ -35,23 +35,19 @@ namespace OpenRA.Mods.Common.Widgets.Logic } readonly TileSet tileset; - readonly WorldRenderer worldRenderer; - readonly EditorViewportControllerWidget editor; readonly ScrollPanelWidget panel; readonly ScrollItemWidget itemTemplate; readonly TileSelectorTemplate[] allTemplates; string selectedCategory; string userSelectedCategory; - string searchFilter; [ObjectCreator.UseCtor] - public TileSelectorLogic(Widget widget, WorldRenderer worldRenderer) + public TileSelectorLogic(Widget widget, World world, WorldRenderer worldRenderer) : + base(widget, world, worldRenderer) { - tileset = worldRenderer.World.Map.Rules.TileSet; - this.worldRenderer = worldRenderer; + tileset = world.Map.Rules.TileSet; - editor = widget.Parent.Get("MAP_EDITOR"); panel = widget.Get("TILETEMPLATE_LIST"); itemTemplate = panel.Get("TILEPREVIEW_TEMPLATE"); panel.Layout = new GridLayout(panel); @@ -69,7 +65,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic searchFilter = searchTextField.Text.Trim(); selectedCategory = string.IsNullOrEmpty(searchFilter) ? userSelectedCategory : null; - InitializeTilePreview(); + InitializePreviews(); }; searchTextField.OnEscKey = () => @@ -88,7 +84,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic if (option != null) userSelectedCategory = option; - InitializeTilePreview(); + InitializePreviews(); }); var title = categoryTitle(option); @@ -120,7 +116,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic actorCategorySelector.GetText = () => categoryTitle(selectedCategory); selectedCategory = userSelectedCategory = orderedCategories.First(); - InitializeTilePreview(); + InitializePreviews(); } int CategoryOrder(string category) @@ -129,7 +125,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic return i >= 0 ? i : int.MaxValue; } - void InitializeTilePreview() + protected override void InitializePreviews() { panel.RemoveChildren(); @@ -143,13 +139,13 @@ namespace OpenRA.Mods.Common.Widgets.Logic var tileId = t.Template.Id; var item = ScrollItemWidget.Setup(itemTemplate, - () => { var brush = editor.CurrentBrush as EditorTileBrush; return brush != null && brush.Template == tileId; }, - () => editor.SetBrush(new EditorTileBrush(editor, tileId, worldRenderer))); + () => { var brush = Editor.CurrentBrush as EditorTileBrush; return brush != null && brush.Template == tileId; }, + () => Editor.SetBrush(new EditorTileBrush(Editor, tileId, WorldRenderer))); var preview = item.Get("TILE_PREVIEW"); var template = tileset.Templates[tileId]; - var grid = worldRenderer.World.Map.Grid; - var bounds = worldRenderer.Theater.TemplateBounds(template, grid.TileSize, grid.Type); + var grid = WorldRenderer.World.Map.Grid; + var bounds = WorldRenderer.Theater.TemplateBounds(template, grid.TileSize, grid.Type); // Scale templates to fit within the panel var scale = 1f;