diff --git a/OpenRA.Mods.Common/Traits/World/ClearMapGenerator.cs b/OpenRA.Mods.Common/Traits/World/ClearMapGenerator.cs index b0e59228cc..c31b7cc8c9 100644 --- a/OpenRA.Mods.Common/Traits/World/ClearMapGenerator.cs +++ b/OpenRA.Mods.Common/Traits/World/ClearMapGenerator.cs @@ -21,22 +21,25 @@ namespace OpenRA.Mods.Common.Traits { [TraitLocation(SystemActors.EditorWorld)] [Desc("A map generator that clears a map.")] - public sealed class ClearMapGeneratorInfo : TraitInfo, IMapGeneratorInfo + public sealed class ClearMapGeneratorInfo : TraitInfo, IMapGeneratorInfo, IEditorToolInfo { [FieldLoader.Require] [Desc("Human-readable name this generator uses.")] [FluentReference] public readonly string Name = null; + [FieldLoader.Require] + [Desc("Internal id for this map generator.")] + public readonly string Type = null; + + [Desc("The widget tree to open when the tool is selected.")] + public readonly string PanelWidget = "MAP_GENERATOR_TOOL_PANEL"; + // This is purely of interest to the linter. [FieldLoader.LoadUsing(nameof(FluentReferencesLoader))] [FluentReference] public readonly List FluentReferences = null; - [FieldLoader.Require] - [Desc("Internal id for this map generator.")] - public readonly string Type = null; - [FieldLoader.LoadUsing(nameof(SettingsLoader))] public readonly MiniYaml Settings; @@ -98,6 +101,9 @@ namespace OpenRA.Mods.Common.Traits map.PlayerDefinitions = new MapPlayers(map.Rules, 0).ToMiniYaml(); map.ActorDefinitions = []; } + + string IEditorToolInfo.Label => Name; + string IEditorToolInfo.PanelWidget => PanelWidget; } public class ClearMapGenerator { /* we're only interested in the Info */ } diff --git a/OpenRA.Mods.Common/Traits/World/ExperimentalMapGenerator.cs b/OpenRA.Mods.Common/Traits/World/ExperimentalMapGenerator.cs index dd275f9e09..cc97c8f4fb 100644 --- a/OpenRA.Mods.Common/Traits/World/ExperimentalMapGenerator.cs +++ b/OpenRA.Mods.Common/Traits/World/ExperimentalMapGenerator.cs @@ -23,7 +23,7 @@ using static OpenRA.Mods.Common.Traits.ResourceLayerInfo; namespace OpenRA.Mods.Common.Traits { [TraitLocation(SystemActors.EditorWorld)] - public sealed class ExperimentalMapGeneratorInfo : TraitInfo, IMapGeneratorInfo + public sealed class ExperimentalMapGeneratorInfo : TraitInfo, IMapGeneratorInfo, IEditorToolInfo { [FieldLoader.Require] public readonly string Type = null; @@ -32,6 +32,9 @@ namespace OpenRA.Mods.Common.Traits [FluentReference] public readonly string Name = null; + [Desc("The widget tree to open when the tool is selected.")] + public readonly string PanelWidget = "MAP_GENERATOR_TOOL_PANEL"; + // This is purely of interest to the linter. [FieldLoader.LoadUsing(nameof(FluentReferencesLoader))] [FluentReference] @@ -1821,6 +1824,9 @@ namespace OpenRA.Mods.Common.Traits amplitude = Exts.ISqrt(amplitude); return amplitude; } + + string IEditorToolInfo.Label => Name; + string IEditorToolInfo.PanelWidget => PanelWidget; } public class ExperimentalMapGenerator { /* we're only interested in the Info */ } diff --git a/OpenRA.Mods.Common/Traits/World/MarkerLayerOverlay.cs b/OpenRA.Mods.Common/Traits/World/MarkerLayerOverlay.cs index 88bb6fee66..69f16a293a 100644 --- a/OpenRA.Mods.Common/Traits/World/MarkerLayerOverlay.cs +++ b/OpenRA.Mods.Common/Traits/World/MarkerLayerOverlay.cs @@ -22,8 +22,15 @@ using Color = OpenRA.Primitives.Color; namespace OpenRA.Mods.Common.Traits { [TraitLocation(SystemActors.EditorWorld)] - public class MarkerLayerOverlayInfo : TraitInfo + public class MarkerLayerOverlayInfo : TraitInfo, IEditorToolInfo { + [FluentReference] + [Desc("The label to show in the tools menu.")] + public readonly string Label = "label-tool-marker-tiles"; + + [Desc("The widget tree to open when the tool is selected.")] + public readonly string PanelWidget = "MARKER_TOOL_PANEL"; + [Desc("A list of colors to be used for drawing.")] public readonly Color[] Colors = [ @@ -47,6 +54,9 @@ namespace OpenRA.Mods.Common.Traits { return new MarkerLayerOverlay(init.Self, this); } + + string IEditorToolInfo.Label => Label; + string IEditorToolInfo.PanelWidget => PanelWidget; } public class MarkerLayerOverlay : IRenderAnnotations, INotifyActorDisposing, IWorldLoaded diff --git a/OpenRA.Mods.Common/TraitsInterfaces.cs b/OpenRA.Mods.Common/TraitsInterfaces.cs index 7c0f10ebc3..506fa3c95f 100644 --- a/OpenRA.Mods.Common/TraitsInterfaces.cs +++ b/OpenRA.Mods.Common/TraitsInterfaces.cs @@ -961,6 +961,12 @@ namespace OpenRA.Mods.Common.Traits bool PathMightExistForLocomotorBlockedByImmovable(Locomotor locomotor, CPos source, CPos target); } + public interface IEditorToolInfo : ITraitInfoInterface + { + string Label { get; } + string PanelWidget { get; } + } + public class MapGenerationException : Exception { public MapGenerationException(string message) diff --git a/OpenRA.Mods.Common/Widgets/Logic/Editor/MapEditorTabsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Editor/MapEditorTabsLogic.cs index b31517d072..30b7a9fb5c 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Editor/MapEditorTabsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Editor/MapEditorTabsLogic.cs @@ -9,6 +9,7 @@ */ #endregion +using OpenRA.Mods.Common.Traits; using OpenRA.Widgets; namespace OpenRA.Mods.Common.Widgets.Logic @@ -17,6 +18,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic { enum MenuType { Select, Tiles, Layers, Actors, Tools, History } + readonly World world; readonly Widget panelContainer; readonly Widget tabContainer; readonly EditorViewportControllerWidget editor; @@ -25,8 +27,9 @@ namespace OpenRA.Mods.Common.Widgets.Logic MenuType lastSelectedTab = MenuType.Tiles; [ObjectCreator.UseCtor] - public MapEditorTabsLogic(Widget widget) + public MapEditorTabsLogic(Widget widget, World world) { + this.world = world; panelContainer = widget.Parent; tabContainer = widget.Get("MAP_EDITOR_TAB_CONTAINER"); @@ -67,6 +70,12 @@ namespace OpenRA.Mods.Common.Widgets.Logic if (tabType == MenuType.Select) tab.IsDisabled = () => !editor.DefaultBrush.Selection.HasSelection; + if (tabType == MenuType.Tools) + { + var toolsAvailable = world.Map.Rules.Actors[SystemActors.EditorWorld].HasTraitInfo(); + tab.IsDisabled = () => !toolsAvailable; + } + var container = panelContainer.Get(tabId); container.IsVisible = () => menuType == tabType; } diff --git a/OpenRA.Mods.Common/Widgets/Logic/Editor/MapGeneratorToolLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Editor/MapGeneratorToolLogic.cs index d479e20144..ecb5b8d4b3 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Editor/MapGeneratorToolLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Editor/MapGeneratorToolLogic.cs @@ -35,10 +35,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic readonly World world; readonly WorldRenderer worldRenderer; readonly ModData modData; - - // nullable - IMapGeneratorInfo selectedGenerator; - IMapGeneratorSettings selectedSettings; + readonly IMapGeneratorInfo generator; + readonly IMapGeneratorSettings settings; readonly ScrollPanelWidget settingsPanel; readonly Widget checkboxSettingTemplate; @@ -46,13 +44,16 @@ namespace OpenRA.Mods.Common.Widgets.Logic readonly Widget dropDownSettingTemplate; [ObjectCreator.UseCtor] - public MapGeneratorToolLogic(Widget widget, World world, WorldRenderer worldRenderer, ModData modData) + public MapGeneratorToolLogic(Widget widget, World world, WorldRenderer worldRenderer, ModData modData, + IMapGeneratorInfo tool) { editorActionManager = world.WorldActor.Trait(); this.world = world; this.worldRenderer = worldRenderer; this.modData = modData; + generator = tool; + settings = generator.GetSettings(); settingsPanel = widget.Get("SETTINGS_PANEL"); checkboxSettingTemplate = settingsPanel.Get("CHECKBOX_TEMPLATE"); @@ -65,40 +66,12 @@ namespace OpenRA.Mods.Common.Widgets.Logic var generateRandomButtonWidget = widget.Get("GENERATE_RANDOM_BUTTON"); generateRandomButtonWidget.OnClick = () => { - selectedSettings?.Randomize(world.LocalRandom); + settings?.Randomize(world.LocalRandom); UpdateSettingsUi(); GenerateMap(); }; - var generatorDropDown = widget.Get("GENERATOR"); - var mapGenerators = world.Map.Rules.Actors[SystemActors.EditorWorld].TraitInfos(); - if (mapGenerators.Count > 0) - { - var label = new CachedTransform(g => FluentProvider.GetMessage(g.Name)); - generatorDropDown.GetText = () => label.Update(selectedGenerator); - generatorDropDown.OnMouseDown = _ => - { - ScrollItemWidget SetupItem(IMapGeneratorInfo g, ScrollItemWidget template) - { - bool IsSelected() => g.Type == selectedGenerator.Type; - void OnClick() => ChangeGenerator(g); - var item = ScrollItemWidget.Setup(template, IsSelected, OnClick); - var label = FluentProvider.GetMessage(g.Name); - item.Get("LABEL").GetText = () => label; - return item; - } - - generatorDropDown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", mapGenerators.Count * 30, mapGenerators, SetupItem); - }; - } - else - { - generateButtonWidget.IsDisabled = () => true; - generateRandomButtonWidget.IsDisabled = () => true; - generatorDropDown.IsDisabled = () => true; - } - - ChangeGenerator(mapGenerators.FirstOrDefault()); + UpdateSettingsUi(); } sealed class RandomMapEditorAction : IEditorAction @@ -130,23 +103,14 @@ namespace OpenRA.Mods.Common.Widgets.Logic } } - // newGenerator may be null. - void ChangeGenerator(IMapGeneratorInfo newGenerator) - { - selectedGenerator = newGenerator; - selectedSettings = newGenerator?.GetSettings(); - - UpdateSettingsUi(); - } - void UpdateSettingsUi() { settingsPanel.RemoveChildren(); settingsPanel.ContentHeight = 0; - if (selectedGenerator == null) + if (generator == null) return; - foreach (var o in selectedSettings.Options) + foreach (var o in settings.Options) { Widget settingWidget = null; switch (o) @@ -296,12 +260,12 @@ namespace OpenRA.Mods.Common.Widgets.Logic var bounds = map.Bounds; generatedMap.SetBounds(new PPos(bounds.Left, bounds.Top), new PPos(bounds.Right - 1, bounds.Bottom - 1)); - var settings = selectedSettings.Compile(terrainInfo); + var settings = this.settings.Compile(terrainInfo); // Run main generator logic. May throw. var generateStopwatch = Stopwatch.StartNew(); - Log.Write("debug", $"Running '{selectedGenerator.Type}' map generator with settings:\n{MiniYamlExts.WriteToString(settings.Nodes)}\n\n"); - selectedGenerator.Generate(generatedMap, settings); + Log.Write("debug", $"Running '{generator.Type}' map generator with settings:\n{MiniYamlExts.WriteToString(settings.Nodes)}\n\n"); + generator.Generate(generatedMap, settings); Log.Write("debug", $"Generator finished, taking {generateStopwatch.ElapsedMilliseconds}ms"); var editorActorLayer = world.WorldActor.Trait(); @@ -347,7 +311,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic false); var description = FluentProvider.GetMessage(StrGenerated, - "name", FluentProvider.GetMessage(selectedGenerator.Name)); + "name", FluentProvider.GetMessage(generator.Name)); var action = new RandomMapEditorAction(editorBlit, description); editorActionManager.Add(action); } diff --git a/OpenRA.Mods.Common/Widgets/Logic/Editor/MapToolsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Editor/MapToolsLogic.cs index 158eb76d31..c5eabb4189 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Editor/MapToolsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Editor/MapToolsLogic.cs @@ -10,7 +10,7 @@ #endregion using System.Collections.Generic; -using OpenRA.Graphics; +using System.Linq; using OpenRA.Mods.Common.Traits; using OpenRA.Widgets; @@ -18,77 +18,53 @@ namespace OpenRA.Mods.Common.Widgets.Logic { public class MapToolsLogic : ChromeLogic { - [FluentReference] - const string MarkerTiles = "label-tool-marker-tiles"; - [FluentReference] - const string MapGenerator = "label-tool-map-generator"; - - enum MapTool - { - MarkerTiles, - MapGenerator - } - - readonly DropDownButtonWidget toolsDropdown; - readonly Dictionary toolNames = new() - { - { MapTool.MarkerTiles, MarkerTiles }, - { MapTool.MapGenerator, MapGenerator } - }; - - readonly Dictionary toolPanels = []; - - MapTool selectedTool = MapTool.MarkerTiles; + readonly List toolPanels = []; + readonly Dictionary toolLabels = []; + Widget selectedPanel; [ObjectCreator.UseCtor] - public MapToolsLogic(Widget widget, World world, ModData modData, WorldRenderer worldRenderer, Dictionary logicArgs) + public MapToolsLogic(Widget widget, World world) { - toolsDropdown = widget.Get("TOOLS_DROPDOWN"); - - var markerToolPanel = widget.Get("MARKER_TOOL_PANEL"); - toolPanels.Add(MapTool.MarkerTiles, markerToolPanel); - if (world.Map.Rules.Actors[SystemActors.EditorWorld].HasTraitInfo()) + var toolDropdownWidget = widget.Get("TOOLS_DROPDOWN"); + var tools = world.Map.Rules.Actors[SystemActors.EditorWorld].TraitInfos(); + foreach (var tool in tools) { - var mapGeneratorToolPanel = widget.GetOrNull("MAP_GENERATOR_TOOL_PANEL"); - if (mapGeneratorToolPanel != null) - toolPanels.Add(MapTool.MapGenerator, mapGeneratorToolPanel); + var panel = Game.LoadWidget(world, tool.PanelWidget, widget, new WidgetArgs() { { "tool", tool } }); + toolPanels.Add(panel); + toolLabels.Add(panel, FluentProvider.GetMessage(tool.Label)); } - toolsDropdown.OnMouseDown = _ => ShowToolsDropDown(toolsDropdown); - toolsDropdown.GetText = () => FluentProvider.GetMessage(toolNames[selectedTool]); - if (toolPanels.Count <= 1) - toolsDropdown.Disabled = true; + SelectTool(toolPanels.FirstOrDefault()); + toolDropdownWidget.OnMouseDown = _ => ShowToolsDropDown(toolDropdownWidget); + toolDropdownWidget.GetText = () => toolLabels[selectedPanel]; + if (toolPanels.Count == 1) + toolDropdownWidget.Disabled = true; } void ShowToolsDropDown(DropDownButtonWidget dropdown) { - ScrollItemWidget SetupItem(MapTool tool, ScrollItemWidget itemTemplate) + ScrollItemWidget SetupItem(Widget panel, ScrollItemWidget itemTemplate) { var item = ScrollItemWidget.Setup(itemTemplate, - () => selectedTool == tool, - () => SelectTool(tool)); + () => selectedPanel == panel, + () => SelectTool(panel)); - item.Get("LABEL").GetText = () => FluentProvider.GetMessage(toolNames[tool]); + item.Get("LABEL").GetText = () => toolLabels[panel]; return item; } - var options = new[] { MapTool.MarkerTiles, MapTool.MapGenerator }; - dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 150, options, SetupItem); + dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 150, toolPanels, SetupItem); } - void SelectTool(MapTool tool) + void SelectTool(Widget panel) { - if (tool != selectedTool) - { - var currentToolPanel = toolPanels[selectedTool]; - currentToolPanel.Visible = false; - } + if (panel != selectedPanel && selectedPanel != null) + selectedPanel.Visible = false; - selectedTool = tool; - - var toolPanel = toolPanels[selectedTool]; - toolPanel.Visible = true; + selectedPanel = panel; + if (panel != null) + selectedPanel.Visible = true; } } } diff --git a/mods/cnc/chrome/editor.yaml b/mods/cnc/chrome/editor.yaml index 5752f04925..0251190b21 100644 --- a/mods/cnc/chrome/editor.yaml +++ b/mods/cnc/chrome/editor.yaml @@ -447,218 +447,6 @@ Container@EDITOR_WORLD_ROOT: Width: PARENT_WIDTH - 60 Height: 25 Font: Bold - Background@MARKER_TOOL_PANEL: - Y: 25 - Width: PARENT_WIDTH - Height: PARENT_HEIGHT - 25 - Background: scrollpanel-bg - Logic: MapMarkerTilesLogic - Children: - ScrollPanel@TILE_COLOR_PANEL: - X: 6 - Y: 6 - Width: PARENT_WIDTH - 19 - Height: 31 - TopBottomSpacing: 1 - ItemSpacing: 1 - ScrollBar: Hidden - ScrollbarWidth: 0 - ContentHeight: 31 - Children: - ScrollItem@TILE_COLOR_TEMPLATE: - Visible: false - Height: 29 - Width: 29 - IgnoreChildMouseOver: true - Children: - ColorBlock@TILE_PREVIEW: - X: 2 - Y: 2 - Width: 26 - Height: 26 - ScrollItem@TILE_ICON_TEMPLATE: - Visible: false - Height: 29 - Width: 29 - IgnoreChildMouseOver: true - Children: - Image@TILE_ERASE: - X: 6 - Y: 6 - Width: 26 - Height: 26 - ImageCollection: editor - ImageName: erase - Button@CLEAR_CURRENT_BUTTON: - X: 6 - Y: 42 - Width: 100 - Height: 25 - Text: button-marker-tiles-clear-current - Font: Bold - Button@CLEAR_ALL_BUTTON: - X: 111 - Y: 42 - Width: 75 - Height: 25 - Text: button-marker-tiles-clear-all - Font: Bold - Label@ALPHA_LABEL: - X: 6 - Y: 72 - Width: 265 - Height: 25 - Align: Left - Text: label-marker-alpha - Slider@ALPHA_SLIDER: - X: 130 - Y: 72 - Width: 128 - Height: 25 - Label@ALPHA_VALUE: - X: 260 - Y: 72 - Width: 30 - Height: 25 - Align: Left - Label@MODE_LABEL: - X: 6 - Y: 102 - Width: 260 - Height: 25 - Align: Left - Text: label-marker-mirror-mode - DropDownButton@MODE_DROPDOWN: - X: 129 - Y: 102 - Width: 157 - Height: 25 - Label@NUM_SIDES_LABEL: - X: 6 - Y: 132 - Width: 256 - Height: 25 - Align: Left - Text: label-marker-layer-num-sides - Slider@ROTATE_NUM_SIDES_SLIDER: - X: 130 - Y: 132 - Width: 128 - Height: 25 - Visible: false - Label@ROTATE_NUM_SIDES_VALUE: - X: 260 - Y: 132 - Width: 30 - Height: 25 - Align: Left - Visible: false - DropDownButton@FLIP_NUM_SIDES_DROPDOWN: - X: 129 - Y: 132 - Width: 157 - Height: 25 - Label@AXIS_ANGLE_LABEL: - X: 6 - Y: 162 - Width: 256 - Height: 25 - Align: Left - Text: label-marker-axis-angle - Visible: false - Slider@AXIS_ANGLE_SLIDER: - X: 130 - Y: 162 - Width: 128 - Height: 25 - Visible: false - Label@AXIS_ANGLE_VALUE: - X: 260 - Y: 162 - Width: 30 - Height: 25 - Align: Left - Visible: false - ScrollPanel@MAP_GENERATOR_TOOL_PANEL: - Y: 25 - Width: PARENT_WIDTH - Height: PARENT_HEIGHT - 25 - Visible: false - ScrollBar: Hidden - ScrollbarWidth: 0 - Logic: MapGeneratorToolLogic - Children: - LabelForInput@GENERATOR_LABEL: - Y: 5 - Width: 65 - Height: 25 - Align: Right - Font: TinyBold - Text: label-map-generator-generator - For: GENERATOR - DropDownButton@GENERATOR: - X: 70 - Y: 5 - Width: PARENT_WIDTH - 75 - Height: 25 - Font: Bold - Button@GENERATE_BUTTON: - X: 5 - Y: 45 - Width: 95 - Height: 25 - Text: button-map-generator-generate - Font: Bold - Button@GENERATE_RANDOM_BUTTON: - X: 105 - Y: 45 - Width: 180 - Height: 25 - Text: button-map-generator-generate-random - Font: Bold - ScrollPanel@SETTINGS_PANEL: - X: 0 - Y: 85 - Width: PARENT_WIDTH - Height: PARENT_HEIGHT - 85 - Children: - Container@CHECKBOX_TEMPLATE: - X: 5 - Width: PARENT_WIDTH - 35 - Height: 30 - Children: - Checkbox@CHECKBOX: - Width: PARENT_WIDTH - Height: 25 - Container@TEXT_TEMPLATE: - X: 5 - Width: PARENT_WIDTH - 35 - Height: 50 - Children: - LabelForInput@LABEL: - Y: 0 - Width: PARENT_WIDTH - Height: 20 - For: INPUT - TextField@INPUT: - Y: 20 - Width: PARENT_WIDTH - Height: 25 - Container@DROPDOWN_TEMPLATE: - X: 5 - Width: PARENT_WIDTH - 35 - Height: 50 - Children: - LabelForInput@LABEL: - Y: 0 - Width: PARENT_WIDTH - Height: 20 - For: DROPDOWN - DropDownButton@DROPDOWN: - Y: 20 - Width: PARENT_WIDTH - Height: 25 - PanelRoot: EDITOR_WORLD_ROOT Container@HISTORY_WIDGETS: X: WINDOW_WIDTH - 295 Y: 318 @@ -1085,3 +873,207 @@ ScrollPanel@OVERLAY_PANEL: Width: PARENT_WIDTH - 29 Height: 20 Visible: false + +Background@MARKER_TOOL_PANEL: + Logic: MapMarkerTilesLogic + Y: 24 + Width: PARENT_WIDTH + Height: PARENT_HEIGHT - 25 + Background: scrollpanel-bg + Visible: false + Children: + ScrollPanel@TILE_COLOR_PANEL: + X: 6 + Y: 6 + Width: PARENT_WIDTH - 19 + Height: 31 + TopBottomSpacing: 1 + ItemSpacing: 1 + ScrollBar: Hidden + ScrollbarWidth: 0 + ContentHeight: 31 + Children: + ScrollItem@TILE_COLOR_TEMPLATE: + Visible: false + Height: 29 + Width: 29 + IgnoreChildMouseOver: true + Children: + ColorBlock@TILE_PREVIEW: + X: 2 + Y: 2 + Width: 26 + Height: 26 + ScrollItem@TILE_ICON_TEMPLATE: + Visible: false + Height: 29 + Width: 29 + IgnoreChildMouseOver: true + Children: + Image@TILE_ERASE: + X: 6 + Y: 6 + Width: 26 + Height: 26 + ImageCollection: editor + ImageName: erase + Button@CLEAR_CURRENT_BUTTON: + X: 6 + Y: 42 + Width: 100 + Height: 25 + Text: button-marker-tiles-clear-current + Font: Bold + Button@CLEAR_ALL_BUTTON: + X: 111 + Y: 42 + Width: 75 + Height: 25 + Text: button-marker-tiles-clear-all + Font: Bold + Label@ALPHA_LABEL: + X: 6 + Y: 72 + Width: 265 + Height: 25 + Align: Left + Text: label-marker-alpha + Slider@ALPHA_SLIDER: + X: 130 + Y: 72 + Width: 128 + Height: 25 + Label@ALPHA_VALUE: + X: 260 + Y: 72 + Width: 30 + Height: 25 + Align: Left + Label@MODE_LABEL: + X: 6 + Y: 102 + Width: 260 + Height: 25 + Align: Left + Text: label-marker-mirror-mode + DropDownButton@MODE_DROPDOWN: + X: 129 + Y: 102 + Width: 157 + Height: 25 + Label@NUM_SIDES_LABEL: + X: 6 + Y: 132 + Width: 256 + Height: 25 + Align: Left + Text: label-marker-layer-num-sides + Slider@ROTATE_NUM_SIDES_SLIDER: + X: 130 + Y: 132 + Width: 128 + Height: 25 + Visible: false + Label@ROTATE_NUM_SIDES_VALUE: + X: 260 + Y: 132 + Width: 30 + Height: 25 + Align: Left + Visible: false + DropDownButton@FLIP_NUM_SIDES_DROPDOWN: + X: 129 + Y: 132 + Width: 157 + Height: 25 + Label@AXIS_ANGLE_LABEL: + X: 6 + Y: 162 + Width: 256 + Height: 25 + Align: Left + Text: label-marker-axis-angle + Visible: false + Slider@AXIS_ANGLE_SLIDER: + X: 130 + Y: 162 + Width: 128 + Height: 25 + Visible: false + Label@AXIS_ANGLE_VALUE: + X: 260 + Y: 162 + Width: 30 + Height: 25 + Align: Left + Visible: false + +Container@MAP_GENERATOR_TOOL_PANEL: + Logic: MapGeneratorToolLogic + Y: 24 + Width: PARENT_WIDTH + Height: PARENT_HEIGHT - 25 + Visible: false + Children: + Background@BUTTON_BG: + Background: panel-black + Width: PARENT_WIDTH + Height: 35 + Children: + Button@GENERATE_BUTTON: + X: 5 + Y: 5 + Width: 95 + Height: 25 + Text: button-map-generator-generate + Font: Bold + Button@GENERATE_RANDOM_BUTTON: + X: 105 + Y: 5 + Width: 180 + Height: 25 + Text: button-map-generator-generate-random + Font: Bold + ScrollPanel@SETTINGS_PANEL: + X: 0 + Y: 34 + Width: PARENT_WIDTH + Height: PARENT_HEIGHT - 35 + Children: + Container@CHECKBOX_TEMPLATE: + X: 5 + Width: PARENT_WIDTH - 35 + Height: 30 + Children: + Checkbox@CHECKBOX: + Width: PARENT_WIDTH + Height: 25 + Container@TEXT_TEMPLATE: + X: 5 + Width: PARENT_WIDTH - 35 + Height: 50 + Children: + LabelForInput@LABEL: + Y: 0 + Width: PARENT_WIDTH + Height: 20 + For: INPUT + TextField@INPUT: + Y: 20 + Width: PARENT_WIDTH + Height: 25 + Container@DROPDOWN_TEMPLATE: + X: 5 + Width: PARENT_WIDTH - 35 + Height: 50 + Children: + LabelForInput@LABEL: + Y: 0 + Width: PARENT_WIDTH + Height: 20 + For: DROPDOWN + DropDownButton@DROPDOWN: + Y: 20 + Width: PARENT_WIDTH + Height: 25 + PanelRoot: EDITOR_WORLD_ROOT diff --git a/mods/cnc/fluent/chrome.ftl b/mods/cnc/fluent/chrome.ftl index ec7562375c..35e75d197b 100644 --- a/mods/cnc/fluent/chrome.ftl +++ b/mods/cnc/fluent/chrome.ftl @@ -76,7 +76,6 @@ label-marker-layer-num-sides = Number of Sides label-marker-alpha = Tile Alpha label-marker-mirror-mode = Mirror Mode label-marker-axis-angle = Axis Angle -label-map-generator-generator = Generator button-map-generator-generate = Generate button-map-generator-generate-random = Generate Random @@ -116,7 +115,6 @@ button-select-categories-buttons-all = All button-select-categories-buttons-none = None label-tool-marker-tiles = Marker Tiles -label-tool-map-generator = Map Generator ## encyclopedia.yaml, mainmenu.yaml label-encyclopedia-title = EVA Database diff --git a/mods/cnc/fluent/rules.ftl b/mods/cnc/fluent/rules.ftl index e6c86c9ba9..200c562d84 100644 --- a/mods/cnc/fluent/rules.ftl +++ b/mods/cnc/fluent/rules.ftl @@ -51,8 +51,8 @@ faction-nod = and the alien substance Tiberium. They use stealth technology and guerilla tactics to defeat those who oppose them. -map-generator-experimental = Experimental -map-generator-clear = Clear +map-generator-experimental = Experimental RMG +map-generator-clear = Clear Terrain ## defaults.yaml notification-unit-lost = Unit lost. diff --git a/mods/cnc/rules/world.yaml b/mods/cnc/rules/world.yaml index 75615d4435..1cd29325c7 100644 --- a/mods/cnc/rules/world.yaml +++ b/mods/cnc/rules/world.yaml @@ -281,7 +281,6 @@ World: EditorWorld: Inherits: ^BaseWorld - Inherits@MapGenerators: ^MapGenerators EditorActorLayer: EditorCursorLayer: EditorResourceLayer: @@ -302,3 +301,4 @@ EditorWorld: BuildableTerrainOverlay: AllowedTerrainTypes: Clear, Road MarkerLayerOverlay: + Inherits@MapGenerators: ^MapGenerators diff --git a/mods/common/chrome/editor.yaml b/mods/common/chrome/editor.yaml index 53051319ca..e5d9dac1a1 100644 --- a/mods/common/chrome/editor.yaml +++ b/mods/common/chrome/editor.yaml @@ -408,220 +408,6 @@ Container@EDITOR_WORLD_ROOT: Width: PARENT_WIDTH - 70 Height: 25 Font: Bold - Background@MARKER_TOOL_PANEL: - X: 10 - Y: 35 - Width: PARENT_WIDTH - 20 - Height: WINDOW_HEIGHT - 490 - Background: scrollpanel-bg - Logic: MapMarkerTilesLogic - Children: - ScrollPanel@TILE_COLOR_PANEL: - X: 6 - Y: 6 - Width: PARENT_WIDTH - 19 - Height: 31 - TopBottomSpacing: 1 - ItemSpacing: 1 - ScrollBar: Hidden - ScrollbarWidth: 0 - ContentHeight: 31 - Children: - ScrollItem@TILE_COLOR_TEMPLATE: - Visible: false - Height: 29 - Width: 29 - IgnoreChildMouseOver: true - Children: - ColorBlock@TILE_PREVIEW: - X: 2 - Y: 2 - Width: 26 - Height: 26 - ScrollItem@TILE_ICON_TEMPLATE: - Visible: false - Height: 29 - Width: 29 - IgnoreChildMouseOver: true - Children: - Image@TILE_ERASE: - X: 6 - Y: 6 - Width: 26 - Height: 26 - ImageCollection: editor - ImageName: erase - Button@CLEAR_CURRENT_BUTTON: - X: 6 - Y: 42 - Width: 100 - Height: 25 - Text: button-marker-tiles-clear-current - Font: Bold - Button@CLEAR_ALL_BUTTON: - X: 111 - Y: 42 - Width: 75 - Height: 25 - Text: button-marker-tiles-clear-all - Font: Bold - Label@ALPHA_LABEL: - X: 6 - Y: 72 - Width: 265 - Height: 25 - Align: Left - Text: label-marker-alpha - Slider@ALPHA_SLIDER: - X: 130 - Y: 72 - Width: 128 - Height: 25 - Label@ALPHA_VALUE: - X: 260 - Y: 72 - Width: 30 - Height: 25 - Align: Left - Label@MODE_LABEL: - X: 6 - Y: 102 - Width: 260 - Height: 25 - Align: Left - Text: label-marker-mirror-mode - DropDownButton@MODE_DROPDOWN: - X: 129 - Y: 102 - Width: 157 - Height: 25 - Label@NUM_SIDES_LABEL: - X: 6 - Y: 132 - Width: 256 - Height: 25 - Align: Left - Text: label-marker-layer-num-sides - Slider@ROTATE_NUM_SIDES_SLIDER: - X: 130 - Y: 132 - Width: 128 - Height: 25 - Visible: false - Label@ROTATE_NUM_SIDES_VALUE: - X: 260 - Y: 132 - Width: 30 - Height: 25 - Align: Left - Visible: false - DropDownButton@FLIP_NUM_SIDES_DROPDOWN: - X: 129 - Y: 132 - Width: 157 - Height: 25 - Label@AXIS_ANGLE_LABEL: - X: 6 - Y: 162 - Width: 256 - Height: 25 - Align: Left - Text: label-marker-axis-angle - Visible: false - Slider@AXIS_ANGLE_SLIDER: - X: 130 - Y: 162 - Width: 128 - Height: 25 - Visible: false - Label@AXIS_ANGLE_VALUE: - X: 260 - Y: 162 - Width: 30 - Height: 25 - Align: Left - Visible: false - ScrollPanel@MAP_GENERATOR_TOOL_PANEL: - X: 9 - Y: 35 - Width: 290 - Height: WINDOW_HEIGHT - 490 - Visible: false - ScrollBar: Hidden - ScrollbarWidth: 0 - Logic: MapGeneratorToolLogic - Children: - LabelForInput@GENERATOR_LABEL: - Y: 5 - Width: 65 - Height: 25 - Align: Right - Font: TinyBold - Text: label-map-generator-generator - For: GENERATOR - DropDownButton@GENERATOR: - X: 70 - Y: 5 - Width: PARENT_WIDTH - 75 - Height: 25 - Font: Bold - Button@GENERATE_BUTTON: - X: 5 - Y: 45 - Width: 95 - Height: 25 - Text: button-map-generator-generate - Font: Bold - Button@GENERATE_RANDOM_BUTTON: - X: 105 - Y: 45 - Width: 180 - Height: 25 - Text: button-map-generator-generate-random - Font: Bold - ScrollPanel@SETTINGS_PANEL: - X: 0 - Y: 85 - Width: PARENT_WIDTH - Height: PARENT_HEIGHT - 85 - Children: - Container@CHECKBOX_TEMPLATE: - X: 5 - Width: PARENT_WIDTH - 35 - Height: 30 - Children: - Checkbox@CHECKBOX: - Width: PARENT_WIDTH - Height: 25 - Container@TEXT_TEMPLATE: - X: 5 - Width: PARENT_WIDTH - 35 - Height: 50 - Children: - LabelForInput@LABEL: - Y: 0 - Width: PARENT_WIDTH - Height: 20 - For: INPUT - TextField@INPUT: - Y: 20 - Width: PARENT_WIDTH - Height: 25 - Container@DROPDOWN_TEMPLATE: - X: 5 - Width: PARENT_WIDTH - 35 - Height: 50 - Children: - LabelForInput@LABEL: - Y: 0 - Width: PARENT_WIDTH - Height: 20 - For: DROPDOWN - DropDownButton@DROPDOWN: - Y: 20 - Width: PARENT_WIDTH - Height: 25 - PanelRoot: EDITOR_WORLD_ROOT Container@HISTORY_WIDGETS: X: WINDOW_WIDTH - 320 Y: 354 @@ -1062,3 +848,205 @@ ScrollPanel@OVERLAY_PANEL: Width: PARENT_WIDTH - 29 Height: 20 Visible: false + +Background@MARKER_TOOL_PANEL: + X: 10 + Y: 35 + Width: PARENT_WIDTH - 20 + Height: WINDOW_HEIGHT - 490 + Background: scrollpanel-bg + Logic: MapMarkerTilesLogic + Children: + ScrollPanel@TILE_COLOR_PANEL: + X: 6 + Y: 6 + Width: PARENT_WIDTH - 19 + Height: 31 + TopBottomSpacing: 1 + ItemSpacing: 1 + ScrollBar: Hidden + ScrollbarWidth: 0 + ContentHeight: 31 + Children: + ScrollItem@TILE_COLOR_TEMPLATE: + Visible: false + Height: 29 + Width: 29 + IgnoreChildMouseOver: true + Children: + ColorBlock@TILE_PREVIEW: + X: 2 + Y: 2 + Width: 26 + Height: 26 + ScrollItem@TILE_ICON_TEMPLATE: + Visible: false + Height: 29 + Width: 29 + IgnoreChildMouseOver: true + Children: + Image@TILE_ERASE: + X: 6 + Y: 6 + Width: 26 + Height: 26 + ImageCollection: editor + ImageName: erase + Button@CLEAR_CURRENT_BUTTON: + X: 6 + Y: 42 + Width: 100 + Height: 25 + Text: button-marker-tiles-clear-current + Font: Bold + Button@CLEAR_ALL_BUTTON: + X: 111 + Y: 42 + Width: 75 + Height: 25 + Text: button-marker-tiles-clear-all + Font: Bold + Label@ALPHA_LABEL: + X: 6 + Y: 72 + Width: 265 + Height: 25 + Align: Left + Text: label-marker-alpha + Slider@ALPHA_SLIDER: + X: 130 + Y: 72 + Width: 128 + Height: 25 + Label@ALPHA_VALUE: + X: 260 + Y: 72 + Width: 30 + Height: 25 + Align: Left + Label@MODE_LABEL: + X: 6 + Y: 102 + Width: 260 + Height: 25 + Align: Left + Text: label-marker-mirror-mode + DropDownButton@MODE_DROPDOWN: + X: 129 + Y: 102 + Width: 157 + Height: 25 + Label@NUM_SIDES_LABEL: + X: 6 + Y: 132 + Width: 256 + Height: 25 + Align: Left + Text: label-marker-layer-num-sides + Slider@ROTATE_NUM_SIDES_SLIDER: + X: 130 + Y: 132 + Width: 128 + Height: 25 + Visible: false + Label@ROTATE_NUM_SIDES_VALUE: + X: 260 + Y: 132 + Width: 30 + Height: 25 + Align: Left + Visible: false + DropDownButton@FLIP_NUM_SIDES_DROPDOWN: + X: 129 + Y: 132 + Width: 157 + Height: 25 + Label@AXIS_ANGLE_LABEL: + X: 6 + Y: 162 + Width: 256 + Height: 25 + Align: Left + Text: label-marker-axis-angle + Visible: false + Slider@AXIS_ANGLE_SLIDER: + X: 130 + Y: 162 + Width: 128 + Height: 25 + Visible: false + Label@AXIS_ANGLE_VALUE: + X: 260 + Y: 162 + Width: 30 + Height: 25 + Align: Left + Visible: false + +ScrollPanel@MAP_GENERATOR_TOOL_PANEL: + X: 9 + Y: 35 + Width: 290 + Height: WINDOW_HEIGHT - 490 + Visible: false + ScrollBar: Hidden + ScrollbarWidth: 0 + Logic: MapGeneratorToolLogic + Children: + Button@GENERATE_BUTTON: + X: 5 + Y: 5 + Width: 95 + Height: 25 + Text: button-map-generator-generate + Font: Bold + Button@GENERATE_RANDOM_BUTTON: + X: 105 + Y: 5 + Width: 180 + Height: 25 + Text: button-map-generator-generate-random + Font: Bold + ScrollPanel@SETTINGS_PANEL: + X: 0 + Y: 35 + Width: PARENT_WIDTH + Height: PARENT_HEIGHT - 35 + Children: + Container@CHECKBOX_TEMPLATE: + X: 5 + Width: PARENT_WIDTH - 35 + Height: 30 + Children: + Checkbox@CHECKBOX: + Width: PARENT_WIDTH + Height: 25 + Container@TEXT_TEMPLATE: + X: 5 + Width: PARENT_WIDTH - 35 + Height: 50 + Children: + LabelForInput@LABEL: + Y: 0 + Width: PARENT_WIDTH + Height: 20 + For: INPUT + TextField@INPUT: + Y: 20 + Width: PARENT_WIDTH + Height: 25 + Container@DROPDOWN_TEMPLATE: + X: 5 + Width: PARENT_WIDTH - 35 + Height: 50 + Children: + LabelForInput@LABEL: + Y: 0 + Width: PARENT_WIDTH + Height: 20 + For: DROPDOWN + DropDownButton@DROPDOWN: + Y: 20 + Width: PARENT_WIDTH + Height: 25 + PanelRoot: EDITOR_WORLD_ROOT \ No newline at end of file diff --git a/mods/common/fluent/chrome.ftl b/mods/common/fluent/chrome.ftl index ff478b93b5..ebcd7ec6ce 100644 --- a/mods/common/fluent/chrome.ftl +++ b/mods/common/fluent/chrome.ftl @@ -72,7 +72,6 @@ label-marker-layer-num-sides = Number of Sides label-marker-alpha = Tile Alpha label-marker-mirror-mode = Mirror Mode label-marker-axis-angle = Axis Angle -label-map-generator-generator = Generator button-map-generator-generate = Generate button-map-generator-generate-random = Generate Random @@ -116,7 +115,6 @@ button-select-categories-buttons-all = All button-select-categories-buttons-none = None label-tool-marker-tiles = Marker Tiles -label-tool-map-generator = Map Generator ## gamesave-browser.yaml label-gamesave-browser-panel-load-title = Load game diff --git a/mods/ra/fluent/rules.ftl b/mods/ra/fluent/rules.ftl index 35b3a8e9ea..2fcfe0fc18 100644 --- a/mods/ra/fluent/rules.ftl +++ b/mods/ra/fluent/rules.ftl @@ -34,8 +34,8 @@ options-starting-units = resource-minerals = Valuable Minerals -map-generator-experimental = Experimental -map-generator-clear = Clear +map-generator-experimental = Experimental RMG +map-generator-clear = Clear Terrain ## Faction faction-allies = diff --git a/mods/ra/rules/world.yaml b/mods/ra/rules/world.yaml index 8b762a1fff..8ae590d1ee 100644 --- a/mods/ra/rules/world.yaml +++ b/mods/ra/rules/world.yaml @@ -299,7 +299,6 @@ World: EditorWorld: Inherits: ^BaseWorld - Inherits@MapGenerators: ^MapGenerators EditorActorLayer: EditorCursorLayer: EditorResourceLayer: @@ -320,3 +319,4 @@ EditorWorld: BuildableTerrainOverlay: AllowedTerrainTypes: Clear, Road MarkerLayerOverlay: + Inherits@MapGenerators: ^MapGenerators