diff --git a/OpenRA.Mods.Common/Widgets/Logic/Editor/MapEditorLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Editor/MapEditorLogic.cs index d7b4eef2d0..a85fea9582 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Editor/MapEditorLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Editor/MapEditorLogic.cs @@ -11,26 +11,15 @@ using System.Linq; using OpenRA.Graphics; -using OpenRA.Mods.Common.Lint; using OpenRA.Mods.Common.Traits; using OpenRA.Widgets; namespace OpenRA.Mods.Common.Widgets.Logic { - [ChromeLogicArgsHotkeys("ChangeZoomKey")] public class MapEditorLogic : ChromeLogic { MapCopyFilters copyFilters = MapCopyFilters.All; - enum MapOverlays - { - None = 0, - Grid = 1, - Buildable = 2, - } - - MapOverlays overlays = MapOverlays.None; - [ObjectCreator.UseCtor] public MapEditorLogic(Widget widget, World world, WorldRenderer worldRenderer) { @@ -63,16 +52,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic }; } - var overlayDropdown = widget.GetOrNull("OVERLAY_BUTTON"); - if (overlayDropdown != null) - { - overlayDropdown.OnMouseDown = _ => - { - overlayDropdown.RemovePanel(); - overlayDropdown.AttachPanel(CreateOverlaysPanel(world)); - }; - } - var cashLabel = widget.GetOrNull("CASH_LABEL"); if (cashLabel != null) { @@ -112,45 +91,5 @@ namespace OpenRA.Mods.Common.Widgets.Logic return categoriesPanel; } - - Widget CreateOverlaysPanel(World world) - { - var categoriesPanel = Ui.LoadWidget("OVERLAY_PANEL", null, new WidgetArgs()); - var categoryTemplate = categoriesPanel.Get("CATEGORY_TEMPLATE"); - - MapOverlays[] allCategories = { MapOverlays.Grid, MapOverlays.Buildable }; - foreach (var cat in allCategories) - { - var category = (CheckboxWidget)categoryTemplate.Clone(); - category.GetText = () => cat.ToString(); - category.IsChecked = () => overlays.HasFlag(cat); - category.IsVisible = () => true; - category.OnClick = () => overlays ^= cat; - - if (cat.HasFlag(MapOverlays.Grid)) - { - var terrainGeometryTrait = world.WorldActor.Trait(); - category.OnClick = () => - { - overlays ^= cat; - terrainGeometryTrait.Enabled = overlays.HasFlag(MapOverlays.Grid); - }; - } - - if (cat.HasFlag(MapOverlays.Buildable)) - { - var buildableTerrainTrait = world.WorldActor.Trait(); - category.OnClick = () => - { - overlays ^= cat; - buildableTerrainTrait.Enabled = overlays.HasFlag(MapOverlays.Buildable); - }; - } - - categoriesPanel.AddChild(category); - } - - return categoriesPanel; - } } } diff --git a/OpenRA.Mods.Common/Widgets/Logic/Editor/MapOverlaysLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Editor/MapOverlaysLogic.cs new file mode 100644 index 0000000000..e45f344364 --- /dev/null +++ b/OpenRA.Mods.Common/Widgets/Logic/Editor/MapOverlaysLogic.cs @@ -0,0 +1,109 @@ +#region Copyright & License Information +/* + * Copyright 2007-2022 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.Collections.Generic; +using OpenRA.Mods.Common.Lint; +using OpenRA.Mods.Common.Traits; +using OpenRA.Widgets; + +namespace OpenRA.Mods.Common.Widgets.Logic +{ + [ChromeLogicArgsHotkeys("ToggleGridOverlayKey", "ToggleBuildableOverlayKey")] + public class MapOverlaysLogic : ChromeLogic + { + enum MapOverlays + { + None = 0, + Grid = 1, + Buildable = 2, + } + + readonly TerrainGeometryOverlay terrainGeometryTrait; + readonly BuildableTerrainOverlay buildableTerrainTrait; + + [ObjectCreator.UseCtor] + public MapOverlaysLogic(Widget widget, World world, ModData modData, Dictionary logicArgs) + { + terrainGeometryTrait = world.WorldActor.Trait(); + buildableTerrainTrait = world.WorldActor.Trait(); + + var toggleGridKey = new HotkeyReference(); + if (logicArgs.TryGetValue("ToggleGridOverlayKey", out var yaml)) + toggleGridKey = modData.Hotkeys[yaml.Value]; + + var toggleBuildableKey = new HotkeyReference(); + if (logicArgs.TryGetValue("ToggleBuildableOverlayKey", out yaml)) + toggleBuildableKey = modData.Hotkeys[yaml.Value]; + + var keyhandler = widget.Get("OVERLAY_KEYHANDLER"); + keyhandler.AddHandler(e => + { + if (e.Event != KeyInputEvent.Down) + return false; + + if (toggleGridKey.IsActivatedBy(e)) + { + terrainGeometryTrait.Enabled ^= true; + return true; + } + + if (toggleBuildableKey.IsActivatedBy(e)) + { + buildableTerrainTrait.Enabled ^= true; + return true; + } + + return false; + }); + + var overlayPanel = CreateOverlaysPanel(); + + var overlayDropdown = widget.GetOrNull("OVERLAY_BUTTON"); + if (overlayDropdown != null) + { + overlayDropdown.OnMouseDown = _ => + { + overlayDropdown.RemovePanel(); + overlayDropdown.AttachPanel(overlayPanel); + }; + } + } + + Widget CreateOverlaysPanel() + { + var categoriesPanel = Ui.LoadWidget("OVERLAY_PANEL", null, new WidgetArgs()); + var categoryTemplate = categoriesPanel.Get("CATEGORY_TEMPLATE"); + + MapOverlays[] allCategories = { MapOverlays.Grid, MapOverlays.Buildable }; + foreach (var cat in allCategories) + { + var category = (CheckboxWidget)categoryTemplate.Clone(); + category.GetText = () => cat.ToString(); + category.IsVisible = () => true; + + if (cat.HasFlag(MapOverlays.Grid)) + { + category.IsChecked = () => terrainGeometryTrait.Enabled; + category.OnClick = () => terrainGeometryTrait.Enabled ^= true; + } + else if (cat.HasFlag(MapOverlays.Buildable)) + { + category.IsChecked = () => buildableTerrainTrait.Enabled; + category.OnClick = () => buildableTerrainTrait.Enabled ^= true; + } + + categoriesPanel.AddChild(category); + } + + return categoriesPanel; + } + } +} diff --git a/mods/cnc/chrome/editor.yaml b/mods/cnc/chrome/editor.yaml index 5de03433a3..7e85a3df53 100644 --- a/mods/cnc/chrome/editor.yaml +++ b/mods/cnc/chrome/editor.yaml @@ -212,8 +212,11 @@ Container@EDITOR_ROOT: TooltipContainer@TOOLTIP_CONTAINER: Container@EDITOR_WORLD_ROOT: - Logic: LoadIngamePerfLogic, MapEditorLogic, ActorEditLogic + Logic: LoadIngamePerfLogic, MapEditorLogic, ActorEditLogic, MapOverlaysLogic + ToggleGridOverlayKey: EditorToggleGridOverlay + ToggleBuildableOverlayKey: EditorToggleBuildableOverlay Children: + LogicKeyListener@OVERLAY_KEYHANDLER: Container@PERF_ROOT: EditorViewportController@MAP_EDITOR: Width: WINDOW_RIGHT diff --git a/mods/common/chrome/editor.yaml b/mods/common/chrome/editor.yaml index 0d237f5c46..df6ee409c4 100644 --- a/mods/common/chrome/editor.yaml +++ b/mods/common/chrome/editor.yaml @@ -203,8 +203,11 @@ Container@EDITOR_ROOT: TooltipContainer@TOOLTIP_CONTAINER: Container@EDITOR_WORLD_ROOT: - Logic: LoadIngamePerfLogic, MapEditorLogic, ActorEditLogic + Logic: LoadIngamePerfLogic, MapEditorLogic, ActorEditLogic, MapOverlaysLogic + ToggleGridOverlayKey: EditorToggleGridOverlay + ToggleBuildableOverlayKey: EditorToggleBuildableOverlay Children: + LogicKeyListener@OVERLAY_KEYHANDLER: Container@PERF_ROOT: EditorViewportController@MAP_EDITOR: Width: WINDOW_RIGHT diff --git a/mods/common/hotkeys/editor.yaml b/mods/common/hotkeys/editor.yaml index f323e4b13e..ab43f911e9 100644 --- a/mods/common/hotkeys/editor.yaml +++ b/mods/common/hotkeys/editor.yaml @@ -39,3 +39,13 @@ EditorHistoryTab: Y Description: History Tab Types: Editor Contexts: Editor + +EditorToggleGridOverlay: F1 + Description: Grid Overlay + Types: Editor + Contexts: Editor + +EditorToggleBuildableOverlay: F2 + Description: Buildable Terrain Overlay + Types: Editor + Contexts: Editor