#region Copyright & License Information /* * Copyright 2007-2013 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 System.Collections.Generic; using System.Linq; using OpenRA.FileFormats.Graphics; using OpenRA.GameRules; using OpenRA.Widgets; namespace OpenRA.Mods.RA.Widgets.Logic { public class SettingsMenuLogic { Widget bg; public SettingsMenuLogic() { bg = Ui.Root.Get("SETTINGS_MENU"); var tabs = bg.Get("TAB_CONTAINER"); //Tabs tabs.Get("GENERAL").OnClick = () => FlipToTab("GENERAL_PANE"); tabs.Get("AUDIO").OnClick = () => FlipToTab("AUDIO_PANE"); tabs.Get("DISPLAY").OnClick = () => FlipToTab("DISPLAY_PANE"); tabs.Get("KEYS").OnClick = () => FlipToTab("KEYS_PANE"); tabs.Get("DEBUG").OnClick = () => FlipToTab("DEBUG_PANE"); FlipToTab("GENERAL_PANE"); //General var general = bg.Get("GENERAL_PANE"); var name = general.Get("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; }; var edgescrollCheckbox = general.Get("EDGE_SCROLL"); edgescrollCheckbox.IsChecked = () => Game.Settings.Game.ViewportEdgeScroll; edgescrollCheckbox.OnClick = () => Game.Settings.Game.ViewportEdgeScroll ^= true; var edgeScrollSlider = general.Get("EDGE_SCROLL_AMOUNT"); edgeScrollSlider.Value = Game.Settings.Game.ViewportEdgeScrollStep; edgeScrollSlider.OnChange += x => Game.Settings.Game.ViewportEdgeScrollStep = x; var inversescroll = general.Get("INVERSE_SCROLL"); inversescroll.IsChecked = () => Game.Settings.Game.MouseScroll == MouseScrollType.Inverted; inversescroll.OnClick = () => Game.Settings.Game.MouseScroll = (Game.Settings.Game.MouseScroll == MouseScrollType.Inverted) ? MouseScrollType.Standard : MouseScrollType.Inverted; var teamchatCheckbox = general.Get("TEAMCHAT_TOGGLE"); teamchatCheckbox.IsChecked = () => Game.Settings.Game.TeamChatToggle; teamchatCheckbox.OnClick = () => Game.Settings.Game.TeamChatToggle ^= true; var showShellmapCheckbox = general.Get("SHOW_SHELLMAP"); showShellmapCheckbox.IsChecked = () => Game.Settings.Game.ShowShellmap; showShellmapCheckbox.OnClick = () => Game.Settings.Game.ShowShellmap ^= true; var useClassicMouseStyleCheckbox = general.Get("USE_CLASSIC_MOUSE_STYLE_CHECKBOX"); useClassicMouseStyleCheckbox.IsChecked = () => Game.Settings.Game.UseClassicMouseStyle; useClassicMouseStyleCheckbox.OnClick = () => Game.Settings.Game.UseClassicMouseStyle ^= true; // Audio var audio = bg.Get("AUDIO_PANE"); var soundSettings = Game.Settings.Sound; var soundslider = audio.Get("SOUND_VOLUME"); soundslider.OnChange += x => Sound.SoundVolume = x; soundslider.Value = Sound.SoundVolume; var musicslider = audio.Get("MUSIC_VOLUME"); musicslider.OnChange += x => Sound.MusicVolume = x; musicslider.Value = Sound.MusicVolume; var cashticksdropdown = audio.Get("CASH_TICK_TYPE"); cashticksdropdown.OnMouseDown = _ => ShowSoundTickDropdown(cashticksdropdown, soundSettings); cashticksdropdown.GetText = () => soundSettings.SoundCashTickType == SoundCashTicks.Extreme ? "Extreme" : soundSettings.SoundCashTickType == SoundCashTicks.Normal ? "Normal" : "Disabled"; // Display var display = bg.Get("DISPLAY_PANE"); var gs = Game.Settings.Graphics; var GraphicsRendererDropdown = display.Get("GRAPHICS_RENDERER"); GraphicsRendererDropdown.OnMouseDown = _ => ShowRendererDropdown(GraphicsRendererDropdown, gs); GraphicsRendererDropdown.GetText = () => gs.Renderer == "Gl" ? "OpenGL" : gs.Renderer == "Cg" ? "Cg Toolkit" : "OpenGL"; var windowModeDropdown = display.Get("MODE_DROPDOWN"); windowModeDropdown.OnMouseDown = _ => ShowWindowModeDropdown(windowModeDropdown, gs); windowModeDropdown.GetText = () => gs.Mode == WindowMode.Windowed ? "Windowed" : gs.Mode == WindowMode.Fullscreen ? "Fullscreen" : "Pseudo-Fullscreen"; display.Get("WINDOW_RESOLUTION").IsVisible = () => gs.Mode == WindowMode.Windowed; var windowWidth = display.Get("WINDOW_WIDTH"); windowWidth.Text = gs.WindowedSize.X.ToString(); var windowHeight = display.Get("WINDOW_HEIGHT"); windowHeight.Text = gs.WindowedSize.Y.ToString(); var pixelDoubleCheckbox = display.Get("PIXELDOUBLE_CHECKBOX"); pixelDoubleCheckbox.IsChecked = () => gs.PixelDouble; pixelDoubleCheckbox.OnClick = () => { gs.PixelDouble ^= true; Game.viewport.Zoom = gs.PixelDouble ? 2 : 1; }; // Keys var keys = bg.Get("KEYS_PANE"); var keyConfig = Game.Settings.Keys; var specialHotkeyList = keys.Get("SPECIALHOTKEY_LIST"); var specialHotkeyTemplate = specialHotkeyList.Get("SPECIALHOTKEY_TEMPLATE"); var pauseKey = ScrollItemWidget.Setup(specialHotkeyTemplate, () => false, () => {}); pauseKey.Get("FUNCTION").GetText = () => "Pause the game:"; SetupKeyBinding(pauseKey.Get("HOTKEY"), () => keyConfig.PauseKey, k => keyConfig.PauseKey = k); specialHotkeyList.AddChild(pauseKey); var viewportToBase = ScrollItemWidget.Setup(specialHotkeyTemplate, () => false, () => {}); viewportToBase.Get("FUNCTION").GetText = () => "Move Viewport to Base:"; SetupKeyBinding(viewportToBase.Get("HOTKEY"), () => keyConfig.CycleBaseKey, k => keyConfig.CycleBaseKey = k); specialHotkeyList.AddChild(viewportToBase); var lastEventKey = ScrollItemWidget.Setup(specialHotkeyTemplate, () => false, () => {}); lastEventKey.Get("FUNCTION").GetText = () => "Move Viewport to Last Event:"; SetupKeyBinding(lastEventKey.Get("HOTKEY"), () => keyConfig.GotoLastEventKey, k => keyConfig.GotoLastEventKey = k); specialHotkeyList.AddChild(lastEventKey); var sellKey = ScrollItemWidget.Setup(specialHotkeyTemplate, () => false, () => {}); sellKey.Get("FUNCTION").GetText = () => "Switch to Sell-Cursor:"; SetupKeyBinding(sellKey.Get("HOTKEY"), () => keyConfig.SellKey, k => keyConfig.SellKey = k); specialHotkeyList.AddChild(sellKey); var powerDownKey = ScrollItemWidget.Setup(specialHotkeyTemplate, () => false, () => {}); powerDownKey.Get("FUNCTION").GetText = () => "Switch to Power-Down-Cursor:"; SetupKeyBinding(powerDownKey.Get("HOTKEY"), () => keyConfig.PowerDownKey, k => keyConfig.PowerDownKey = k); specialHotkeyList.AddChild(powerDownKey); var repairKey = ScrollItemWidget.Setup(specialHotkeyTemplate, () => false, () => {}); repairKey.Get("FUNCTION").GetText = () => "Switch to Repair-Cursor:"; SetupKeyBinding(repairKey.Get("HOTKEY"), () => keyConfig.RepairKey, k => keyConfig.RepairKey = k); specialHotkeyList.AddChild(repairKey); var unitCommandHotkeyList = keys.Get("UNITCOMMANDHOTKEY_LIST"); var unitCommandHotkeyTemplate = unitCommandHotkeyList.Get("UNITCOMMANDHOTKEY_TEMPLATE"); var attackKey = ScrollItemWidget.Setup(unitCommandHotkeyTemplate, () => false, () => {}); attackKey.Get("FUNCTION").GetText = () => "Attack Move:"; SetupKeyBinding(attackKey.Get("HOTKEY"), () => keyConfig.AttackMoveKey, k => keyConfig.AttackMoveKey = k); unitCommandHotkeyList.AddChild(attackKey); var stopKey = ScrollItemWidget.Setup(unitCommandHotkeyTemplate, () => false, () => {}); stopKey.Get("FUNCTION").GetText = () => "Stop:"; SetupKeyBinding(stopKey.Get("HOTKEY"), () => keyConfig.StopKey, k => keyConfig.StopKey = k); unitCommandHotkeyList.AddChild(stopKey); var scatterKey = ScrollItemWidget.Setup(unitCommandHotkeyTemplate, () => false, () => {}); scatterKey.Get("FUNCTION").GetText = () => "Scatter:"; SetupKeyBinding(scatterKey.Get("HOTKEY"), () => keyConfig.ScatterKey, k => keyConfig.ScatterKey = k); unitCommandHotkeyList.AddChild(scatterKey); var stanceCycleKey = ScrollItemWidget.Setup(unitCommandHotkeyTemplate, () => false, () => {}); stanceCycleKey.Get("FUNCTION").GetText = () => "Cycle Stance:"; SetupKeyBinding(stanceCycleKey.Get("HOTKEY"), () => keyConfig.StanceCycleKey, k => keyConfig.StanceCycleKey = k); unitCommandHotkeyList.AddChild(stanceCycleKey); var deployKey = ScrollItemWidget.Setup(unitCommandHotkeyTemplate, () => false, () => {}); deployKey.Get("FUNCTION").GetText = () => "Deploy:"; SetupKeyBinding(deployKey.Get("HOTKEY"), () => keyConfig.DeployKey, k => keyConfig.DeployKey = k); unitCommandHotkeyList.AddChild(deployKey); // Debug var debug = bg.Get("DEBUG_PANE"); var perfgraphCheckbox = debug.Get("PERFDEBUG_CHECKBOX"); perfgraphCheckbox.IsChecked = () => Game.Settings.Debug.PerfGraph; perfgraphCheckbox.OnClick = () => Game.Settings.Debug.PerfGraph ^= true; var checkunsyncedCheckbox = debug.Get("CHECKUNSYNCED_CHECKBOX"); checkunsyncedCheckbox.IsChecked = () => Game.Settings.Debug.SanityCheckUnsyncedCode; checkunsyncedCheckbox.OnClick = () => Game.Settings.Debug.SanityCheckUnsyncedCode ^= true; bg.Get("BUTTON_CLOSE").OnClick = () => { int x, y; int.TryParse(windowWidth.Text, out x); int.TryParse(windowHeight.Text, out y); gs.WindowedSize = new int2(x,y); Game.Settings.Save(); Ui.CloseWindow(); }; } string open = null; bool FlipToTab(string id) { if (open != null) bg.Get(open).Visible = false; open = id; bg.Get(open).Visible = true; return true; } public static bool ShowSoundTickDropdown(DropDownButtonWidget dropdown, SoundSettings audio) { var options = new Dictionary() { { "Extreme", SoundCashTicks.Extreme }, { "Normal", SoundCashTicks.Normal }, { "Disabled", SoundCashTicks.Disabled }, }; Func setupItem = (o, itemTemplate) => { var item = ScrollItemWidget.Setup(itemTemplate, () => audio.SoundCashTickType == options[o], () => audio.SoundCashTickType = options[o]); item.Get("LABEL").GetText = () => o; return item; }; dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, options.Keys, setupItem); return true; } public static bool ShowWindowModeDropdown(DropDownButtonWidget dropdown, GraphicSettings s) { var options = new Dictionary() { { "Pseudo-Fullscreen", WindowMode.PseudoFullscreen }, { "Fullscreen", WindowMode.Fullscreen }, { "Windowed", WindowMode.Windowed }, }; Func setupItem = (o, itemTemplate) => { var item = ScrollItemWidget.Setup(itemTemplate, () => s.Mode == options[o], () => s.Mode = options[o]); item.Get("LABEL").GetText = () => o; return item; }; dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, options.Keys, setupItem); return true; } void SetupKeyBinding(TextFieldWidget textBox, Func getValue, Action setValue) { textBox.Text = getValue(); textBox.OnLoseFocus = () => { textBox.Text.Trim(); if (textBox.Text.Length == 0) textBox.Text = getValue(); else setValue(textBox.Text); }; textBox.OnEnterKey = () => { textBox.LoseFocus(); return true; }; } public static bool ShowRendererDropdown(DropDownButtonWidget dropdown, GraphicSettings s) { var options = new Dictionary() { { "OpenGL", "Gl" }, { "Cg Toolkit", "Cg" }, }; Func setupItem = (o, itemTemplate) => { var item = ScrollItemWidget.Setup(itemTemplate, () => s.Renderer == options[o], () => s.Renderer = options[o]); item.Get("LABEL").GetText = () => o; return item; }; dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, options.Keys, setupItem); return true; } } }