diff --git a/OpenRA.Game/Settings.cs b/OpenRA.Game/Settings.cs index 7a08cfa7b4..332983e5d9 100644 --- a/OpenRA.Game/Settings.cs +++ b/OpenRA.Game/Settings.cs @@ -271,6 +271,11 @@ namespace OpenRA "Legacy: OpenGL 2.1 with framebuffer_object extension (requires DisableLegacyGL: False)", "Automatic: Use the first supported profile.")] public GLProfile GLProfile = GLProfile.Automatic; + + public GraphicSettings Clone() + { + return (GraphicSettings)MemberwiseClone(); + } } [YamlNode("Sound", shared: true)] @@ -288,6 +293,11 @@ namespace OpenRA public bool CashTicks = true; public bool Mute = false; public bool MuteBackgroundMusic = false; + + public SoundSettings Clone() + { + return (SoundSettings)MemberwiseClone(); + } } [YamlNode("Player", shared: true)] diff --git a/OpenRA.Mods.Common/Widgets/Logic/IntroductionPromptLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/IntroductionPromptLogic.cs index 204cf1f4b5..c797d59a73 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/IntroductionPromptLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/IntroductionPromptLogic.cs @@ -39,9 +39,9 @@ namespace OpenRA.Mods.Common.Widgets.Logic [ObjectCreator.UseCtor] public IntroductionPromptLogic(Widget widget, ModData modData, WorldRenderer worldRenderer, Action onComplete) { - var ps = Game.Settings.Player; - var ds = Game.Settings.Graphics; - var gs = Game.Settings.Game; + var playerSettings = modData.GetSettings(); + var graphicSettings = modData.GetSettings(); + var gameSettings = modData.GetSettings(); classic = FluentProvider.GetMessage(Classic); modern = FluentProvider.GetMessage(Modern); @@ -49,7 +49,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic var escPressed = false; var nameTextfield = widget.Get("PLAYERNAME"); nameTextfield.IsDisabled = () => worldRenderer.World.Type != WorldType.Shellmap; - nameTextfield.Text = Settings.SanitizedPlayerName(ps.Name); + nameTextfield.Text = Settings.SanitizedPlayerName(playerSettings.Name); var itchIntegration = modData.GetOrCreate(); itchIntegration.GetPlayerName(name => nameTextfield.Text = Settings.SanitizedPlayerName(name)); @@ -64,93 +64,94 @@ namespace OpenRA.Mods.Common.Widgets.Logic nameTextfield.Text = nameTextfield.Text.Trim(); if (nameTextfield.Text.Length == 0) - nameTextfield.Text = Settings.SanitizedPlayerName(ps.Name); + nameTextfield.Text = Settings.SanitizedPlayerName(playerSettings.Name); else { nameTextfield.Text = Settings.SanitizedPlayerName(nameTextfield.Text); - ps.Name = nameTextfield.Text; + playerSettings.Name = nameTextfield.Text; } }; nameTextfield.OnEnterKey = _ => { nameTextfield.YieldKeyboardFocus(); return true; }; nameTextfield.OnEscKey = _ => { - nameTextfield.Text = Settings.SanitizedPlayerName(ps.Name); + nameTextfield.Text = Settings.SanitizedPlayerName(playerSettings.Name); escPressed = true; nameTextfield.YieldKeyboardFocus(); return true; }; var mouseControlDescClassic = widget.Get("MOUSE_CONTROL_DESC_CLASSIC"); - mouseControlDescClassic.IsVisible = () => gs.UseClassicMouseStyle; + mouseControlDescClassic.IsVisible = () => gameSettings.UseClassicMouseStyle; var mouseControlDescModern = widget.Get("MOUSE_CONTROL_DESC_MODERN"); - mouseControlDescModern.IsVisible = () => !gs.UseClassicMouseStyle; + mouseControlDescModern.IsVisible = () => !gameSettings.UseClassicMouseStyle; var mouseControlDropdown = widget.Get("MOUSE_CONTROL_DROPDOWN"); - mouseControlDropdown.OnMouseDown = _ => InputSettingsLogic.ShowMouseControlDropdown(mouseControlDropdown, gs); - mouseControlDropdown.GetText = () => gs.UseClassicMouseStyle ? classic : modern; + mouseControlDropdown.OnMouseDown = _ => InputSettingsLogic.ShowMouseControlDropdown(mouseControlDropdown, gameSettings); + mouseControlDropdown.GetText = () => gameSettings.UseClassicMouseStyle ? classic : modern; foreach (var container in new[] { mouseControlDescClassic, mouseControlDescModern }) { var classicScrollRight = container.Get("DESC_SCROLL_RIGHT"); - classicScrollRight.IsVisible = () => gs.UseClassicMouseStyle ^ gs.UseAlternateScrollButton; + classicScrollRight.IsVisible = () => gameSettings.UseClassicMouseStyle ^ gameSettings.UseAlternateScrollButton; var classicScrollMiddle = container.Get("DESC_SCROLL_MIDDLE"); - classicScrollMiddle.IsVisible = () => !gs.UseClassicMouseStyle ^ gs.UseAlternateScrollButton; + classicScrollMiddle.IsVisible = () => !gameSettings.UseClassicMouseStyle ^ gameSettings.UseAlternateScrollButton; var zoomDesc = container.Get("DESC_ZOOM"); - zoomDesc.IsVisible = () => gs.ZoomModifier == Modifiers.None; + zoomDesc.IsVisible = () => gameSettings.ZoomModifier == Modifiers.None; var zoomDescModifier = container.Get("DESC_ZOOM_MODIFIER"); - zoomDescModifier.IsVisible = () => gs.ZoomModifier != Modifiers.None; + zoomDescModifier.IsVisible = () => gameSettings.ZoomModifier != Modifiers.None; var zoomDescModifierTemplate = zoomDescModifier.GetText(); var zoomDescModifierLabel = new CachedTransform( mod => zoomDescModifierTemplate.Replace("MODIFIER", mod.ToString())); - zoomDescModifier.GetText = () => zoomDescModifierLabel.Update(gs.ZoomModifier); + zoomDescModifier.GetText = () => zoomDescModifierLabel.Update(gameSettings.ZoomModifier); var edgescrollDesc = container.Get("DESC_EDGESCROLL"); - edgescrollDesc.IsVisible = () => gs.ViewportEdgeScroll; + edgescrollDesc.IsVisible = () => gameSettings.ViewportEdgeScroll; } - SettingsUtils.BindCheckboxPref(widget, "EDGESCROLL_CHECKBOX", gs, "ViewportEdgeScroll"); + SettingsUtils.BindCheckboxPref(widget, "EDGESCROLL_CHECKBOX", gameSettings, "ViewportEdgeScroll"); var colorManager = modData.DefaultRules.Actors[SystemActors.World].TraitInfo(); var colorDropdown = widget.Get("PLAYERCOLOR"); colorDropdown.IsDisabled = () => worldRenderer.World.Type != WorldType.Shellmap; - colorDropdown.OnMouseDown = _ => colorManager.ShowColorDropDown(colorDropdown, ps.Color, null, worldRenderer, color => + colorDropdown.OnMouseDown = _ => colorManager.ShowColorDropDown(colorDropdown, playerSettings.Color, null, worldRenderer, color => { - ps.Color = color; + playerSettings.Color = color; Game.Settings.Save(); }); - colorDropdown.Get("COLORBLOCK").GetColor = () => ps.Color; + colorDropdown.Get("COLORBLOCK").GetColor = () => playerSettings.Color; var viewportSizes = modData.GetOrCreate(); var battlefieldCameraDropDown = widget.Get("BATTLEFIELD_CAMERA_DROPDOWN"); var battlefieldCameraLabel = new CachedTransform(vs => DisplaySettingsLogic.GetViewportSizeName(modData, vs)); - battlefieldCameraDropDown.OnMouseDown = _ => DisplaySettingsLogic.ShowBattlefieldCameraDropdown(modData, battlefieldCameraDropDown, viewportSizes, ds); - battlefieldCameraDropDown.GetText = () => battlefieldCameraLabel.Update(ds.ViewportDistance); + battlefieldCameraDropDown.OnMouseDown = _ => DisplaySettingsLogic.ShowBattlefieldCameraDropdown( + modData, battlefieldCameraDropDown, viewportSizes, graphicSettings); + battlefieldCameraDropDown.GetText = () => battlefieldCameraLabel.Update(graphicSettings.ViewportDistance); var uiScaleDropdown = widget.Get("UI_SCALE_DROPDOWN"); var uiScaleLabel = new CachedTransform(s => $"{(int)(100 * s)}%"); - uiScaleDropdown.OnMouseDown = _ => DisplaySettingsLogic.ShowUIScaleDropdown(uiScaleDropdown, ds); - uiScaleDropdown.GetText = () => uiScaleLabel.Update(ds.UIScale); + uiScaleDropdown.OnMouseDown = _ => DisplaySettingsLogic.ShowUIScaleDropdown(uiScaleDropdown, graphicSettings); + uiScaleDropdown.GetText = () => uiScaleLabel.Update(graphicSettings.UIScale); var minResolution = viewportSizes.MinEffectiveResolution; var resolution = Game.Renderer.Resolution; var disableUIScale = worldRenderer.World.Type != WorldType.Shellmap || - resolution.Width * ds.UIScale < 1.25f * minResolution.Width || - resolution.Height * ds.UIScale < 1.25f * minResolution.Height; + resolution.Width * graphicSettings.UIScale < 1.25f * minResolution.Width || + resolution.Height * graphicSettings.UIScale < 1.25f * minResolution.Height; uiScaleDropdown.IsDisabled = () => disableUIScale; - SettingsUtils.BindCheckboxPref(widget, "CURSORDOUBLE_CHECKBOX", ds, "CursorDouble"); + SettingsUtils.BindCheckboxPref(widget, "CURSORDOUBLE_CHECKBOX", graphicSettings, "CursorDouble"); widget.Get("CONTINUE_BUTTON").OnClick = () => { - Game.Settings.Game.IntroductionPromptVersion = IntroductionVersion; + gameSettings.IntroductionPromptVersion = IntroductionVersion; Game.Settings.Save(); Ui.CloseWindow(); onComplete(); diff --git a/OpenRA.Mods.Common/Widgets/Logic/Settings/AdvancedSettingsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Settings/AdvancedSettingsLogic.cs index 9fdd06d3c6..34a31f3c24 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Settings/AdvancedSettingsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Settings/AdvancedSettingsLogic.cs @@ -16,79 +16,75 @@ namespace OpenRA.Mods.Common.Widgets.Logic { public class AdvancedSettingsLogic : ChromeLogic { - static readonly bool OriginalServerDiscoverNatDevices; - - static AdvancedSettingsLogic() - { - var original = Game.Settings; - OriginalServerDiscoverNatDevices = original.Server.DiscoverNatDevices; - } + readonly DebugSettings debugSettings; + readonly GameSettings gameSettings; + readonly ServerSettings serverSettings; + static ServerSettings originalServerSettings; [ObjectCreator.UseCtor] - public AdvancedSettingsLogic(Action>, Func> registerPanel, string panelID, string label) + public AdvancedSettingsLogic(ModData modData, SettingsLogic settingsLogic, string panelID, string label) { - registerPanel(panelID, label, InitPanel, ResetPanel); + debugSettings = modData.GetSettings(); + gameSettings = modData.GetSettings(); + serverSettings = modData.GetSettings(); + originalServerSettings ??= serverSettings.Clone(); + settingsLogic.RegisterSettingsPanel(panelID, label, InitPanel, ResetPanel); } Func InitPanel(Widget panel) { - var ds = Game.Settings.Debug; - var ss = Game.Settings.Server; - var gs = Game.Settings.Game; var scrollPanel = panel.Get("SETTINGS_SCROLLPANEL"); // Advanced - SettingsUtils.BindCheckboxPref(panel, "NAT_DISCOVERY", ss, "DiscoverNatDevices"); - SettingsUtils.BindCheckboxPref(panel, "PERFTEXT_CHECKBOX", ds, "PerfText"); - SettingsUtils.BindCheckboxPref(panel, "PERFGRAPH_CHECKBOX", ds, "PerfGraph"); - SettingsUtils.BindCheckboxPref(panel, "FETCH_NEWS_CHECKBOX", gs, "FetchNews"); - SettingsUtils.BindCheckboxPref(panel, "SENDSYSINFO_CHECKBOX", ds, "SendSystemInformation"); - SettingsUtils.BindCheckboxPref(panel, "CHECK_VERSION_CHECKBOX", ds, "CheckVersion"); + SettingsUtils.BindCheckboxPref(panel, "NAT_DISCOVERY", serverSettings, "DiscoverNatDevices"); + SettingsUtils.BindCheckboxPref(panel, "PERFTEXT_CHECKBOX", debugSettings, "PerfText"); + SettingsUtils.BindCheckboxPref(panel, "PERFGRAPH_CHECKBOX", debugSettings, "PerfGraph"); + SettingsUtils.BindCheckboxPref(panel, "FETCH_NEWS_CHECKBOX", gameSettings, "FetchNews"); + SettingsUtils.BindCheckboxPref(panel, "SENDSYSINFO_CHECKBOX", debugSettings, "SendSystemInformation"); + SettingsUtils.BindCheckboxPref(panel, "CHECK_VERSION_CHECKBOX", debugSettings, "CheckVersion"); var ssi = panel.Get("SENDSYSINFO_CHECKBOX"); - ssi.IsDisabled = () => !gs.FetchNews; + ssi.IsDisabled = () => !gameSettings.FetchNews; // Developer - SettingsUtils.BindCheckboxPref(panel, "BOTDEBUG_CHECKBOX", ds, "BotDebug"); - SettingsUtils.BindCheckboxPref(panel, "LUADEBUG_CHECKBOX", ds, "LuaDebug"); - SettingsUtils.BindCheckboxPref(panel, "REPLAY_COMMANDS_CHECKBOX", ds, "EnableDebugCommandsInReplays"); - SettingsUtils.BindCheckboxPref(panel, "CHECKUNSYNCED_CHECKBOX", ds, "SyncCheckUnsyncedCode"); - SettingsUtils.BindCheckboxPref(panel, "CHECKBOTSYNC_CHECKBOX", ds, "SyncCheckBotModuleCode"); - SettingsUtils.BindCheckboxPref(panel, "PERFLOGGING_CHECKBOX", ds, "EnableSimulationPerfLogging"); + SettingsUtils.BindCheckboxPref(panel, "BOTDEBUG_CHECKBOX", debugSettings, "BotDebug"); + SettingsUtils.BindCheckboxPref(panel, "LUADEBUG_CHECKBOX", debugSettings, "LuaDebug"); + SettingsUtils.BindCheckboxPref(panel, "REPLAY_COMMANDS_CHECKBOX", debugSettings, "EnableDebugCommandsInReplays"); + SettingsUtils.BindCheckboxPref(panel, "CHECKUNSYNCED_CHECKBOX", debugSettings, "SyncCheckUnsyncedCode"); + SettingsUtils.BindCheckboxPref(panel, "CHECKBOTSYNC_CHECKBOX", debugSettings, "SyncCheckBotModuleCode"); + SettingsUtils.BindCheckboxPref(panel, "PERFLOGGING_CHECKBOX", debugSettings, "EnableSimulationPerfLogging"); - panel.Get("BOTDEBUG_CHECKBOX_CONTAINER").IsVisible = () => ds.DisplayDeveloperSettings; - panel.Get("CHECKUNSYNCED_CHECKBOX_CONTAINER").IsVisible = () => ds.DisplayDeveloperSettings; - panel.Get("CHECKBOTSYNC_CHECKBOX_CONTAINER").IsVisible = () => ds.DisplayDeveloperSettings; - panel.Get("LUADEBUG_CHECKBOX_CONTAINER").IsVisible = () => ds.DisplayDeveloperSettings; - panel.Get("REPLAY_COMMANDS_CHECKBOX_CONTAINER").IsVisible = () => ds.DisplayDeveloperSettings; - panel.Get("PERFLOGGING_CHECKBOX_CONTAINER").IsVisible = () => ds.DisplayDeveloperSettings; - panel.Get("DEBUG_HIDDEN_CONTAINER").IsVisible = () => !ds.DisplayDeveloperSettings; + panel.Get("BOTDEBUG_CHECKBOX_CONTAINER").IsVisible = () => debugSettings.DisplayDeveloperSettings; + panel.Get("CHECKUNSYNCED_CHECKBOX_CONTAINER").IsVisible = () => debugSettings.DisplayDeveloperSettings; + panel.Get("CHECKBOTSYNC_CHECKBOX_CONTAINER").IsVisible = () => debugSettings.DisplayDeveloperSettings; + panel.Get("LUADEBUG_CHECKBOX_CONTAINER").IsVisible = () => debugSettings.DisplayDeveloperSettings; + panel.Get("REPLAY_COMMANDS_CHECKBOX_CONTAINER").IsVisible = () => debugSettings.DisplayDeveloperSettings; + panel.Get("PERFLOGGING_CHECKBOX_CONTAINER").IsVisible = () => debugSettings.DisplayDeveloperSettings; + panel.Get("DEBUG_HIDDEN_CONTAINER").IsVisible = () => !debugSettings.DisplayDeveloperSettings; SettingsUtils.AdjustSettingsScrollPanelLayout(scrollPanel); - return () => ss.DiscoverNatDevices != OriginalServerDiscoverNatDevices; + return () => serverSettings.DiscoverNatDevices != originalServerSettings.DiscoverNatDevices; } Action ResetPanel(Widget panel) { - var ds = Game.Settings.Debug; - var ss = Game.Settings.Server; - var dds = new DebugSettings(); - var dss = new ServerSettings(); + var defaultDebugSettings = new DebugSettings(); + var defaultServerSettings = new ServerSettings(); return () => { - ss.DiscoverNatDevices = dss.DiscoverNatDevices; - ds.PerfText = dds.PerfText; - ds.PerfGraph = dds.PerfGraph; - ds.SyncCheckUnsyncedCode = dds.SyncCheckUnsyncedCode; - ds.SyncCheckBotModuleCode = dds.SyncCheckBotModuleCode; - ds.BotDebug = dds.BotDebug; - ds.LuaDebug = dds.LuaDebug; - ds.SendSystemInformation = dds.SendSystemInformation; - ds.CheckVersion = dds.CheckVersion; - ds.EnableDebugCommandsInReplays = dds.EnableDebugCommandsInReplays; - ds.EnableSimulationPerfLogging = dds.EnableSimulationPerfLogging; + serverSettings.DiscoverNatDevices = defaultServerSettings.DiscoverNatDevices; + debugSettings.PerfText = defaultDebugSettings.PerfText; + debugSettings.PerfGraph = defaultDebugSettings.PerfGraph; + debugSettings.SyncCheckUnsyncedCode = defaultDebugSettings.SyncCheckUnsyncedCode; + debugSettings.SyncCheckBotModuleCode = defaultDebugSettings.SyncCheckBotModuleCode; + debugSettings.BotDebug = defaultDebugSettings.BotDebug; + debugSettings.LuaDebug = defaultDebugSettings.LuaDebug; + debugSettings.SendSystemInformation = defaultDebugSettings.SendSystemInformation; + debugSettings.CheckVersion = defaultDebugSettings.CheckVersion; + debugSettings.EnableDebugCommandsInReplays = defaultDebugSettings.EnableDebugCommandsInReplays; + debugSettings.EnableSimulationPerfLogging = defaultDebugSettings.EnableSimulationPerfLogging; }; } } diff --git a/OpenRA.Mods.Common/Widgets/Logic/Settings/AudioSettingsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Settings/AudioSettingsLogic.cs index 4249ebd14d..851a147f00 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Settings/AudioSettingsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Settings/AudioSettingsLogic.cs @@ -20,43 +20,34 @@ namespace OpenRA.Mods.Common.Widgets.Logic { public class AudioSettingsLogic : ChromeLogic { - static readonly string OriginalSoundDevice; - readonly WorldRenderer worldRenderer; + readonly SoundSettings soundSettings; + static SoundSettings originalSoundSettings; SoundDevice soundDevice; - static AudioSettingsLogic() - { - var original = Game.Settings; - OriginalSoundDevice = original.Sound.Device; - } - [ObjectCreator.UseCtor] - public AudioSettingsLogic( - Action>, Func> registerPanel, - string panelID, - string label, - WorldRenderer worldRenderer) + public AudioSettingsLogic(ModData modData, SettingsLogic settingsLogic, string panelID, string label, WorldRenderer worldRenderer) { this.worldRenderer = worldRenderer; + soundSettings = modData.GetSettings(); + originalSoundSettings ??= soundSettings.Clone(); - registerPanel(panelID, label, InitPanel, ResetPanel); + settingsLogic.RegisterSettingsPanel(panelID, label, InitPanel, ResetPanel); } Func InitPanel(Widget panel) { var musicPlaylist = worldRenderer.World.WorldActor.Trait(); - var ss = Game.Settings.Sound; var scrollPanel = panel.Get("SETTINGS_SCROLLPANEL"); - SettingsUtils.BindCheckboxPref(panel, "CASH_TICKS", ss, "CashTicks"); - SettingsUtils.BindCheckboxPref(panel, "MUTE_SOUND", ss, "Mute"); - SettingsUtils.BindCheckboxPref(panel, "MUTE_BACKGROUND_MUSIC", ss, "MuteBackgroundMusic"); + SettingsUtils.BindCheckboxPref(panel, "CASH_TICKS", soundSettings, "CashTicks"); + SettingsUtils.BindCheckboxPref(panel, "MUTE_SOUND", soundSettings, "Mute"); + SettingsUtils.BindCheckboxPref(panel, "MUTE_BACKGROUND_MUSIC", soundSettings, "MuteBackgroundMusic"); - SettingsUtils.BindSliderPref(panel, "SOUND_VOLUME", ss, "SoundVolume"); - SettingsUtils.BindSliderPref(panel, "MUSIC_VOLUME", ss, "MusicVolume"); - SettingsUtils.BindSliderPref(panel, "VIDEO_VOLUME", ss, "VideoVolume"); + SettingsUtils.BindSliderPref(panel, "SOUND_VOLUME", soundSettings, "SoundVolume"); + SettingsUtils.BindSliderPref(panel, "MUSIC_VOLUME", soundSettings, "MusicVolume"); + SettingsUtils.BindSliderPref(panel, "VIDEO_VOLUME", soundSettings, "VideoVolume"); var muteCheckbox = panel.Get("MUTE_SOUND"); var muteCheckboxOnClick = muteCheckbox.OnClick; @@ -67,7 +58,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic { muteCheckboxOnClick(); - if (ss.Mute) + if (soundSettings.Mute) Game.Sound.MuteAudio(); else Game.Sound.UnmuteAudio(); @@ -108,7 +99,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic videoVolumeSlider.OnChange += x => Game.Sound.VideoVolume = x; var devices = Game.Sound.AvailableDevices(); - soundDevice = devices.FirstOrDefault(d => d.Device == ss.Device) ?? devices[0]; + soundDevice = devices.FirstOrDefault(d => d.Device == soundSettings.Device) ?? devices[0]; var audioDeviceDropdown = panel.Get("AUDIO_DEVICE"); audioDeviceDropdown.OnMouseDown = _ => ShowAudioDeviceDropdown(audioDeviceDropdown, devices, scrollPanel); @@ -119,38 +110,36 @@ namespace OpenRA.Mods.Common.Widgets.Logic audioDeviceDropdown.GetText = () => deviceLabel.Update(soundDevice); var restartDesc = panel.Get("AUDIO_RESTART_REQUIRED_DESC"); - restartDesc.IsVisible = () => soundDevice.Device != OriginalSoundDevice; + restartDesc.IsVisible = () => soundDevice.Device != originalSoundSettings.Device; SettingsUtils.AdjustSettingsScrollPanelLayout(scrollPanel); return () => { - ss.Device = soundDevice.Device; - - return ss.Device != OriginalSoundDevice; + soundSettings.Device = soundDevice.Device; + return soundSettings.Device != originalSoundSettings.Device; }; } Action ResetPanel(Widget panel) { - var ss = Game.Settings.Sound; - var dss = new SoundSettings(); + var defaultSoundSettings = new SoundSettings(); return () => { - ss.SoundVolume = dss.SoundVolume; - ss.MusicVolume = dss.MusicVolume; - ss.VideoVolume = dss.VideoVolume; - ss.CashTicks = dss.CashTicks; - ss.Mute = dss.Mute; - ss.MuteBackgroundMusic = dss.MuteBackgroundMusic; - ss.Device = dss.Device; + soundSettings.SoundVolume = defaultSoundSettings.SoundVolume; + soundSettings.MusicVolume = defaultSoundSettings.MusicVolume; + soundSettings.VideoVolume = defaultSoundSettings.VideoVolume; + soundSettings.CashTicks = defaultSoundSettings.CashTicks; + soundSettings.Mute = defaultSoundSettings.Mute; + soundSettings.MuteBackgroundMusic = defaultSoundSettings.MuteBackgroundMusic; + soundSettings.Device = defaultSoundSettings.Device; - panel.Get("SOUND_VOLUME").Value = ss.SoundVolume; - Game.Sound.SoundVolume = ss.SoundVolume; - panel.Get("MUSIC_VOLUME").Value = ss.MusicVolume; - Game.Sound.MusicVolume = ss.MusicVolume; - panel.Get("VIDEO_VOLUME").Value = ss.VideoVolume; - Game.Sound.VideoVolume = ss.VideoVolume; + panel.Get("SOUND_VOLUME").Value = soundSettings.SoundVolume; + Game.Sound.SoundVolume = soundSettings.SoundVolume; + panel.Get("MUSIC_VOLUME").Value = soundSettings.MusicVolume; + Game.Sound.MusicVolume = soundSettings.MusicVolume; + panel.Get("VIDEO_VOLUME").Value = soundSettings.VideoVolume; + Game.Sound.VideoVolume = soundSettings.VideoVolume; Game.Sound.UnmuteAudio(); soundDevice = Game.Sound.AvailableDevices().First(); }; diff --git a/OpenRA.Mods.Common/Widgets/Logic/Settings/DisplaySettingsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Settings/DisplaySettingsLogic.cs index 499a4faf57..70d606e861 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Settings/DisplaySettingsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Settings/DisplaySettingsLogic.cs @@ -67,15 +67,14 @@ namespace OpenRA.Mods.Common.Widgets.Logic [FluentReference("fps")] const string FrameLimiter = "checkbox-frame-limiter"; - static readonly int OriginalVideoDisplay; - static readonly WindowMode OriginalGraphicsMode; - static readonly int2 OriginalGraphicsWindowedSize; - static readonly int2 OriginalGraphicsFullscreenSize; - static readonly GLProfile OriginalGLProfile; readonly ModData modData; readonly WorldRenderer worldRenderer; readonly WorldViewportSizes viewportSizes; + readonly GameSettings gameSettings; + readonly GraphicSettings graphicSettings; + readonly PlayerSettings playerSettings; + static GraphicSettings originalGraphicSettings; readonly string showOnDamage; readonly string alwaysShow; @@ -87,29 +86,21 @@ namespace OpenRA.Mods.Common.Widgets.Logic readonly string legacyFullscreen; readonly string fullscreen; - static DisplaySettingsLogic() - { - var original = Game.Settings; - OriginalGraphicsMode = original.Graphics.Mode; - OriginalVideoDisplay = original.Graphics.VideoDisplay; - OriginalGraphicsWindowedSize = original.Graphics.WindowedSize; - OriginalGraphicsFullscreenSize = original.Graphics.FullscreenSize; - OriginalGLProfile = original.Graphics.GLProfile; - } - [ObjectCreator.UseCtor] - public DisplaySettingsLogic( - Action>, Func> registerPanel, - string panelID, string label, ModData modData, WorldRenderer worldRenderer) + public DisplaySettingsLogic(ModData modData, SettingsLogic settingsLogic, string panelID, string label, WorldRenderer worldRenderer) { this.worldRenderer = worldRenderer; this.modData = modData; viewportSizes = modData.GetOrCreate(); + gameSettings = modData.GetSettings(); + graphicSettings = modData.GetSettings(); + playerSettings = modData.GetSettings(); + originalGraphicSettings ??= graphicSettings.Clone(); legacyFullscreen = FluentProvider.GetMessage(LegacyFullscreen); fullscreen = FluentProvider.GetMessage(Fullscreen); - registerPanel(panelID, label, InitPanel, ResetPanel); + settingsLogic.RegisterSettingsPanel(panelID, label, InitPanel, ResetPanel); showOnDamage = FluentProvider.GetMessage(ShowOnDamage); alwaysShow = FluentProvider.GetMessage(AlwaysShow); @@ -138,72 +129,70 @@ namespace OpenRA.Mods.Common.Widgets.Logic Func InitPanel(Widget panel) { - var ds = Game.Settings.Graphics; - var gs = Game.Settings.Game; var world = worldRenderer.World; var scrollPanel = panel.Get("SETTINGS_SCROLLPANEL"); - SettingsUtils.BindCheckboxPref(panel, "CURSORDOUBLE_CHECKBOX", ds, "CursorDouble"); - SettingsUtils.BindCheckboxPref(panel, "VSYNC_CHECKBOX", ds, "VSync"); - SettingsUtils.BindCheckboxPref(panel, "FRAME_LIMIT_CHECKBOX", ds, "CapFramerate"); - SettingsUtils.BindCheckboxPref(panel, "FRAME_LIMIT_GAMESPEED_CHECKBOX", ds, "CapFramerateToGameFps"); - SettingsUtils.BindIntSliderPref(panel, "FRAME_LIMIT_SLIDER", ds, "MaxFramerate"); - SettingsUtils.BindCheckboxPref(panel, "PLAYER_STANCE_COLORS_CHECKBOX", gs, "UsePlayerStanceColors"); + SettingsUtils.BindCheckboxPref(panel, "CURSORDOUBLE_CHECKBOX", graphicSettings, "CursorDouble"); + SettingsUtils.BindCheckboxPref(panel, "VSYNC_CHECKBOX", graphicSettings, "VSync"); + SettingsUtils.BindCheckboxPref(panel, "FRAME_LIMIT_CHECKBOX", graphicSettings, "CapFramerate"); + SettingsUtils.BindCheckboxPref(panel, "FRAME_LIMIT_GAMESPEED_CHECKBOX", graphicSettings, "CapFramerateToGameFps"); + SettingsUtils.BindIntSliderPref(panel, "FRAME_LIMIT_SLIDER", graphicSettings, "MaxFramerate"); + SettingsUtils.BindCheckboxPref(panel, "PLAYER_STANCE_COLORS_CHECKBOX", gameSettings, "UsePlayerStanceColors"); var cb = panel.Get("PLAYER_STANCE_COLORS_CHECKBOX"); - cb.IsChecked = () => gs.UsePlayerStanceColors; + cb.IsChecked = () => gameSettings.UsePlayerStanceColors; cb.OnClick = () => { - gs.UsePlayerStanceColors = cb.IsChecked() ^ true; + gameSettings.UsePlayerStanceColors = cb.IsChecked() ^ true; Player.SetupRelationshipColors(world.Players, world.LocalPlayer, worldRenderer, false); }; if (panel.GetOrNull("PAUSE_SHELLMAP_CHECKBOX") != null) - SettingsUtils.BindCheckboxPref(panel, "PAUSE_SHELLMAP_CHECKBOX", gs, "PauseShellmap"); + SettingsUtils.BindCheckboxPref(panel, "PAUSE_SHELLMAP_CHECKBOX", gameSettings, "PauseShellmap"); - SettingsUtils.BindCheckboxPref(panel, "HIDE_REPLAY_CHAT_CHECKBOX", gs, "HideReplayChat"); + SettingsUtils.BindCheckboxPref(panel, "HIDE_REPLAY_CHAT_CHECKBOX", gameSettings, "HideReplayChat"); var windowModeDropdown = panel.Get("MODE_DROPDOWN"); - windowModeDropdown.OnMouseDown = _ => ShowWindowModeDropdown(windowModeDropdown, ds, scrollPanel); - windowModeDropdown.GetText = () => ds.Mode == WindowMode.Windowed + windowModeDropdown.OnMouseDown = _ => ShowWindowModeDropdown(windowModeDropdown, graphicSettings, scrollPanel); + windowModeDropdown.GetText = () => graphicSettings.Mode == WindowMode.Windowed ? FluentProvider.GetMessage(Windowed) - : ds.Mode == WindowMode.Fullscreen ? legacyFullscreen : fullscreen; + : graphicSettings.Mode == WindowMode.Fullscreen ? legacyFullscreen : fullscreen; var displaySelectionDropDown = panel.Get("DISPLAY_SELECTION_DROPDOWN"); - displaySelectionDropDown.OnMouseDown = _ => ShowDisplaySelectionDropdown(displaySelectionDropDown, ds); + displaySelectionDropDown.OnMouseDown = _ => ShowDisplaySelectionDropdown(displaySelectionDropDown, graphicSettings); var displaySelectionLabel = new CachedTransform(i => FluentProvider.GetMessage(Display, "number", i + 1)); - displaySelectionDropDown.GetText = () => displaySelectionLabel.Update(ds.VideoDisplay); + displaySelectionDropDown.GetText = () => displaySelectionLabel.Update(graphicSettings.VideoDisplay); displaySelectionDropDown.IsDisabled = () => Game.Renderer.DisplayCount < 2; var glProfileLabel = new CachedTransform(p => p.ToString()); var glProfileDropdown = panel.Get("GL_PROFILE_DROPDOWN"); - var disableProfile = Game.Renderer.SupportedGLProfiles.Length < 2 && ds.GLProfile == GLProfile.Automatic; - glProfileDropdown.OnMouseDown = _ => ShowGLProfileDropdown(glProfileDropdown, ds); - glProfileDropdown.GetText = () => glProfileLabel.Update(ds.GLProfile); + var disableProfile = Game.Renderer.SupportedGLProfiles.Length < 2 && graphicSettings.GLProfile == GLProfile.Automatic; + glProfileDropdown.OnMouseDown = _ => ShowGLProfileDropdown(glProfileDropdown, graphicSettings); + glProfileDropdown.GetText = () => glProfileLabel.Update(graphicSettings.GLProfile); glProfileDropdown.IsDisabled = () => disableProfile; var statusBarsDropDown = panel.Get("STATUS_BAR_DROPDOWN"); - statusBarsDropDown.OnMouseDown = _ => ShowStatusBarsDropdown(statusBarsDropDown, gs); - statusBarsDropDown.GetText = () => gs.StatusBars == StatusBarsType.Standard + statusBarsDropDown.OnMouseDown = _ => ShowStatusBarsDropdown(statusBarsDropDown, gameSettings); + statusBarsDropDown.GetText = () => gameSettings.StatusBars == StatusBarsType.Standard ? FluentProvider.GetMessage(Standard) - : gs.StatusBars == StatusBarsType.DamageShow + : gameSettings.StatusBars == StatusBarsType.DamageShow ? showOnDamage : alwaysShow; var targetLinesDropDown = panel.Get("TARGET_LINES_DROPDOWN"); - targetLinesDropDown.OnMouseDown = _ => ShowTargetLinesDropdown(targetLinesDropDown, gs); - targetLinesDropDown.GetText = () => gs.TargetLines == TargetLinesType.Automatic + targetLinesDropDown.OnMouseDown = _ => ShowTargetLinesDropdown(targetLinesDropDown, gameSettings); + targetLinesDropDown.GetText = () => gameSettings.TargetLines == TargetLinesType.Automatic ? automatic - : gs.TargetLines == TargetLinesType.Manual + : gameSettings.TargetLines == TargetLinesType.Manual ? manual : disabled; var battlefieldCameraDropDown = panel.Get("BATTLEFIELD_CAMERA_DROPDOWN"); var battlefieldCameraLabel = new CachedTransform(vs => GetViewportSizeName(modData, vs)); - battlefieldCameraDropDown.OnMouseDown = _ => ShowBattlefieldCameraDropdown(modData, battlefieldCameraDropDown, viewportSizes, ds); - battlefieldCameraDropDown.GetText = () => battlefieldCameraLabel.Update(ds.ViewportDistance); + battlefieldCameraDropDown.OnMouseDown = _ => ShowBattlefieldCameraDropdown(modData, battlefieldCameraDropDown, viewportSizes, graphicSettings); + battlefieldCameraDropDown.GetText = () => battlefieldCameraLabel.Update(graphicSettings.ViewportDistance); - BindTextNotificationPoolFilterSettings(panel, gs); + BindTextNotificationPoolFilterSettings(panel, gameSettings); // Update vsync immediately var vsyncCheckbox = panel.Get("VSYNC_CHECKBOX"); @@ -211,50 +200,49 @@ namespace OpenRA.Mods.Common.Widgets.Logic vsyncCheckbox.OnClick = () => { vsyncOnClick(); - Game.Renderer.SetVSyncEnabled(ds.VSync); + Game.Renderer.SetVSyncEnabled(graphicSettings.VSync); }; var uiScaleDropdown = panel.Get("UI_SCALE_DROPDOWN"); var uiScaleLabel = new CachedTransform(s => $"{(int)(100 * s)}%"); - uiScaleDropdown.OnMouseDown = _ => ShowUIScaleDropdown(uiScaleDropdown, ds); - uiScaleDropdown.GetText = () => uiScaleLabel.Update(ds.UIScale); + uiScaleDropdown.OnMouseDown = _ => ShowUIScaleDropdown(uiScaleDropdown, graphicSettings); + uiScaleDropdown.GetText = () => uiScaleLabel.Update(graphicSettings.UIScale); var minResolution = viewportSizes.MinEffectiveResolution; var resolution = Game.Renderer.Resolution; var disableUIScale = world.Type != WorldType.Shellmap || - resolution.Width * ds.UIScale < 1.25f * minResolution.Width || - resolution.Height * ds.UIScale < 1.25f * minResolution.Height; + resolution.Width * graphicSettings.UIScale < 1.25f * minResolution.Width || + resolution.Height * graphicSettings.UIScale < 1.25f * minResolution.Height; uiScaleDropdown.IsDisabled = () => disableUIScale; - panel.Get("DISPLAY_SELECTION_CONTAINER").IsVisible = () => ds.Mode != WindowMode.Windowed; - panel.Get("WINDOW_RESOLUTION_CONTAINER").IsVisible = () => ds.Mode == WindowMode.Windowed; + panel.Get("DISPLAY_SELECTION_CONTAINER").IsVisible = () => graphicSettings.Mode != WindowMode.Windowed; + panel.Get("WINDOW_RESOLUTION_CONTAINER").IsVisible = () => graphicSettings.Mode == WindowMode.Windowed; var windowWidth = panel.Get("WINDOW_WIDTH"); - var origWidthText = windowWidth.Text = ds.WindowedSize.X.ToString(NumberFormatInfo.CurrentInfo); + var origWidthText = windowWidth.Text = graphicSettings.WindowedSize.X.ToString(NumberFormatInfo.CurrentInfo); var windowHeight = panel.Get("WINDOW_HEIGHT"); - var origHeightText = windowHeight.Text = ds.WindowedSize.Y.ToString(NumberFormatInfo.CurrentInfo); - windowHeight.Text = ds.WindowedSize.Y.ToString(NumberFormatInfo.CurrentInfo); + var origHeightText = windowHeight.Text = graphicSettings.WindowedSize.Y.ToString(NumberFormatInfo.CurrentInfo); + windowHeight.Text = graphicSettings.WindowedSize.Y.ToString(NumberFormatInfo.CurrentInfo); var restartDesc = panel.Get("VIDEO_RESTART_REQUIRED_DESC"); - restartDesc.IsVisible = () => ds.Mode != OriginalGraphicsMode || ds.VideoDisplay != OriginalVideoDisplay || ds.GLProfile != OriginalGLProfile || - (ds.Mode == WindowMode.Windowed && (origWidthText != windowWidth.Text || origHeightText != windowHeight.Text)); + restartDesc.IsVisible = () => graphicSettings.Mode != originalGraphicSettings.Mode || + graphicSettings.VideoDisplay != originalGraphicSettings.VideoDisplay || + graphicSettings.GLProfile != originalGraphicSettings.GLProfile || + (graphicSettings.Mode == WindowMode.Windowed && (origWidthText != windowWidth.Text || origHeightText != windowHeight.Text)); var frameLimitGamespeedCheckbox = panel.Get("FRAME_LIMIT_GAMESPEED_CHECKBOX"); var frameLimitCheckbox = panel.Get("FRAME_LIMIT_CHECKBOX"); var frameLimitLabel = new CachedTransform(fps => FluentProvider.GetMessage(FrameLimiter, "fps", fps)); - frameLimitCheckbox.GetText = () => frameLimitLabel.Update(ds.MaxFramerate); - frameLimitCheckbox.IsDisabled = () => ds.CapFramerateToGameFps; + frameLimitCheckbox.GetText = () => frameLimitLabel.Update(graphicSettings.MaxFramerate); + frameLimitCheckbox.IsDisabled = () => graphicSettings.CapFramerateToGameFps; panel.Get("FRAME_LIMIT_SLIDER").IsDisabled = () => !frameLimitCheckbox.IsChecked() || frameLimitGamespeedCheckbox.IsChecked(); - // Player profile - var ps = Game.Settings.Player; - var escPressed = false; var nameTextfield = panel.Get("PLAYERNAME"); nameTextfield.IsDisabled = () => world.Type != WorldType.Shellmap; - nameTextfield.Text = Settings.SanitizedPlayerName(ps.Name); + nameTextfield.Text = Settings.SanitizedPlayerName(playerSettings.Name); nameTextfield.OnLoseFocus = () => { if (escPressed) @@ -265,18 +253,18 @@ namespace OpenRA.Mods.Common.Widgets.Logic nameTextfield.Text = nameTextfield.Text.Trim(); if (nameTextfield.Text.Length == 0) - nameTextfield.Text = Settings.SanitizedPlayerName(ps.Name); + nameTextfield.Text = Settings.SanitizedPlayerName(playerSettings.Name); else { nameTextfield.Text = Settings.SanitizedPlayerName(nameTextfield.Text); - ps.Name = nameTextfield.Text; + playerSettings.Name = nameTextfield.Text; } }; nameTextfield.OnEnterKey = _ => { nameTextfield.YieldKeyboardFocus(); return true; }; nameTextfield.OnEscKey = _ => { - nameTextfield.Text = Settings.SanitizedPlayerName(ps.Name); + nameTextfield.Text = Settings.SanitizedPlayerName(playerSettings.Name); escPressed = true; nameTextfield.YieldKeyboardFocus(); return true; @@ -286,12 +274,12 @@ namespace OpenRA.Mods.Common.Widgets.Logic var colorDropdown = panel.Get("PLAYERCOLOR"); colorDropdown.IsDisabled = () => world.Type != WorldType.Shellmap; - colorDropdown.OnMouseDown = _ => colorManager.ShowColorDropDown(colorDropdown, ps.Color, null, worldRenderer, color => + colorDropdown.OnMouseDown = _ => colorManager.ShowColorDropDown(colorDropdown, playerSettings.Color, null, worldRenderer, color => { - ps.Color = color; - Game.Settings.Save(); + playerSettings.Color = color; + playerSettings.Save(); }); - colorDropdown.Get("COLORBLOCK").GetColor = () => ps.Color; + colorDropdown.Get("COLORBLOCK").GetColor = () => playerSettings.Color; SettingsUtils.AdjustSettingsScrollPanelLayout(scrollPanel); @@ -299,54 +287,51 @@ namespace OpenRA.Mods.Common.Widgets.Logic { int.TryParse(windowWidth.Text, NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out var x); int.TryParse(windowHeight.Text, NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out var y); - ds.WindowedSize = new int2(x, y); + graphicSettings.WindowedSize = new int2(x, y); nameTextfield.YieldKeyboardFocus(); - return ds.Mode != OriginalGraphicsMode || - ds.VideoDisplay != OriginalVideoDisplay || - ds.WindowedSize != OriginalGraphicsWindowedSize || - ds.FullscreenSize != OriginalGraphicsFullscreenSize || - ds.GLProfile != OriginalGLProfile; + return graphicSettings.Mode != originalGraphicSettings.Mode || + graphicSettings.VideoDisplay != originalGraphicSettings.VideoDisplay || + graphicSettings.WindowedSize != originalGraphicSettings.WindowedSize || + graphicSettings.FullscreenSize != originalGraphicSettings.FullscreenSize || + graphicSettings.GLProfile != originalGraphicSettings.GLProfile; }; } Action ResetPanel(Widget panel) { - var ds = Game.Settings.Graphics; - var ps = Game.Settings.Player; - var gs = Game.Settings.Game; - var dds = new GraphicSettings(); - var dps = new PlayerSettings(); - var dgs = new GameSettings(); + var defaultGameSettings = new GameSettings(); + var defaultGraphicSettings = new GraphicSettings(); + var defaultPlayerSettings = new PlayerSettings(); return () => { - ds.CapFramerate = dds.CapFramerate; - ds.MaxFramerate = dds.MaxFramerate; - ds.CapFramerateToGameFps = dds.CapFramerateToGameFps; - ds.GLProfile = dds.GLProfile; - ds.Mode = dds.Mode; - ds.VideoDisplay = dds.VideoDisplay; - ds.WindowedSize = dds.WindowedSize; - ds.CursorDouble = dds.CursorDouble; - ds.ViewportDistance = dds.ViewportDistance; + graphicSettings.CapFramerate = defaultGraphicSettings.CapFramerate; + graphicSettings.MaxFramerate = defaultGraphicSettings.MaxFramerate; + graphicSettings.CapFramerateToGameFps = defaultGraphicSettings.CapFramerateToGameFps; + graphicSettings.GLProfile = defaultGraphicSettings.GLProfile; + graphicSettings.Mode = defaultGraphicSettings.Mode; + graphicSettings.VideoDisplay = defaultGraphicSettings.VideoDisplay; + graphicSettings.WindowedSize = defaultGraphicSettings.WindowedSize; + graphicSettings.CursorDouble = defaultGraphicSettings.CursorDouble; + graphicSettings.ViewportDistance = defaultGraphicSettings.ViewportDistance; - if (ds.UIScale != dds.UIScale) + if (graphicSettings.UIScale != defaultGraphicSettings.UIScale) { - var oldScale = ds.UIScale; - ds.UIScale = dds.UIScale; - Game.Renderer.SetUIScale(dds.UIScale); + var oldScale = graphicSettings.UIScale; + graphicSettings.UIScale = defaultGraphicSettings.UIScale; + Game.Renderer.SetUIScale(defaultGraphicSettings.UIScale); RecalculateWidgetLayout(Ui.Root); - Viewport.LastMousePos = (Viewport.LastMousePos.ToFloat2() * oldScale / ds.UIScale).ToInt2(); + Viewport.LastMousePos = (Viewport.LastMousePos.ToFloat2() * oldScale / graphicSettings.UIScale).ToInt2(); } - ps.Color = dps.Color; - ps.Name = dps.Name; + playerSettings.Color = defaultPlayerSettings.Color; + playerSettings.Name = defaultPlayerSettings.Name; - gs.TextNotificationPoolFilters = dgs.TextNotificationPoolFilters; + gameSettings.TextNotificationPoolFilters = defaultGameSettings.TextNotificationPoolFilters; }; } - static void ShowWindowModeDropdown(DropDownButtonWidget dropdown, GraphicSettings s, ScrollPanelWidget scrollPanel) + static void ShowWindowModeDropdown(DropDownButtonWidget dropdown, GraphicSettings graphicSettings, ScrollPanelWidget scrollPanel) { var options = new Dictionary() { @@ -358,10 +343,10 @@ namespace OpenRA.Mods.Common.Widgets.Logic ScrollItemWidget SetupItem(string o, ScrollItemWidget itemTemplate) { var item = ScrollItemWidget.Setup(itemTemplate, - () => s.Mode == options[o], + () => graphicSettings.Mode == options[o], () => { - s.Mode = options[o]; + graphicSettings.Mode = options[o]; SettingsUtils.AdjustSettingsScrollPanelLayout(scrollPanel); }); @@ -372,30 +357,30 @@ namespace OpenRA.Mods.Common.Widgets.Logic dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, options.Keys, SetupItem); } - public static void BindTextNotificationPoolFilterSettings(Widget panel, GameSettings gs) + public static void BindTextNotificationPoolFilterSettings(Widget panel, GameSettings gameSettings) { void ToggleFilterFlag(TextNotificationPoolFilters f) { - gs.TextNotificationPoolFilters ^= f; - Game.Settings.Save(); + gameSettings.TextNotificationPoolFilters ^= f; + gameSettings.Save(); } var feedbackCheckbox = panel.GetOrNull("UI_FEEDBACK_CHECKBOX"); if (feedbackCheckbox != null) { - feedbackCheckbox.IsChecked = () => gs.TextNotificationPoolFilters.HasFlag(TextNotificationPoolFilters.Feedback); + feedbackCheckbox.IsChecked = () => gameSettings.TextNotificationPoolFilters.HasFlag(TextNotificationPoolFilters.Feedback); feedbackCheckbox.OnClick = () => ToggleFilterFlag(TextNotificationPoolFilters.Feedback); } var transientsCheckbox = panel.GetOrNull("TRANSIENTS_CHECKBOX"); if (transientsCheckbox != null) { - transientsCheckbox.IsChecked = () => gs.TextNotificationPoolFilters.HasFlag(TextNotificationPoolFilters.Transients); + transientsCheckbox.IsChecked = () => gameSettings.TextNotificationPoolFilters.HasFlag(TextNotificationPoolFilters.Transients); transientsCheckbox.OnClick = () => ToggleFilterFlag(TextNotificationPoolFilters.Transients); } } - static void ShowStatusBarsDropdown(DropDownButtonWidget dropdown, GameSettings s) + static void ShowStatusBarsDropdown(DropDownButtonWidget dropdown, GameSettings gameSettings) { var options = new Dictionary() { @@ -407,8 +392,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic ScrollItemWidget SetupItem(string o, ScrollItemWidget itemTemplate) { var item = ScrollItemWidget.Setup(itemTemplate, - () => s.StatusBars == options[o], - () => s.StatusBars = options[o]); + () => gameSettings.StatusBars == options[o], + () => gameSettings.StatusBars = options[o]); item.Get("LABEL").GetText = () => o; return item; @@ -417,13 +402,13 @@ namespace OpenRA.Mods.Common.Widgets.Logic dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, options.Keys, SetupItem); } - static void ShowDisplaySelectionDropdown(DropDownButtonWidget dropdown, GraphicSettings s) + static void ShowDisplaySelectionDropdown(DropDownButtonWidget dropdown, GraphicSettings graphicSettings) { ScrollItemWidget SetupItem(int o, ScrollItemWidget itemTemplate) { var item = ScrollItemWidget.Setup(itemTemplate, - () => s.VideoDisplay == o, - () => s.VideoDisplay = o); + () => graphicSettings.VideoDisplay == o, + () => graphicSettings.VideoDisplay = o); var label = $"Display {o + 1}"; item.Get("LABEL").GetText = () => label; @@ -433,13 +418,13 @@ namespace OpenRA.Mods.Common.Widgets.Logic dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, Enumerable.Range(0, Game.Renderer.DisplayCount), SetupItem); } - static void ShowGLProfileDropdown(DropDownButtonWidget dropdown, GraphicSettings s) + static void ShowGLProfileDropdown(DropDownButtonWidget dropdown, GraphicSettings graphicSettings) { ScrollItemWidget SetupItem(GLProfile o, ScrollItemWidget itemTemplate) { var item = ScrollItemWidget.Setup(itemTemplate, - () => s.GLProfile == o, - () => s.GLProfile = o); + () => graphicSettings.GLProfile == o, + () => graphicSettings.GLProfile = o); var label = o.ToString(); item.Get("LABEL").GetText = () => label; @@ -450,7 +435,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, profiles, SetupItem); } - static void ShowTargetLinesDropdown(DropDownButtonWidget dropdown, GameSettings s) + static void ShowTargetLinesDropdown(DropDownButtonWidget dropdown, GameSettings gameSettings) { var options = new Dictionary() { @@ -462,8 +447,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic ScrollItemWidget SetupItem(string o, ScrollItemWidget itemTemplate) { var item = ScrollItemWidget.Setup(itemTemplate, - () => s.TargetLines == options[o], - () => s.TargetLines = options[o]); + () => gameSettings.TargetLines == options[o], + () => gameSettings.TargetLines = options[o]); item.Get("LABEL").GetText = () => o; return item; @@ -472,13 +457,14 @@ namespace OpenRA.Mods.Common.Widgets.Logic dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, options.Keys, SetupItem); } - public static void ShowBattlefieldCameraDropdown(ModData modData, DropDownButtonWidget dropdown, WorldViewportSizes viewportSizes, GraphicSettings gs) + public static void ShowBattlefieldCameraDropdown(ModData modData, DropDownButtonWidget dropdown, + WorldViewportSizes viewportSizes, GraphicSettings graphicSettings) { ScrollItemWidget SetupItem(WorldViewport o, ScrollItemWidget itemTemplate) { var item = ScrollItemWidget.Setup(itemTemplate, - () => gs.ViewportDistance == o, - () => gs.ViewportDistance = o); + () => graphicSettings.ViewportDistance == o, + () => graphicSettings.ViewportDistance = o); var label = GetViewportSizeName(modData, o); item.Get("LABEL").GetText = () => label; @@ -543,22 +529,22 @@ namespace OpenRA.Mods.Common.Widgets.Logic RecalculateWidgetLayout(c, insideScrollPanel || w is ScrollPanelWidget); } - public static void ShowUIScaleDropdown(DropDownButtonWidget dropdown, GraphicSettings gs) + public static void ShowUIScaleDropdown(DropDownButtonWidget dropdown, GraphicSettings graphicSettings) { ScrollItemWidget SetupItem(float o, ScrollItemWidget itemTemplate) { var item = ScrollItemWidget.Setup(itemTemplate, - () => gs.UIScale == o, + () => graphicSettings.UIScale == o, () => { Game.RunAfterTick(() => { - var oldScale = gs.UIScale; - gs.UIScale = o; + var oldScale = graphicSettings.UIScale; + graphicSettings.UIScale = o; Game.Renderer.SetUIScale(o); RecalculateWidgetLayout(Ui.Root); - Viewport.LastMousePos = (Viewport.LastMousePos.ToFloat2() * oldScale / gs.UIScale).ToInt2(); + Viewport.LastMousePos = (Viewport.LastMousePos.ToFloat2() * oldScale / graphicSettings.UIScale).ToInt2(); }); }); diff --git a/OpenRA.Mods.Common/Widgets/Logic/Settings/GamePlaySettingsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Settings/GamePlaySettingsLogic.cs index 95c047b311..48323b5033 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Settings/GamePlaySettingsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Settings/GamePlaySettingsLogic.cs @@ -35,11 +35,10 @@ namespace OpenRA.Mods.Common.Widgets.Logic readonly AutoSaveSettings autoSaveSettings; [ObjectCreator.UseCtor] - public GameplaySettingsLogic(ModData modData, Action>, Func> registerPanel, - string panelID, string label) + public GameplaySettingsLogic(ModData modData, SettingsLogic settingsLogic, string panelID, string label) { autoSaveSettings = modData.GetSettings(); - registerPanel(panelID, label, InitPanel, ResetPanel); + settingsLogic.RegisterSettingsPanel(panelID, label, InitPanel, ResetPanel); } Func InitPanel(Widget panel) @@ -79,7 +78,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic () => { autoSaveSettings.AutoSaveInterval = o; - Game.Settings.Save(); + autoSaveSettings.Save(); }); var deviceLabel = item.Get("LABEL"); @@ -100,7 +99,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic () => { autoSaveSettings.AutoSaveMaxFileCount = o; - Game.Settings.Save(); + autoSaveSettings.Save(); }); var deviceLabel = item.Get("LABEL"); diff --git a/OpenRA.Mods.Common/Widgets/Logic/Settings/HotkeysSettingsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Settings/HotkeysSettingsLogic.cs index eb7aaf4127..dd96f7d261 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Settings/HotkeysSettingsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Settings/HotkeysSettingsLogic.cs @@ -60,17 +60,13 @@ namespace OpenRA.Mods.Common.Widgets.Logic Widget emptyListMessage; Widget remapDialog; - static HotkeysSettingsLogic() { } - [ObjectCreator.UseCtor] - public HotkeysSettingsLogic( - Action>, Func> registerPanel, - string panelID, string label, ModData modData, Dictionary logicArgs) + public HotkeysSettingsLogic(ModData modData, SettingsLogic settingsLogic, string panelID, string label, Dictionary logicArgs) { this.modData = modData; this.logicArgs = logicArgs; - registerPanel(panelID, label, InitPanel, ResetPanel); + settingsLogic.RegisterSettingsPanel(panelID, label, InitPanel, ResetPanel); } void BindHotkeyPref(HotkeyDefinition hd, Widget template) diff --git a/OpenRA.Mods.Common/Widgets/Logic/Settings/InputSettingsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Settings/InputSettingsLogic.cs index 96f9eb7863..13eebc1fbc 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Settings/InputSettingsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Settings/InputSettingsLogic.cs @@ -36,71 +36,70 @@ namespace OpenRA.Mods.Common.Widgets.Logic [FluentReference] const string Joystick = "options-mouse-scroll-type.joystick"; - static InputSettingsLogic() { } - readonly string classic; readonly string modern; + readonly GameSettings gameSettings; [ObjectCreator.UseCtor] - public InputSettingsLogic(Action>, Func> registerPanel, string panelID, string label) + public InputSettingsLogic(ModData modData, SettingsLogic settingsLogic, string panelID, string label) { classic = FluentProvider.GetMessage(Classic); modern = FluentProvider.GetMessage(Modern); + gameSettings = modData.GetSettings(); - registerPanel(panelID, label, InitPanel, ResetPanel); + settingsLogic.RegisterSettingsPanel(panelID, label, InitPanel, ResetPanel); } Func InitPanel(Widget panel) { - var gs = Game.Settings.Game; var scrollPanel = panel.Get("SETTINGS_SCROLLPANEL"); - SettingsUtils.BindCheckboxPref(panel, "ALTERNATE_SCROLL_CHECKBOX", gs, "UseAlternateScrollButton"); - SettingsUtils.BindCheckboxPref(panel, "EDGESCROLL_CHECKBOX", gs, "ViewportEdgeScroll"); - SettingsUtils.BindCheckboxPref(panel, "LOCKMOUSE_CHECKBOX", gs, "LockMouseWindow"); - SettingsUtils.BindSliderPref(panel, "ZOOMSPEED_SLIDER", gs, "ZoomSpeed"); - SettingsUtils.BindSliderPref(panel, "SCROLLSPEED_SLIDER", gs, "ViewportEdgeScrollStep"); - SettingsUtils.BindSliderPref(panel, "UI_SCROLLSPEED_SLIDER", gs, "UIScrollSpeed"); + SettingsUtils.BindCheckboxPref(panel, "ALTERNATE_SCROLL_CHECKBOX", gameSettings, "UseAlternateScrollButton"); + SettingsUtils.BindCheckboxPref(panel, "EDGESCROLL_CHECKBOX", gameSettings, "ViewportEdgeScroll"); + SettingsUtils.BindCheckboxPref(panel, "LOCKMOUSE_CHECKBOX", gameSettings, "LockMouseWindow"); + SettingsUtils.BindSliderPref(panel, "ZOOMSPEED_SLIDER", gameSettings, "ZoomSpeed"); + SettingsUtils.BindSliderPref(panel, "SCROLLSPEED_SLIDER", gameSettings, "ViewportEdgeScrollStep"); + SettingsUtils.BindSliderPref(panel, "UI_SCROLLSPEED_SLIDER", gameSettings, "UIScrollSpeed"); var mouseControlDropdown = panel.Get("MOUSE_CONTROL_DROPDOWN"); - mouseControlDropdown.OnMouseDown = _ => ShowMouseControlDropdown(mouseControlDropdown, gs); - mouseControlDropdown.GetText = () => gs.UseClassicMouseStyle ? classic : modern; + mouseControlDropdown.OnMouseDown = _ => ShowMouseControlDropdown(mouseControlDropdown, gameSettings); + mouseControlDropdown.GetText = () => gameSettings.UseClassicMouseStyle ? classic : modern; var mouseScrollDropdown = panel.Get("MOUSE_SCROLL_TYPE_DROPDOWN"); - mouseScrollDropdown.OnMouseDown = _ => ShowMouseScrollDropdown(mouseScrollDropdown, gs); + mouseScrollDropdown.OnMouseDown = _ => ShowMouseScrollDropdown(mouseScrollDropdown, gameSettings); // MouseScroll can change, must display latest value. #pragma warning disable IDE0200 // Remove unnecessary lambda expression - mouseScrollDropdown.GetText = () => gs.MouseScroll.ToString(); + mouseScrollDropdown.GetText = () => gameSettings.MouseScroll.ToString(); #pragma warning restore IDE0200 var mouseControlDescClassic = panel.Get("MOUSE_CONTROL_DESC_CLASSIC"); - mouseControlDescClassic.IsVisible = () => gs.UseClassicMouseStyle; + mouseControlDescClassic.IsVisible = () => gameSettings.UseClassicMouseStyle; var mouseControlDescModern = panel.Get("MOUSE_CONTROL_DESC_MODERN"); - mouseControlDescModern.IsVisible = () => !gs.UseClassicMouseStyle; + mouseControlDescModern.IsVisible = () => !gameSettings.UseClassicMouseStyle; foreach (var container in new[] { mouseControlDescClassic, mouseControlDescModern }) { var classicScrollRight = container.Get("DESC_SCROLL_RIGHT"); - classicScrollRight.IsVisible = () => gs.UseClassicMouseStyle ^ gs.UseAlternateScrollButton; + classicScrollRight.IsVisible = () => gameSettings.UseClassicMouseStyle ^ gameSettings.UseAlternateScrollButton; var classicScrollMiddle = container.Get("DESC_SCROLL_MIDDLE"); - classicScrollMiddle.IsVisible = () => !gs.UseClassicMouseStyle ^ gs.UseAlternateScrollButton; + classicScrollMiddle.IsVisible = () => !gameSettings.UseClassicMouseStyle ^ gameSettings.UseAlternateScrollButton; var zoomDesc = container.Get("DESC_ZOOM"); - zoomDesc.IsVisible = () => gs.ZoomModifier == Modifiers.None; + zoomDesc.IsVisible = () => gameSettings.ZoomModifier == Modifiers.None; var zoomDescModifier = container.Get("DESC_ZOOM_MODIFIER"); - zoomDescModifier.IsVisible = () => gs.ZoomModifier != Modifiers.None; + zoomDescModifier.IsVisible = () => gameSettings.ZoomModifier != Modifiers.None; var zoomDescModifierTemplate = zoomDescModifier.GetText(); var zoomDescModifierLabel = new CachedTransform( mod => zoomDescModifierTemplate.Replace("MODIFIER", mod.ToString())); - zoomDescModifier.GetText = () => zoomDescModifierLabel.Update(gs.ZoomModifier); + zoomDescModifier.GetText = () => zoomDescModifierLabel.Update(gameSettings.ZoomModifier); var edgescrollDesc = container.Get("DESC_EDGESCROLL"); - edgescrollDesc.IsVisible = () => gs.ViewportEdgeScroll; + edgescrollDesc.IsVisible = () => gameSettings.ViewportEdgeScroll; } // Apply mouse focus preferences immediately @@ -112,15 +111,15 @@ namespace OpenRA.Mods.Common.Widgets.Logic // applying the changes live. oldOnClick(); - MakeMouseFocusSettingsLive(); + MakeMouseFocusSettingsLive(gameSettings); }; var zoomModifierDropdown = panel.Get("ZOOM_MODIFIER"); - zoomModifierDropdown.OnMouseDown = _ => ShowZoomModifierDropdown(zoomModifierDropdown, gs); + zoomModifierDropdown.OnMouseDown = _ => ShowZoomModifierDropdown(zoomModifierDropdown, gameSettings); // ZoomModifier can change, must display latest value. #pragma warning disable IDE0200 // Remove unnecessary lambda expression - zoomModifierDropdown.GetText = () => gs.ZoomModifier.ToString(); + zoomModifierDropdown.GetText = () => gameSettings.ZoomModifier.ToString(); #pragma warning restore IDE0200 SettingsUtils.AdjustSettingsScrollPanelLayout(scrollPanel); @@ -130,29 +129,28 @@ namespace OpenRA.Mods.Common.Widgets.Logic Action ResetPanel(Widget panel) { - var gs = Game.Settings.Game; - var dgs = new GameSettings(); + var defaultGameSettings = new GameSettings(); return () => { - gs.UseClassicMouseStyle = dgs.UseClassicMouseStyle; - gs.MouseScroll = dgs.MouseScroll; - gs.UseAlternateScrollButton = dgs.UseAlternateScrollButton; - gs.LockMouseWindow = dgs.LockMouseWindow; - gs.ViewportEdgeScroll = dgs.ViewportEdgeScroll; - gs.ViewportEdgeScrollStep = dgs.ViewportEdgeScrollStep; - gs.ZoomSpeed = dgs.ZoomSpeed; - gs.UIScrollSpeed = dgs.UIScrollSpeed; - gs.ZoomModifier = dgs.ZoomModifier; + gameSettings.UseClassicMouseStyle = defaultGameSettings.UseClassicMouseStyle; + gameSettings.MouseScroll = defaultGameSettings.MouseScroll; + gameSettings.UseAlternateScrollButton = defaultGameSettings.UseAlternateScrollButton; + gameSettings.LockMouseWindow = defaultGameSettings.LockMouseWindow; + gameSettings.ViewportEdgeScroll = defaultGameSettings.ViewportEdgeScroll; + gameSettings.ViewportEdgeScrollStep = defaultGameSettings.ViewportEdgeScrollStep; + gameSettings.ZoomSpeed = defaultGameSettings.ZoomSpeed; + gameSettings.UIScrollSpeed = defaultGameSettings.UIScrollSpeed; + gameSettings.ZoomModifier = defaultGameSettings.ZoomModifier; - panel.Get("SCROLLSPEED_SLIDER").Value = gs.ViewportEdgeScrollStep; - panel.Get("UI_SCROLLSPEED_SLIDER").Value = gs.UIScrollSpeed; + panel.Get("SCROLLSPEED_SLIDER").Value = gameSettings.ViewportEdgeScrollStep; + panel.Get("UI_SCROLLSPEED_SLIDER").Value = gameSettings.UIScrollSpeed; - MakeMouseFocusSettingsLive(); + MakeMouseFocusSettingsLive(gameSettings); }; } - public static void ShowMouseControlDropdown(DropDownButtonWidget dropdown, GameSettings s) + public static void ShowMouseControlDropdown(DropDownButtonWidget dropdown, GameSettings gameSettings) { var options = new Dictionary() { @@ -163,8 +161,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic ScrollItemWidget SetupItem(string o, ScrollItemWidget itemTemplate) { var item = ScrollItemWidget.Setup(itemTemplate, - () => s.UseClassicMouseStyle == options[o], - () => s.UseClassicMouseStyle = options[o]); + () => gameSettings.UseClassicMouseStyle == options[o], + () => gameSettings.UseClassicMouseStyle = options[o]); item.Get("LABEL").GetText = () => o; return item; } @@ -172,7 +170,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, options.Keys, SetupItem); } - static void ShowMouseScrollDropdown(DropDownButtonWidget dropdown, GameSettings s) + static void ShowMouseScrollDropdown(DropDownButtonWidget dropdown, GameSettings gameSettings) { var options = new Dictionary() { @@ -185,8 +183,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic ScrollItemWidget SetupItem(string o, ScrollItemWidget itemTemplate) { var item = ScrollItemWidget.Setup(itemTemplate, - () => s.MouseScroll == options[o], - () => s.MouseScroll = options[o]); + () => gameSettings.MouseScroll == options[o], + () => gameSettings.MouseScroll = options[o]); item.Get("LABEL").GetText = () => o; return item; } @@ -194,7 +192,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, options.Keys, SetupItem); } - static void ShowZoomModifierDropdown(DropDownButtonWidget dropdown, GameSettings s) + static void ShowZoomModifierDropdown(DropDownButtonWidget dropdown, GameSettings gameSettings) { var options = new Dictionary() { @@ -208,8 +206,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic ScrollItemWidget SetupItem(string o, ScrollItemWidget itemTemplate) { var item = ScrollItemWidget.Setup(itemTemplate, - () => s.ZoomModifier == options[o], - () => s.ZoomModifier = options[o]); + () => gameSettings.ZoomModifier == options[o], + () => gameSettings.ZoomModifier = options[o]); item.Get("LABEL").GetText = () => o; return item; } @@ -217,10 +215,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, options.Keys, SetupItem); } - static void MakeMouseFocusSettingsLive() + static void MakeMouseFocusSettingsLive(GameSettings gameSettings) { - var gameSettings = Game.Settings.Game; - if (gameSettings.LockMouseWindow) Game.Renderer.GrabWindowMouseFocus(); else diff --git a/OpenRA.Mods.Common/Widgets/Logic/Settings/SettingsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Settings/SettingsLogic.cs index eca56a13ea..93139f3f99 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Settings/SettingsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Settings/SettingsLogic.cs @@ -17,7 +17,12 @@ using OpenRA.Widgets; namespace OpenRA.Mods.Common.Widgets.Logic { - public class SettingsLogic : ChromeLogic + public interface ISettingsLogic + { + void RegisterSettingsPanel(string panelID, string label, Func> init, Func reset); + } + + public class SettingsLogic : ChromeLogic, ISettingsLogic { [FluentReference] const string SettingsSaveTitle = "dialog-settings-save.title"; @@ -64,8 +69,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic bool needsRestart = false; - static SettingsLogic() { } - [ObjectCreator.UseCtor] public SettingsLogic(Widget widget, Action onExit, WorldRenderer worldRenderer, Dictionary logicArgs, ModData modData) { @@ -92,7 +95,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic Game.LoadWidget(worldRenderer.World, panel.Key, container, new WidgetArgs() { - { "registerPanel", (Action>, Func>)RegisterSettingsPanel }, + { "settingsLogic", this }, { "panelID", panel.Key }, { "label", panel.Value } }); @@ -102,8 +105,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic widget.Get("BACK_BUTTON").OnClick = () => { needsRestart |= leavePanelActions[activePanel](); - var current = Game.Settings; - current.Save(); + Game.Settings.Save(); void CloseAndExit() { Ui.CloseWindow(); onExit(); } if (needsRestart)