diff --git a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj index b22fb2e5f3..e684a7b905 100644 --- a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj +++ b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj @@ -84,6 +84,7 @@ + diff --git a/OpenRA.Mods.Cnc/Widgets/CncIngameChromeLogic.cs b/OpenRA.Mods.Cnc/Widgets/CncIngameChromeLogic.cs index 7ee6de97a6..9ddea0750a 100755 --- a/OpenRA.Mods.Cnc/Widgets/CncIngameChromeLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/CncIngameChromeLogic.cs @@ -103,7 +103,7 @@ namespace OpenRA.Mods.Cnc.Widgets var doNothing = (Action)(() => {}); menu.GetWidget("QUIT_BUTTON").OnClick = () => - PromptConfirmAction("Exit Game", "Are you sure you want to leave the game?", onQuit, doNothing); + PromptConfirmAction("Quit", "Are you sure you want to quit?", onQuit, doNothing); var onSurrender = (Action)(() => world.IssueOrder(new Order("Surrender", world.LocalPlayer.PlayerActor, false))); var surrenderButton = menu.GetWidget("SURRENDER_BUTTON"); @@ -120,7 +120,14 @@ namespace OpenRA.Mods.Cnc.Widgets }); }; - menu.GetWidget("PREFERENCES_BUTTON").IsDisabled = () => true; + menu.GetWidget("PREFERENCES_BUTTON").OnClick = () => + { + hideButtons = true; + Widget.OpenWindow("SETTINGS_PANEL", new Dictionary() + { + { "onExit", new Action(() => hideButtons = false) }, + }); + }; menu.GetWidget("RESUME_BUTTON").OnClick = () => { diff --git a/OpenRA.Mods.Cnc/Widgets/CncMenuLogic.cs b/OpenRA.Mods.Cnc/Widgets/CncMenuLogic.cs index 35b7528104..2d1d0d1a07 100755 --- a/OpenRA.Mods.Cnc/Widgets/CncMenuLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/CncMenuLogic.cs @@ -19,6 +19,7 @@ using System.Drawing; using System.Linq; using OpenRA.GameRules; using OpenRA.Mods.RA; +using OpenRA.Support; namespace OpenRA.Mods.Cnc.Widgets { @@ -117,7 +118,14 @@ namespace OpenRA.Mods.Cnc.Widgets }); }; - settingsMenu.GetWidget("PREFERENCES_BUTTON").IsDisabled = () => true; + settingsMenu.GetWidget("PREFERENCES_BUTTON").OnClick = () => + { + Menu = MenuType.None; + Widget.OpenWindow("SETTINGS_PANEL", new Dictionary() + { + { "onExit", new Action(() => ReturnToMenu(MenuType.Settings)) }, + }); + }; settingsMenu.GetWidget("BACK_BUTTON").OnClick = () => Menu = MenuType.Main; } diff --git a/OpenRA.Mods.Cnc/Widgets/CncSettingsLogic.cs b/OpenRA.Mods.Cnc/Widgets/CncSettingsLogic.cs new file mode 100755 index 0000000000..6240ee50bf --- /dev/null +++ b/OpenRA.Mods.Cnc/Widgets/CncSettingsLogic.cs @@ -0,0 +1,149 @@ +#region Copyright & License Information +/* + * Copyright 2007-2011 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. For more information, + * see COPYING. + */ +#endregion + +using System; +using OpenRA.FileFormats.Graphics; +using OpenRA.GameRules; +using OpenRA.Widgets; + +namespace OpenRA.Mods.Cnc.Widgets +{ + public class CncSettingsLogic : IWidgetDelegate + { + Widget bg; + + [ObjectCreator.UseCtor] + public CncSettingsLogic([ObjectCreator.Param] Widget widget, + [ObjectCreator.Param] Action onExit) + { + bg = widget.GetWidget("SETTINGS_PANEL"); + var tabs = bg.GetWidget("TAB_CONTAINER"); + + //Tabs + tabs.GetWidget("GENERAL").OnMouseUp = mi => FlipToTab("GENERAL_PANE"); + tabs.GetWidget("AUDIO").OnMouseUp = mi => FlipToTab("AUDIO_PANE"); + tabs.GetWidget("DISPLAY").OnMouseUp = mi => FlipToTab("DISPLAY_PANE"); + tabs.GetWidget("DEBUG").OnMouseUp = mi => FlipToTab("DEBUG_PANE"); + FlipToTab("GENERAL_PANE"); + + //General + var general = bg.GetWidget("GENERAL_PANE"); + + var name = general.GetWidget("NAME"); + name.Text = Game.Settings.Player.Name; + name.OnLoseFocus = () => + { + name.Text = name.Text.Trim(); + + if (name.Text.Length == 0) + name.Text = Game.Settings.Player.Name; + else + Game.Settings.Player.Name = name.Text; + }; + name.OnEnterKey = () => { name.LoseFocus(); return true; }; + + general.GetWidget("EDGE_SCROLL").Bind(Game.Settings.Game, "ViewportEdgeScroll"); + + // Added scroll sensitivity - Gecko + var edgeScrollSlider = general.GetWidget("EDGE_SCROLL_AMOUNT"); + if (edgeScrollSlider != null) // Backwards compatible - Gecko + { + edgeScrollSlider.SetOffset(Game.Settings.Game.ViewportEdgeScrollStep); + edgeScrollSlider.OnChange += _ => { Game.Settings.Game.ViewportEdgeScrollStep = edgeScrollSlider.GetOffset(); }; + Game.Settings.Game.ViewportEdgeScrollStep = edgeScrollSlider.GetOffset(); + } + + general.GetWidget("INVERSE_SCROLL").Bind(Game.Settings.Game, "InverseDragScroll"); + general.GetWidget("TEAMCHAT_TOGGLE").Bind(Game.Settings.Game, "TeamChatToggle"); + + + // Audio + var audio = bg.GetWidget("AUDIO_PANE"); + + var soundslider = audio.GetWidget("SOUND_VOLUME"); + soundslider.OnChange += x => { Sound.SoundVolume = x; }; + soundslider.GetOffset = () => { return Sound.SoundVolume; }; + soundslider.SetOffset(Sound.SoundVolume); + + var musicslider = audio.GetWidget("MUSIC_VOLUME"); + musicslider.OnChange += x => { Sound.MusicVolume = x; }; + musicslider.GetOffset = () => { return Sound.MusicVolume; }; + musicslider.SetOffset(Sound.MusicVolume); + + + // Display + var display = bg.GetWidget("DISPLAY_PANE"); + display.GetWidget("FULLSCREEN_CHECKBOX").Bind(Game.Settings.Game, "TeamChatToggle"); + + var fullscreen = display.GetWidget("FULLSCREEN_CHECKBOX"); + fullscreen.IsChecked = () => Game.Settings.Graphics.Mode != WindowMode.Windowed; + fullscreen.OnChange += c => Game.Settings.Graphics.Mode = (Game.Settings.Graphics.Mode == WindowMode.Windowed) ? WindowMode.PseudoFullscreen : WindowMode.Windowed; + + var width = display.GetWidget("SCREEN_WIDTH"); + Game.Settings.Graphics.WindowedSize.X = (Game.Settings.Graphics.WindowedSize.X < Game.Settings.Graphics.MinResolution.X)? + Game.Settings.Graphics.MinResolution.X : Game.Settings.Graphics.WindowedSize.X; + width.Text = Game.Settings.Graphics.WindowedSize.X.ToString(); + width.OnLoseFocus = () => + { + try { + var w = int.Parse(width.Text); + if (w > Game.Settings.Graphics.MinResolution.X) + Game.Settings.Graphics.WindowedSize = new int2(w, Game.Settings.Graphics.WindowedSize.Y); + } + catch (FormatException) { + width.Text = Game.Settings.Graphics.WindowedSize.X.ToString(); + } + }; + width.OnEnterKey = () => { width.LoseFocus(); return true; }; + + var height = display.GetWidget("SCREEN_HEIGHT"); + Game.Settings.Graphics.WindowedSize.Y = (Game.Settings.Graphics.WindowedSize.Y < Game.Settings.Graphics.MinResolution.Y)? + Game.Settings.Graphics.MinResolution.Y : Game.Settings.Graphics.WindowedSize.Y; + height.Text = Game.Settings.Graphics.WindowedSize.Y.ToString(); + height.OnLoseFocus = () => + { + try { + var h = int.Parse(height.Text); + if (h > Game.Settings.Graphics.MinResolution.Y) + Game.Settings.Graphics.WindowedSize = new int2(Game.Settings.Graphics.WindowedSize.X, h); + else + height.Text = Game.Settings.Graphics.WindowedSize.Y.ToString(); + } + catch (FormatException) { + height.Text = Game.Settings.Graphics.WindowedSize.Y.ToString(); + } + }; + height.OnEnterKey = () => { height.LoseFocus(); return true; }; + + // Debug + var debug = bg.GetWidget("DEBUG_PANE"); + debug.GetWidget("PERFDEBUG_CHECKBOX").Bind(Game.Settings.Debug, "PerfGraph"); + debug.GetWidget("GAMETIME_CHECKBOX").Bind(Game.Settings.Game, "MatchTimer"); + debug.GetWidget("CHECKUNSYNCED_CHECKBOX").Bind(Game.Settings.Debug, "SanityCheckUnsyncedCode"); + + bg.GetWidget("BUTTON_CLOSE").OnClick = () => { + Game.Settings.Save(); + Widget.CloseWindow(); + onExit(); + }; + } + + string open = null; + bool FlipToTab(string id) + { + if (open != null) + bg.GetWidget(open).Visible = false; + + open = id; + bg.GetWidget(open).Visible = true; + return true; + } + } +} diff --git a/mods/cnc/chrome/ingamemenu.yaml b/mods/cnc/chrome/ingamemenu.yaml index 9f70a84c83..33834660dc 100644 --- a/mods/cnc/chrome/ingamemenu.yaml +++ b/mods/cnc/chrome/ingamemenu.yaml @@ -32,7 +32,7 @@ Container@INGAME_MENU: Y:0 Width:140 Height:35 - Text:Exit Game + Text:Quit CncMenuButton@SURRENDER_BUTTON: Id:SURRENDER_BUTTON X:150 diff --git a/mods/cnc/chrome/preferences.yaml b/mods/cnc/chrome/preferences.yaml new file mode 100644 index 0000000000..04e7b8922a --- /dev/null +++ b/mods/cnc/chrome/preferences.yaml @@ -0,0 +1,226 @@ +Background@SETTINGS_PANEL: + Id:SETTINGS_PANEL + Delegate:CncSettingsLogic + X:(WINDOW_RIGHT - WIDTH)/2 + Y:(WINDOW_BOTTOM- HEIGHT)/2 + Width: 450 + Height: 350 + Children: + Label@SETTINGS_LABEL_TITLE: + Id:SETTINGS_LABEL_TITLE + X:0 + Y:20 + Width:450 + Height:25 + Text:Settings + Align:Center + Bold:True + CncMenuButton@BUTTON_CLOSE: + Id:BUTTON_CLOSE + X:PARENT_RIGHT - 180 + Y:PARENT_BOTTOM - 45 + Width:160 + Height:25 + Text:Close + Bold:True + Container@TAB_CONTAINER: + Id:TAB_CONTAINER + X:0 + Y:50 + Width:PARENT_RIGHT + Height:25 + Children: + Button@GENERAL: + Id:GENERAL + X:45 + Y:0 + Width:90 + Height:25 + Text:General + Bold:True + Button@AUDIO: + Id:AUDIO + X:135 + Y:0 + Width:90 + Height:25 + Text:Audio + Bold:True + Button@DISPLAY: + Id:DISPLAY + X:225 + Y:0 + Width:90 + Height:25 + Text:Display + Bold:True + Button@DEBUG: + Id:DEBUG + X:315 + Y:0 + Width:90 + Height:25 + Text:Debug + Bold:True + Container@GENERAL_PANE: + Id:GENERAL_PANE + X:37 + Y:100 + Width:PARENT_RIGHT - 37 + Height:PARENT_BOTTOM - 100 + Visible: true + Children: + Label@SETTINGS_PLAYER_NAME: + Id:SETTINGS_PLAYER_NAME + X:0 + Y:10 + Text: Player Name: + TextField@NAME: + Id:NAME + Text:Name + Width:139 + Height:25 + X:90 + Y:0 + MaxLength:16 + Checkbox@EDGE_SCROLL: + Id:EDGE_SCROLL + X:0 + Y:30 + Width:200 + Height:20 + Text: Enable Edge Scrolling + Label@EDGE_SCROLL_AMOUNT_LABEL: + Id:EDGE_SCROLL_AMOUNT_LABEL + X:0 + Y:70 + Text: Scroll Speed + Slider@EDGE_SCROLL_AMOUNT: + Id:EDGE_SCROLL_AMOUNT + X:130 + Y:60 + Width:250 + Height:20 + Ticks:5 + Range:10,50 + Checkbox@INVERSE_SCROLL: + Id:INVERSE_SCROLL + X:0 + Y:90 + Width:200 + Height:20 + Text: Invert Mouse Drag Scrolling + Checkbox@TEAMCHAT_TOGGLE: + Id:TEAMCHAT_TOGGLE + X:0 + Y:120 + Width:200 + Height:20 + Text: Shift-Enter Toggles Team Chat + Container@AUDIO_PANE: + Id:AUDIO_PANE + X:37 + Y:100 + Width:PARENT_RIGHT - 37 + Height:PARENT_BOTTOM - 100 + Visible: false + Children: + Label@SOUND_VOLUME_LABEL: + Id:SOUND_VOLUME_LABEL + X:0 + Y:10 + Text: Sound Volume + Slider@SOUND_VOLUME: + Id:SOUND_VOLUME + X:100 + Y:0 + Width:250 + Height:20 + Ticks:5 + Label@MUSIC_VOLUME_LABEL: + Id:MUSIC_VOLUME_LABEL + X:0 + Y:40 + Text: Music Volume + Slider@MUSIC_VOLUME: + Id:MUSIC_VOLUME + X:100 + Y:30 + Width:250 + Height:20 + Ticks:5 + Container@DISPLAY_PANE: + Id:DISPLAY_PANE + X:37 + Y:100 + Width:PARENT_RIGHT - 37 + Height:PARENT_BOTTOM - 100 + Visible: false + Children: + Checkbox@FULLSCREEN_CHECKBOX: + Id:FULLSCREEN_CHECKBOX + X:0 + Y:0 + Width:300 + Height:20 + Text:Fullscreen + Label@RESOLUTION_LABEL: + Id:RESOLUTION_LABEL + X:0 + Y:50 + Text: Window Resolution: + TextField@SCREEN_WIDTH: + Id:SCREEN_WIDTH + Text:Width + Width:50 + Height:25 + X:130 + Y:40 + MaxLength:5 + Label@X: + Id:X + Text:x + X:185 + Y:50 + TextField@SCREEN_HEIGHT: + Id:SCREEN_HEIGHT + Text:Height + Width:50 + Height:25 + X:195 + Y:40 + MaxLength:5 + Label@RESTART: + Id:RESTART + Text: Restart Game To Apply Changes + X:0 + Y:PARENT_BOTTOM - 30 + Container@DEBUG_PANE: + Id:DEBUG_PANE + X:37 + Y:100 + Width:PARENT_RIGHT - 37 + Height:PARENT_BOTTOM - 100 + Visible: false + Children: + Checkbox@PERFDEBUG_CHECKBOX: + Id:PERFDEBUG_CHECKBOX + X:0 + Y:0 + Width:300 + Height:20 + Text:Show Performance Information + Checkbox@GAMETIME_CHECKBOX: + Id:GAMETIME_CHECKBOX + X:0 + Y:30 + Width:300 + Height:20 + Text:Show Game Time Counter + Checkbox@CHECKUNSYNCED_CHECKBOX: + Id:CHECKUNSYNCED_CHECKBOX + X:0 + Y:60 + Width:300 + Height:20 + Text:Check Sync around Unsynced Code diff --git a/mods/cnc/mod.yaml b/mods/cnc/mod.yaml index 64000646d5..7b6b7568c5 100644 --- a/mods/cnc/mod.yaml +++ b/mods/cnc/mod.yaml @@ -74,6 +74,7 @@ ChromeLayout: mods/cnc/chrome/ingamemenu.yaml mods/cnc/chrome/music.yaml mods/cnc/chrome/modchooser.yaml + mods/cnc/chrome/preferences.yaml Weapons: mods/cnc/weapons.yaml