Fix editor area/actor deselection bugs
This commit is contained in:
@@ -21,6 +21,9 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
{
|
||||
public class MapEditorSelectionLogic : ChromeLogic
|
||||
{
|
||||
[TranslationReference]
|
||||
const string AreaSelection = "label-area-selection";
|
||||
|
||||
readonly EditorViewportControllerWidget editor;
|
||||
readonly WorldRenderer worldRenderer;
|
||||
|
||||
@@ -31,27 +34,24 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
readonly CheckboxWidget copyResourcesCheckbox;
|
||||
readonly CheckboxWidget copyActorsCheckbox;
|
||||
readonly EditorActorLayer editorActorLayer;
|
||||
readonly EditorResourceLayer editorResourceLayer;
|
||||
readonly IResourceLayer resourceLayer;
|
||||
|
||||
public LabelWidget RegionLabel;
|
||||
public LabelWidget DimensionsLabel;
|
||||
public LabelWidget AreaEditTitle;
|
||||
public LabelWidget DiagonalLabel;
|
||||
public LabelWidget ResourceCounterLabel;
|
||||
|
||||
MapCopyFilters copyFilters = MapCopyFilters.All;
|
||||
EditorClipboard? clipboard;
|
||||
|
||||
readonly IResourceLayer resourceLayer;
|
||||
|
||||
readonly EditorResourceLayer editorResourceLayer;
|
||||
|
||||
[ObjectCreator.UseCtor]
|
||||
public MapEditorSelectionLogic(Widget widget, World world, WorldRenderer worldRenderer)
|
||||
{
|
||||
this.worldRenderer = worldRenderer;
|
||||
|
||||
editorActorLayer = world.WorldActor.Trait<EditorActorLayer>();
|
||||
resourceLayer = world.WorldActor.Trait<IResourceLayer>();
|
||||
editorResourceLayer = world.WorldActor.Trait<EditorResourceLayer>();
|
||||
resourceLayer = world.WorldActor.TraitOrDefault<IResourceLayer>();
|
||||
editorResourceLayer = world.WorldActor.TraitOrDefault<EditorResourceLayer>();
|
||||
|
||||
editor = widget.Get<EditorViewportControllerWidget>("MAP_EDITOR");
|
||||
editor.DefaultBrush.SelectionChanged += HandleSelectionChanged;
|
||||
@@ -59,8 +59,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
actorEditPanel = selectTabContainer.Get<ContainerWidget>("ACTOR_EDIT_PANEL");
|
||||
areaEditPanel = selectTabContainer.Get<ContainerWidget>("AREA_EDIT_PANEL");
|
||||
|
||||
actorEditPanel.IsVisible = () => editor.CurrentBrush == editor.DefaultBrush && editor.DefaultBrush.Selection.Actor != null;
|
||||
areaEditPanel.IsVisible = () => !actorEditPanel.IsVisible();
|
||||
actorEditPanel.IsVisible = () => editor.DefaultBrush.Selection.Actor != null;
|
||||
areaEditPanel.IsVisible = () => editor.DefaultBrush.Selection.Area != null;
|
||||
|
||||
copyTerrainCheckbox = areaEditPanel.Get<CheckboxWidget>("COPY_FILTER_TERRAIN_CHECKBOX");
|
||||
copyResourcesCheckbox = areaEditPanel.Get<CheckboxWidget>("COPY_FILTER_RESOURCES_CHECKBOX");
|
||||
@@ -74,8 +74,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
copyButton.OnClick = () => clipboard = CopySelectionContents();
|
||||
copyButton.IsDisabled = () => editor.DefaultBrush.Selection.Area == null;
|
||||
|
||||
RegionLabel = areaEditPanel.Get<LabelWidget>("REGION_COUNTER_LABEL");
|
||||
DimensionsLabel = areaEditPanel.Get<LabelWidget>("DIMENSION_COUNTER_LABEL");
|
||||
AreaEditTitle = areaEditPanel.Get<LabelWidget>("AREA_EDIT_TITLE");
|
||||
DiagonalLabel = areaEditPanel.Get<LabelWidget>("DIAGONAL_COUNTER_LABEL");
|
||||
ResourceCounterLabel = areaEditPanel.Get<LabelWidget>("RESOURCES_COUNTER_LABEL");
|
||||
|
||||
@@ -97,7 +96,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
pasteButton.IsHighlighted = () => editor.CurrentBrush is EditorCopyPasteBrush;
|
||||
|
||||
var closeAreaSelectionButton = areaEditPanel.Get<ButtonWidget>("SELECTION_CANCEL_BUTTON");
|
||||
closeAreaSelectionButton.OnClick = () => editor.DefaultBrush.ClearSelection();
|
||||
closeAreaSelectionButton.OnClick = () => editor.DefaultBrush.ClearSelection(updateSelectedTab: true);
|
||||
|
||||
CreateCategoryPanel(MapCopyFilters.Terrain, copyTerrainCheckbox);
|
||||
CreateCategoryPanel(MapCopyFilters.Resources, copyResourcesCheckbox);
|
||||
@@ -121,7 +120,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
if (!mapTiles.Contains(cell))
|
||||
continue;
|
||||
|
||||
tiles.Add(cell, new ClipboardTile(mapTiles[cell], mapResources[cell], resourceLayer.GetResource(cell), mapHeight[cell]));
|
||||
tiles.Add(cell, new ClipboardTile(mapTiles[cell], mapResources[cell], resourceLayer?.GetResource(cell), mapHeight[cell]));
|
||||
|
||||
if (copyFilters.HasFlag(MapCopyFilters.Actors))
|
||||
foreach (var preview in selection.SelectMany(editorActorLayer.PreviewsAt).Distinct())
|
||||
@@ -150,18 +149,22 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
var selectedRegion = editor.DefaultBrush.Selection.Area;
|
||||
if (selectedRegion == null)
|
||||
return;
|
||||
|
||||
if (editorResourceLayer == null)
|
||||
return;
|
||||
|
||||
var selectionSize = selectedRegion.BottomRight - selectedRegion.TopLeft + new CPos(1, 1);
|
||||
var diagonalLength = Math.Round(Math.Sqrt(Math.Pow(selectionSize.X, 2) + Math.Pow(selectionSize.Y, 2)), 3);
|
||||
var resourceValueInRegion = editorResourceLayer.CalculateRegionValue(selectedRegion);
|
||||
RegionLabel.GetText = () => $"{PositionAsString(selectedRegion.TopLeft)} : {PositionAsString(selectedRegion.BottomRight)}";
|
||||
DimensionsLabel.GetText = () => PositionAsString(selectionSize);
|
||||
|
||||
var areaSelectionLabel = $"{TranslationProvider.GetString(AreaSelection)} ({DimensionsAsString(selectionSize)}) {PositionAsString(selectedRegion.TopLeft)} : {PositionAsString(selectedRegion.BottomRight)}";
|
||||
|
||||
AreaEditTitle.GetText = () => areaSelectionLabel;
|
||||
DiagonalLabel.GetText = () => $"{diagonalLength}";
|
||||
ResourceCounterLabel.GetText = () => $"{resourceValueInRegion}$";
|
||||
ResourceCounterLabel.GetText = () => $"${resourceValueInRegion:N0}";
|
||||
}
|
||||
|
||||
static string PositionAsString(CPos cell)
|
||||
{
|
||||
return $"{cell.X},{cell.Y}";
|
||||
}
|
||||
static string PositionAsString(CPos cell) => $"{cell.X},{cell.Y}";
|
||||
static string DimensionsAsString(CPos cell) => $"{cell.X}x{cell.Y}";
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user