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;