Standardize and simplify settings menu settings access.

This commit is contained in:
Paul Chote
2025-12-12 15:08:04 +00:00
committed by Gustas Kažukauskas
parent 2e16ad47e5
commit ec75dcd9e9
9 changed files with 293 additions and 318 deletions

View File

@@ -271,6 +271,11 @@ namespace OpenRA
"Legacy: OpenGL 2.1 with framebuffer_object extension (requires DisableLegacyGL: False)", "Legacy: OpenGL 2.1 with framebuffer_object extension (requires DisableLegacyGL: False)",
"Automatic: Use the first supported profile.")] "Automatic: Use the first supported profile.")]
public GLProfile GLProfile = GLProfile.Automatic; public GLProfile GLProfile = GLProfile.Automatic;
public GraphicSettings Clone()
{
return (GraphicSettings)MemberwiseClone();
}
} }
[YamlNode("Sound", shared: true)] [YamlNode("Sound", shared: true)]
@@ -288,6 +293,11 @@ namespace OpenRA
public bool CashTicks = true; public bool CashTicks = true;
public bool Mute = false; public bool Mute = false;
public bool MuteBackgroundMusic = false; public bool MuteBackgroundMusic = false;
public SoundSettings Clone()
{
return (SoundSettings)MemberwiseClone();
}
} }
[YamlNode("Player", shared: true)] [YamlNode("Player", shared: true)]

View File

@@ -39,9 +39,9 @@ namespace OpenRA.Mods.Common.Widgets.Logic
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public IntroductionPromptLogic(Widget widget, ModData modData, WorldRenderer worldRenderer, Action onComplete) public IntroductionPromptLogic(Widget widget, ModData modData, WorldRenderer worldRenderer, Action onComplete)
{ {
var ps = Game.Settings.Player; var playerSettings = modData.GetSettings<PlayerSettings>();
var ds = Game.Settings.Graphics; var graphicSettings = modData.GetSettings<GraphicSettings>();
var gs = Game.Settings.Game; var gameSettings = modData.GetSettings<GameSettings>();
classic = FluentProvider.GetMessage(Classic); classic = FluentProvider.GetMessage(Classic);
modern = FluentProvider.GetMessage(Modern); modern = FluentProvider.GetMessage(Modern);
@@ -49,7 +49,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
var escPressed = false; var escPressed = false;
var nameTextfield = widget.Get<TextFieldWidget>("PLAYERNAME"); var nameTextfield = widget.Get<TextFieldWidget>("PLAYERNAME");
nameTextfield.IsDisabled = () => worldRenderer.World.Type != WorldType.Shellmap; nameTextfield.IsDisabled = () => worldRenderer.World.Type != WorldType.Shellmap;
nameTextfield.Text = Settings.SanitizedPlayerName(ps.Name); nameTextfield.Text = Settings.SanitizedPlayerName(playerSettings.Name);
var itchIntegration = modData.GetOrCreate<ItchIntegration>(); var itchIntegration = modData.GetOrCreate<ItchIntegration>();
itchIntegration.GetPlayerName(name => nameTextfield.Text = Settings.SanitizedPlayerName(name)); itchIntegration.GetPlayerName(name => nameTextfield.Text = Settings.SanitizedPlayerName(name));
@@ -64,93 +64,94 @@ namespace OpenRA.Mods.Common.Widgets.Logic
nameTextfield.Text = nameTextfield.Text.Trim(); nameTextfield.Text = nameTextfield.Text.Trim();
if (nameTextfield.Text.Length == 0) if (nameTextfield.Text.Length == 0)
nameTextfield.Text = Settings.SanitizedPlayerName(ps.Name); nameTextfield.Text = Settings.SanitizedPlayerName(playerSettings.Name);
else else
{ {
nameTextfield.Text = Settings.SanitizedPlayerName(nameTextfield.Text); nameTextfield.Text = Settings.SanitizedPlayerName(nameTextfield.Text);
ps.Name = nameTextfield.Text; playerSettings.Name = nameTextfield.Text;
} }
}; };
nameTextfield.OnEnterKey = _ => { nameTextfield.YieldKeyboardFocus(); return true; }; nameTextfield.OnEnterKey = _ => { nameTextfield.YieldKeyboardFocus(); return true; };
nameTextfield.OnEscKey = _ => nameTextfield.OnEscKey = _ =>
{ {
nameTextfield.Text = Settings.SanitizedPlayerName(ps.Name); nameTextfield.Text = Settings.SanitizedPlayerName(playerSettings.Name);
escPressed = true; escPressed = true;
nameTextfield.YieldKeyboardFocus(); nameTextfield.YieldKeyboardFocus();
return true; return true;
}; };
var mouseControlDescClassic = widget.Get("MOUSE_CONTROL_DESC_CLASSIC"); var mouseControlDescClassic = widget.Get("MOUSE_CONTROL_DESC_CLASSIC");
mouseControlDescClassic.IsVisible = () => gs.UseClassicMouseStyle; mouseControlDescClassic.IsVisible = () => gameSettings.UseClassicMouseStyle;
var mouseControlDescModern = widget.Get("MOUSE_CONTROL_DESC_MODERN"); var mouseControlDescModern = widget.Get("MOUSE_CONTROL_DESC_MODERN");
mouseControlDescModern.IsVisible = () => !gs.UseClassicMouseStyle; mouseControlDescModern.IsVisible = () => !gameSettings.UseClassicMouseStyle;
var mouseControlDropdown = widget.Get<DropDownButtonWidget>("MOUSE_CONTROL_DROPDOWN"); var mouseControlDropdown = widget.Get<DropDownButtonWidget>("MOUSE_CONTROL_DROPDOWN");
mouseControlDropdown.OnMouseDown = _ => InputSettingsLogic.ShowMouseControlDropdown(mouseControlDropdown, gs); mouseControlDropdown.OnMouseDown = _ => InputSettingsLogic.ShowMouseControlDropdown(mouseControlDropdown, gameSettings);
mouseControlDropdown.GetText = () => gs.UseClassicMouseStyle ? classic : modern; mouseControlDropdown.GetText = () => gameSettings.UseClassicMouseStyle ? classic : modern;
foreach (var container in new[] { mouseControlDescClassic, mouseControlDescModern }) foreach (var container in new[] { mouseControlDescClassic, mouseControlDescModern })
{ {
var classicScrollRight = container.Get("DESC_SCROLL_RIGHT"); 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"); 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"); var zoomDesc = container.Get("DESC_ZOOM");
zoomDesc.IsVisible = () => gs.ZoomModifier == Modifiers.None; zoomDesc.IsVisible = () => gameSettings.ZoomModifier == Modifiers.None;
var zoomDescModifier = container.Get<LabelWidget>("DESC_ZOOM_MODIFIER"); var zoomDescModifier = container.Get<LabelWidget>("DESC_ZOOM_MODIFIER");
zoomDescModifier.IsVisible = () => gs.ZoomModifier != Modifiers.None; zoomDescModifier.IsVisible = () => gameSettings.ZoomModifier != Modifiers.None;
var zoomDescModifierTemplate = zoomDescModifier.GetText(); var zoomDescModifierTemplate = zoomDescModifier.GetText();
var zoomDescModifierLabel = new CachedTransform<Modifiers, string>( var zoomDescModifierLabel = new CachedTransform<Modifiers, string>(
mod => zoomDescModifierTemplate.Replace("MODIFIER", mod.ToString())); mod => zoomDescModifierTemplate.Replace("MODIFIER", mod.ToString()));
zoomDescModifier.GetText = () => zoomDescModifierLabel.Update(gs.ZoomModifier); zoomDescModifier.GetText = () => zoomDescModifierLabel.Update(gameSettings.ZoomModifier);
var edgescrollDesc = container.Get<LabelWidget>("DESC_EDGESCROLL"); var edgescrollDesc = container.Get<LabelWidget>("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<IColorPickerManagerInfo>(); var colorManager = modData.DefaultRules.Actors[SystemActors.World].TraitInfo<IColorPickerManagerInfo>();
var colorDropdown = widget.Get<DropDownButtonWidget>("PLAYERCOLOR"); var colorDropdown = widget.Get<DropDownButtonWidget>("PLAYERCOLOR");
colorDropdown.IsDisabled = () => worldRenderer.World.Type != WorldType.Shellmap; 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(); Game.Settings.Save();
}); });
colorDropdown.Get<ColorBlockWidget>("COLORBLOCK").GetColor = () => ps.Color; colorDropdown.Get<ColorBlockWidget>("COLORBLOCK").GetColor = () => playerSettings.Color;
var viewportSizes = modData.GetOrCreate<WorldViewportSizes>(); var viewportSizes = modData.GetOrCreate<WorldViewportSizes>();
var battlefieldCameraDropDown = widget.Get<DropDownButtonWidget>("BATTLEFIELD_CAMERA_DROPDOWN"); var battlefieldCameraDropDown = widget.Get<DropDownButtonWidget>("BATTLEFIELD_CAMERA_DROPDOWN");
var battlefieldCameraLabel = new CachedTransform<WorldViewport, string>(vs => DisplaySettingsLogic.GetViewportSizeName(modData, vs)); var battlefieldCameraLabel = new CachedTransform<WorldViewport, string>(vs => DisplaySettingsLogic.GetViewportSizeName(modData, vs));
battlefieldCameraDropDown.OnMouseDown = _ => DisplaySettingsLogic.ShowBattlefieldCameraDropdown(modData, battlefieldCameraDropDown, viewportSizes, ds); battlefieldCameraDropDown.OnMouseDown = _ => DisplaySettingsLogic.ShowBattlefieldCameraDropdown(
battlefieldCameraDropDown.GetText = () => battlefieldCameraLabel.Update(ds.ViewportDistance); modData, battlefieldCameraDropDown, viewportSizes, graphicSettings);
battlefieldCameraDropDown.GetText = () => battlefieldCameraLabel.Update(graphicSettings.ViewportDistance);
var uiScaleDropdown = widget.Get<DropDownButtonWidget>("UI_SCALE_DROPDOWN"); var uiScaleDropdown = widget.Get<DropDownButtonWidget>("UI_SCALE_DROPDOWN");
var uiScaleLabel = new CachedTransform<float, string>(s => $"{(int)(100 * s)}%"); var uiScaleLabel = new CachedTransform<float, string>(s => $"{(int)(100 * s)}%");
uiScaleDropdown.OnMouseDown = _ => DisplaySettingsLogic.ShowUIScaleDropdown(uiScaleDropdown, ds); uiScaleDropdown.OnMouseDown = _ => DisplaySettingsLogic.ShowUIScaleDropdown(uiScaleDropdown, graphicSettings);
uiScaleDropdown.GetText = () => uiScaleLabel.Update(ds.UIScale); uiScaleDropdown.GetText = () => uiScaleLabel.Update(graphicSettings.UIScale);
var minResolution = viewportSizes.MinEffectiveResolution; var minResolution = viewportSizes.MinEffectiveResolution;
var resolution = Game.Renderer.Resolution; var resolution = Game.Renderer.Resolution;
var disableUIScale = worldRenderer.World.Type != WorldType.Shellmap || var disableUIScale = worldRenderer.World.Type != WorldType.Shellmap ||
resolution.Width * ds.UIScale < 1.25f * minResolution.Width || resolution.Width * graphicSettings.UIScale < 1.25f * minResolution.Width ||
resolution.Height * ds.UIScale < 1.25f * minResolution.Height; resolution.Height * graphicSettings.UIScale < 1.25f * minResolution.Height;
uiScaleDropdown.IsDisabled = () => disableUIScale; uiScaleDropdown.IsDisabled = () => disableUIScale;
SettingsUtils.BindCheckboxPref(widget, "CURSORDOUBLE_CHECKBOX", ds, "CursorDouble"); SettingsUtils.BindCheckboxPref(widget, "CURSORDOUBLE_CHECKBOX", graphicSettings, "CursorDouble");
widget.Get<ButtonWidget>("CONTINUE_BUTTON").OnClick = () => widget.Get<ButtonWidget>("CONTINUE_BUTTON").OnClick = () =>
{ {
Game.Settings.Game.IntroductionPromptVersion = IntroductionVersion; gameSettings.IntroductionPromptVersion = IntroductionVersion;
Game.Settings.Save(); Game.Settings.Save();
Ui.CloseWindow(); Ui.CloseWindow();
onComplete(); onComplete();

View File

@@ -16,79 +16,75 @@ namespace OpenRA.Mods.Common.Widgets.Logic
{ {
public class AdvancedSettingsLogic : ChromeLogic public class AdvancedSettingsLogic : ChromeLogic
{ {
static readonly bool OriginalServerDiscoverNatDevices; readonly DebugSettings debugSettings;
readonly GameSettings gameSettings;
static AdvancedSettingsLogic() readonly ServerSettings serverSettings;
{ static ServerSettings originalServerSettings;
var original = Game.Settings;
OriginalServerDiscoverNatDevices = original.Server.DiscoverNatDevices;
}
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public AdvancedSettingsLogic(Action<string, string, Func<Widget, Func<bool>>, Func<Widget, Action>> registerPanel, string panelID, string label) public AdvancedSettingsLogic(ModData modData, SettingsLogic settingsLogic, string panelID, string label)
{ {
registerPanel(panelID, label, InitPanel, ResetPanel); debugSettings = modData.GetSettings<DebugSettings>();
gameSettings = modData.GetSettings<GameSettings>();
serverSettings = modData.GetSettings<ServerSettings>();
originalServerSettings ??= serverSettings.Clone();
settingsLogic.RegisterSettingsPanel(panelID, label, InitPanel, ResetPanel);
} }
Func<bool> InitPanel(Widget panel) Func<bool> InitPanel(Widget panel)
{ {
var ds = Game.Settings.Debug;
var ss = Game.Settings.Server;
var gs = Game.Settings.Game;
var scrollPanel = panel.Get<ScrollPanelWidget>("SETTINGS_SCROLLPANEL"); var scrollPanel = panel.Get<ScrollPanelWidget>("SETTINGS_SCROLLPANEL");
// Advanced // Advanced
SettingsUtils.BindCheckboxPref(panel, "NAT_DISCOVERY", ss, "DiscoverNatDevices"); SettingsUtils.BindCheckboxPref(panel, "NAT_DISCOVERY", serverSettings, "DiscoverNatDevices");
SettingsUtils.BindCheckboxPref(panel, "PERFTEXT_CHECKBOX", ds, "PerfText"); SettingsUtils.BindCheckboxPref(panel, "PERFTEXT_CHECKBOX", debugSettings, "PerfText");
SettingsUtils.BindCheckboxPref(panel, "PERFGRAPH_CHECKBOX", ds, "PerfGraph"); SettingsUtils.BindCheckboxPref(panel, "PERFGRAPH_CHECKBOX", debugSettings, "PerfGraph");
SettingsUtils.BindCheckboxPref(panel, "FETCH_NEWS_CHECKBOX", gs, "FetchNews"); SettingsUtils.BindCheckboxPref(panel, "FETCH_NEWS_CHECKBOX", gameSettings, "FetchNews");
SettingsUtils.BindCheckboxPref(panel, "SENDSYSINFO_CHECKBOX", ds, "SendSystemInformation"); SettingsUtils.BindCheckboxPref(panel, "SENDSYSINFO_CHECKBOX", debugSettings, "SendSystemInformation");
SettingsUtils.BindCheckboxPref(panel, "CHECK_VERSION_CHECKBOX", ds, "CheckVersion"); SettingsUtils.BindCheckboxPref(panel, "CHECK_VERSION_CHECKBOX", debugSettings, "CheckVersion");
var ssi = panel.Get<CheckboxWidget>("SENDSYSINFO_CHECKBOX"); var ssi = panel.Get<CheckboxWidget>("SENDSYSINFO_CHECKBOX");
ssi.IsDisabled = () => !gs.FetchNews; ssi.IsDisabled = () => !gameSettings.FetchNews;
// Developer // Developer
SettingsUtils.BindCheckboxPref(panel, "BOTDEBUG_CHECKBOX", ds, "BotDebug"); SettingsUtils.BindCheckboxPref(panel, "BOTDEBUG_CHECKBOX", debugSettings, "BotDebug");
SettingsUtils.BindCheckboxPref(panel, "LUADEBUG_CHECKBOX", ds, "LuaDebug"); SettingsUtils.BindCheckboxPref(panel, "LUADEBUG_CHECKBOX", debugSettings, "LuaDebug");
SettingsUtils.BindCheckboxPref(panel, "REPLAY_COMMANDS_CHECKBOX", ds, "EnableDebugCommandsInReplays"); SettingsUtils.BindCheckboxPref(panel, "REPLAY_COMMANDS_CHECKBOX", debugSettings, "EnableDebugCommandsInReplays");
SettingsUtils.BindCheckboxPref(panel, "CHECKUNSYNCED_CHECKBOX", ds, "SyncCheckUnsyncedCode"); SettingsUtils.BindCheckboxPref(panel, "CHECKUNSYNCED_CHECKBOX", debugSettings, "SyncCheckUnsyncedCode");
SettingsUtils.BindCheckboxPref(panel, "CHECKBOTSYNC_CHECKBOX", ds, "SyncCheckBotModuleCode"); SettingsUtils.BindCheckboxPref(panel, "CHECKBOTSYNC_CHECKBOX", debugSettings, "SyncCheckBotModuleCode");
SettingsUtils.BindCheckboxPref(panel, "PERFLOGGING_CHECKBOX", ds, "EnableSimulationPerfLogging"); SettingsUtils.BindCheckboxPref(panel, "PERFLOGGING_CHECKBOX", debugSettings, "EnableSimulationPerfLogging");
panel.Get("BOTDEBUG_CHECKBOX_CONTAINER").IsVisible = () => ds.DisplayDeveloperSettings; panel.Get("BOTDEBUG_CHECKBOX_CONTAINER").IsVisible = () => debugSettings.DisplayDeveloperSettings;
panel.Get("CHECKUNSYNCED_CHECKBOX_CONTAINER").IsVisible = () => ds.DisplayDeveloperSettings; panel.Get("CHECKUNSYNCED_CHECKBOX_CONTAINER").IsVisible = () => debugSettings.DisplayDeveloperSettings;
panel.Get("CHECKBOTSYNC_CHECKBOX_CONTAINER").IsVisible = () => ds.DisplayDeveloperSettings; panel.Get("CHECKBOTSYNC_CHECKBOX_CONTAINER").IsVisible = () => debugSettings.DisplayDeveloperSettings;
panel.Get("LUADEBUG_CHECKBOX_CONTAINER").IsVisible = () => ds.DisplayDeveloperSettings; panel.Get("LUADEBUG_CHECKBOX_CONTAINER").IsVisible = () => debugSettings.DisplayDeveloperSettings;
panel.Get("REPLAY_COMMANDS_CHECKBOX_CONTAINER").IsVisible = () => ds.DisplayDeveloperSettings; panel.Get("REPLAY_COMMANDS_CHECKBOX_CONTAINER").IsVisible = () => debugSettings.DisplayDeveloperSettings;
panel.Get("PERFLOGGING_CHECKBOX_CONTAINER").IsVisible = () => ds.DisplayDeveloperSettings; panel.Get("PERFLOGGING_CHECKBOX_CONTAINER").IsVisible = () => debugSettings.DisplayDeveloperSettings;
panel.Get("DEBUG_HIDDEN_CONTAINER").IsVisible = () => !ds.DisplayDeveloperSettings; panel.Get("DEBUG_HIDDEN_CONTAINER").IsVisible = () => !debugSettings.DisplayDeveloperSettings;
SettingsUtils.AdjustSettingsScrollPanelLayout(scrollPanel); SettingsUtils.AdjustSettingsScrollPanelLayout(scrollPanel);
return () => ss.DiscoverNatDevices != OriginalServerDiscoverNatDevices; return () => serverSettings.DiscoverNatDevices != originalServerSettings.DiscoverNatDevices;
} }
Action ResetPanel(Widget panel) Action ResetPanel(Widget panel)
{ {
var ds = Game.Settings.Debug; var defaultDebugSettings = new DebugSettings();
var ss = Game.Settings.Server; var defaultServerSettings = new ServerSettings();
var dds = new DebugSettings();
var dss = new ServerSettings();
return () => return () =>
{ {
ss.DiscoverNatDevices = dss.DiscoverNatDevices; serverSettings.DiscoverNatDevices = defaultServerSettings.DiscoverNatDevices;
ds.PerfText = dds.PerfText; debugSettings.PerfText = defaultDebugSettings.PerfText;
ds.PerfGraph = dds.PerfGraph; debugSettings.PerfGraph = defaultDebugSettings.PerfGraph;
ds.SyncCheckUnsyncedCode = dds.SyncCheckUnsyncedCode; debugSettings.SyncCheckUnsyncedCode = defaultDebugSettings.SyncCheckUnsyncedCode;
ds.SyncCheckBotModuleCode = dds.SyncCheckBotModuleCode; debugSettings.SyncCheckBotModuleCode = defaultDebugSettings.SyncCheckBotModuleCode;
ds.BotDebug = dds.BotDebug; debugSettings.BotDebug = defaultDebugSettings.BotDebug;
ds.LuaDebug = dds.LuaDebug; debugSettings.LuaDebug = defaultDebugSettings.LuaDebug;
ds.SendSystemInformation = dds.SendSystemInformation; debugSettings.SendSystemInformation = defaultDebugSettings.SendSystemInformation;
ds.CheckVersion = dds.CheckVersion; debugSettings.CheckVersion = defaultDebugSettings.CheckVersion;
ds.EnableDebugCommandsInReplays = dds.EnableDebugCommandsInReplays; debugSettings.EnableDebugCommandsInReplays = defaultDebugSettings.EnableDebugCommandsInReplays;
ds.EnableSimulationPerfLogging = dds.EnableSimulationPerfLogging; debugSettings.EnableSimulationPerfLogging = defaultDebugSettings.EnableSimulationPerfLogging;
}; };
} }
} }

View File

@@ -20,43 +20,34 @@ namespace OpenRA.Mods.Common.Widgets.Logic
{ {
public class AudioSettingsLogic : ChromeLogic public class AudioSettingsLogic : ChromeLogic
{ {
static readonly string OriginalSoundDevice;
readonly WorldRenderer worldRenderer; readonly WorldRenderer worldRenderer;
readonly SoundSettings soundSettings;
static SoundSettings originalSoundSettings;
SoundDevice soundDevice; SoundDevice soundDevice;
static AudioSettingsLogic()
{
var original = Game.Settings;
OriginalSoundDevice = original.Sound.Device;
}
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public AudioSettingsLogic( public AudioSettingsLogic(ModData modData, SettingsLogic settingsLogic, string panelID, string label, WorldRenderer worldRenderer)
Action<string, string, Func<Widget, Func<bool>>, Func<Widget, Action>> registerPanel,
string panelID,
string label,
WorldRenderer worldRenderer)
{ {
this.worldRenderer = worldRenderer; this.worldRenderer = worldRenderer;
soundSettings = modData.GetSettings<SoundSettings>();
originalSoundSettings ??= soundSettings.Clone();
registerPanel(panelID, label, InitPanel, ResetPanel); settingsLogic.RegisterSettingsPanel(panelID, label, InitPanel, ResetPanel);
} }
Func<bool> InitPanel(Widget panel) Func<bool> InitPanel(Widget panel)
{ {
var musicPlaylist = worldRenderer.World.WorldActor.Trait<MusicPlaylist>(); var musicPlaylist = worldRenderer.World.WorldActor.Trait<MusicPlaylist>();
var ss = Game.Settings.Sound;
var scrollPanel = panel.Get<ScrollPanelWidget>("SETTINGS_SCROLLPANEL"); var scrollPanel = panel.Get<ScrollPanelWidget>("SETTINGS_SCROLLPANEL");
SettingsUtils.BindCheckboxPref(panel, "CASH_TICKS", ss, "CashTicks"); SettingsUtils.BindCheckboxPref(panel, "CASH_TICKS", soundSettings, "CashTicks");
SettingsUtils.BindCheckboxPref(panel, "MUTE_SOUND", ss, "Mute"); SettingsUtils.BindCheckboxPref(panel, "MUTE_SOUND", soundSettings, "Mute");
SettingsUtils.BindCheckboxPref(panel, "MUTE_BACKGROUND_MUSIC", ss, "MuteBackgroundMusic"); SettingsUtils.BindCheckboxPref(panel, "MUTE_BACKGROUND_MUSIC", soundSettings, "MuteBackgroundMusic");
SettingsUtils.BindSliderPref(panel, "SOUND_VOLUME", ss, "SoundVolume"); SettingsUtils.BindSliderPref(panel, "SOUND_VOLUME", soundSettings, "SoundVolume");
SettingsUtils.BindSliderPref(panel, "MUSIC_VOLUME", ss, "MusicVolume"); SettingsUtils.BindSliderPref(panel, "MUSIC_VOLUME", soundSettings, "MusicVolume");
SettingsUtils.BindSliderPref(panel, "VIDEO_VOLUME", ss, "VideoVolume"); SettingsUtils.BindSliderPref(panel, "VIDEO_VOLUME", soundSettings, "VideoVolume");
var muteCheckbox = panel.Get<CheckboxWidget>("MUTE_SOUND"); var muteCheckbox = panel.Get<CheckboxWidget>("MUTE_SOUND");
var muteCheckboxOnClick = muteCheckbox.OnClick; var muteCheckboxOnClick = muteCheckbox.OnClick;
@@ -67,7 +58,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
{ {
muteCheckboxOnClick(); muteCheckboxOnClick();
if (ss.Mute) if (soundSettings.Mute)
Game.Sound.MuteAudio(); Game.Sound.MuteAudio();
else else
Game.Sound.UnmuteAudio(); Game.Sound.UnmuteAudio();
@@ -108,7 +99,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
videoVolumeSlider.OnChange += x => Game.Sound.VideoVolume = x; videoVolumeSlider.OnChange += x => Game.Sound.VideoVolume = x;
var devices = Game.Sound.AvailableDevices(); 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<DropDownButtonWidget>("AUDIO_DEVICE"); var audioDeviceDropdown = panel.Get<DropDownButtonWidget>("AUDIO_DEVICE");
audioDeviceDropdown.OnMouseDown = _ => ShowAudioDeviceDropdown(audioDeviceDropdown, devices, scrollPanel); audioDeviceDropdown.OnMouseDown = _ => ShowAudioDeviceDropdown(audioDeviceDropdown, devices, scrollPanel);
@@ -119,38 +110,36 @@ namespace OpenRA.Mods.Common.Widgets.Logic
audioDeviceDropdown.GetText = () => deviceLabel.Update(soundDevice); audioDeviceDropdown.GetText = () => deviceLabel.Update(soundDevice);
var restartDesc = panel.Get("AUDIO_RESTART_REQUIRED_DESC"); var restartDesc = panel.Get("AUDIO_RESTART_REQUIRED_DESC");
restartDesc.IsVisible = () => soundDevice.Device != OriginalSoundDevice; restartDesc.IsVisible = () => soundDevice.Device != originalSoundSettings.Device;
SettingsUtils.AdjustSettingsScrollPanelLayout(scrollPanel); SettingsUtils.AdjustSettingsScrollPanelLayout(scrollPanel);
return () => return () =>
{ {
ss.Device = soundDevice.Device; soundSettings.Device = soundDevice.Device;
return soundSettings.Device != originalSoundSettings.Device;
return ss.Device != OriginalSoundDevice;
}; };
} }
Action ResetPanel(Widget panel) Action ResetPanel(Widget panel)
{ {
var ss = Game.Settings.Sound; var defaultSoundSettings = new SoundSettings();
var dss = new SoundSettings();
return () => return () =>
{ {
ss.SoundVolume = dss.SoundVolume; soundSettings.SoundVolume = defaultSoundSettings.SoundVolume;
ss.MusicVolume = dss.MusicVolume; soundSettings.MusicVolume = defaultSoundSettings.MusicVolume;
ss.VideoVolume = dss.VideoVolume; soundSettings.VideoVolume = defaultSoundSettings.VideoVolume;
ss.CashTicks = dss.CashTicks; soundSettings.CashTicks = defaultSoundSettings.CashTicks;
ss.Mute = dss.Mute; soundSettings.Mute = defaultSoundSettings.Mute;
ss.MuteBackgroundMusic = dss.MuteBackgroundMusic; soundSettings.MuteBackgroundMusic = defaultSoundSettings.MuteBackgroundMusic;
ss.Device = dss.Device; soundSettings.Device = defaultSoundSettings.Device;
panel.Get<SliderWidget>("SOUND_VOLUME").Value = ss.SoundVolume; panel.Get<SliderWidget>("SOUND_VOLUME").Value = soundSettings.SoundVolume;
Game.Sound.SoundVolume = ss.SoundVolume; Game.Sound.SoundVolume = soundSettings.SoundVolume;
panel.Get<SliderWidget>("MUSIC_VOLUME").Value = ss.MusicVolume; panel.Get<SliderWidget>("MUSIC_VOLUME").Value = soundSettings.MusicVolume;
Game.Sound.MusicVolume = ss.MusicVolume; Game.Sound.MusicVolume = soundSettings.MusicVolume;
panel.Get<SliderWidget>("VIDEO_VOLUME").Value = ss.VideoVolume; panel.Get<SliderWidget>("VIDEO_VOLUME").Value = soundSettings.VideoVolume;
Game.Sound.VideoVolume = ss.VideoVolume; Game.Sound.VideoVolume = soundSettings.VideoVolume;
Game.Sound.UnmuteAudio(); Game.Sound.UnmuteAudio();
soundDevice = Game.Sound.AvailableDevices().First(); soundDevice = Game.Sound.AvailableDevices().First();
}; };

View File

@@ -67,15 +67,14 @@ namespace OpenRA.Mods.Common.Widgets.Logic
[FluentReference("fps")] [FluentReference("fps")]
const string FrameLimiter = "checkbox-frame-limiter"; 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 ModData modData;
readonly WorldRenderer worldRenderer; readonly WorldRenderer worldRenderer;
readonly WorldViewportSizes viewportSizes; readonly WorldViewportSizes viewportSizes;
readonly GameSettings gameSettings;
readonly GraphicSettings graphicSettings;
readonly PlayerSettings playerSettings;
static GraphicSettings originalGraphicSettings;
readonly string showOnDamage; readonly string showOnDamage;
readonly string alwaysShow; readonly string alwaysShow;
@@ -87,29 +86,21 @@ namespace OpenRA.Mods.Common.Widgets.Logic
readonly string legacyFullscreen; readonly string legacyFullscreen;
readonly string fullscreen; 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] [ObjectCreator.UseCtor]
public DisplaySettingsLogic( public DisplaySettingsLogic(ModData modData, SettingsLogic settingsLogic, string panelID, string label, WorldRenderer worldRenderer)
Action<string, string, Func<Widget, Func<bool>>, Func<Widget, Action>> registerPanel,
string panelID, string label, ModData modData, WorldRenderer worldRenderer)
{ {
this.worldRenderer = worldRenderer; this.worldRenderer = worldRenderer;
this.modData = modData; this.modData = modData;
viewportSizes = modData.GetOrCreate<WorldViewportSizes>(); viewportSizes = modData.GetOrCreate<WorldViewportSizes>();
gameSettings = modData.GetSettings<GameSettings>();
graphicSettings = modData.GetSettings<GraphicSettings>();
playerSettings = modData.GetSettings<PlayerSettings>();
originalGraphicSettings ??= graphicSettings.Clone();
legacyFullscreen = FluentProvider.GetMessage(LegacyFullscreen); legacyFullscreen = FluentProvider.GetMessage(LegacyFullscreen);
fullscreen = FluentProvider.GetMessage(Fullscreen); fullscreen = FluentProvider.GetMessage(Fullscreen);
registerPanel(panelID, label, InitPanel, ResetPanel); settingsLogic.RegisterSettingsPanel(panelID, label, InitPanel, ResetPanel);
showOnDamage = FluentProvider.GetMessage(ShowOnDamage); showOnDamage = FluentProvider.GetMessage(ShowOnDamage);
alwaysShow = FluentProvider.GetMessage(AlwaysShow); alwaysShow = FluentProvider.GetMessage(AlwaysShow);
@@ -138,72 +129,70 @@ namespace OpenRA.Mods.Common.Widgets.Logic
Func<bool> InitPanel(Widget panel) Func<bool> InitPanel(Widget panel)
{ {
var ds = Game.Settings.Graphics;
var gs = Game.Settings.Game;
var world = worldRenderer.World; var world = worldRenderer.World;
var scrollPanel = panel.Get<ScrollPanelWidget>("SETTINGS_SCROLLPANEL"); var scrollPanel = panel.Get<ScrollPanelWidget>("SETTINGS_SCROLLPANEL");
SettingsUtils.BindCheckboxPref(panel, "CURSORDOUBLE_CHECKBOX", ds, "CursorDouble"); SettingsUtils.BindCheckboxPref(panel, "CURSORDOUBLE_CHECKBOX", graphicSettings, "CursorDouble");
SettingsUtils.BindCheckboxPref(panel, "VSYNC_CHECKBOX", ds, "VSync"); SettingsUtils.BindCheckboxPref(panel, "VSYNC_CHECKBOX", graphicSettings, "VSync");
SettingsUtils.BindCheckboxPref(panel, "FRAME_LIMIT_CHECKBOX", ds, "CapFramerate"); SettingsUtils.BindCheckboxPref(panel, "FRAME_LIMIT_CHECKBOX", graphicSettings, "CapFramerate");
SettingsUtils.BindCheckboxPref(panel, "FRAME_LIMIT_GAMESPEED_CHECKBOX", ds, "CapFramerateToGameFps"); SettingsUtils.BindCheckboxPref(panel, "FRAME_LIMIT_GAMESPEED_CHECKBOX", graphicSettings, "CapFramerateToGameFps");
SettingsUtils.BindIntSliderPref(panel, "FRAME_LIMIT_SLIDER", ds, "MaxFramerate"); SettingsUtils.BindIntSliderPref(panel, "FRAME_LIMIT_SLIDER", graphicSettings, "MaxFramerate");
SettingsUtils.BindCheckboxPref(panel, "PLAYER_STANCE_COLORS_CHECKBOX", gs, "UsePlayerStanceColors"); SettingsUtils.BindCheckboxPref(panel, "PLAYER_STANCE_COLORS_CHECKBOX", gameSettings, "UsePlayerStanceColors");
var cb = panel.Get<CheckboxWidget>("PLAYER_STANCE_COLORS_CHECKBOX"); var cb = panel.Get<CheckboxWidget>("PLAYER_STANCE_COLORS_CHECKBOX");
cb.IsChecked = () => gs.UsePlayerStanceColors; cb.IsChecked = () => gameSettings.UsePlayerStanceColors;
cb.OnClick = () => cb.OnClick = () =>
{ {
gs.UsePlayerStanceColors = cb.IsChecked() ^ true; gameSettings.UsePlayerStanceColors = cb.IsChecked() ^ true;
Player.SetupRelationshipColors(world.Players, world.LocalPlayer, worldRenderer, false); Player.SetupRelationshipColors(world.Players, world.LocalPlayer, worldRenderer, false);
}; };
if (panel.GetOrNull<CheckboxWidget>("PAUSE_SHELLMAP_CHECKBOX") != null) if (panel.GetOrNull<CheckboxWidget>("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<DropDownButtonWidget>("MODE_DROPDOWN"); var windowModeDropdown = panel.Get<DropDownButtonWidget>("MODE_DROPDOWN");
windowModeDropdown.OnMouseDown = _ => ShowWindowModeDropdown(windowModeDropdown, ds, scrollPanel); windowModeDropdown.OnMouseDown = _ => ShowWindowModeDropdown(windowModeDropdown, graphicSettings, scrollPanel);
windowModeDropdown.GetText = () => ds.Mode == WindowMode.Windowed windowModeDropdown.GetText = () => graphicSettings.Mode == WindowMode.Windowed
? FluentProvider.GetMessage(Windowed) ? FluentProvider.GetMessage(Windowed)
: ds.Mode == WindowMode.Fullscreen ? legacyFullscreen : fullscreen; : graphicSettings.Mode == WindowMode.Fullscreen ? legacyFullscreen : fullscreen;
var displaySelectionDropDown = panel.Get<DropDownButtonWidget>("DISPLAY_SELECTION_DROPDOWN"); var displaySelectionDropDown = panel.Get<DropDownButtonWidget>("DISPLAY_SELECTION_DROPDOWN");
displaySelectionDropDown.OnMouseDown = _ => ShowDisplaySelectionDropdown(displaySelectionDropDown, ds); displaySelectionDropDown.OnMouseDown = _ => ShowDisplaySelectionDropdown(displaySelectionDropDown, graphicSettings);
var displaySelectionLabel = new CachedTransform<int, string>(i => FluentProvider.GetMessage(Display, "number", i + 1)); var displaySelectionLabel = new CachedTransform<int, string>(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; displaySelectionDropDown.IsDisabled = () => Game.Renderer.DisplayCount < 2;
var glProfileLabel = new CachedTransform<GLProfile, string>(p => p.ToString()); var glProfileLabel = new CachedTransform<GLProfile, string>(p => p.ToString());
var glProfileDropdown = panel.Get<DropDownButtonWidget>("GL_PROFILE_DROPDOWN"); var glProfileDropdown = panel.Get<DropDownButtonWidget>("GL_PROFILE_DROPDOWN");
var disableProfile = Game.Renderer.SupportedGLProfiles.Length < 2 && ds.GLProfile == GLProfile.Automatic; var disableProfile = Game.Renderer.SupportedGLProfiles.Length < 2 && graphicSettings.GLProfile == GLProfile.Automatic;
glProfileDropdown.OnMouseDown = _ => ShowGLProfileDropdown(glProfileDropdown, ds); glProfileDropdown.OnMouseDown = _ => ShowGLProfileDropdown(glProfileDropdown, graphicSettings);
glProfileDropdown.GetText = () => glProfileLabel.Update(ds.GLProfile); glProfileDropdown.GetText = () => glProfileLabel.Update(graphicSettings.GLProfile);
glProfileDropdown.IsDisabled = () => disableProfile; glProfileDropdown.IsDisabled = () => disableProfile;
var statusBarsDropDown = panel.Get<DropDownButtonWidget>("STATUS_BAR_DROPDOWN"); var statusBarsDropDown = panel.Get<DropDownButtonWidget>("STATUS_BAR_DROPDOWN");
statusBarsDropDown.OnMouseDown = _ => ShowStatusBarsDropdown(statusBarsDropDown, gs); statusBarsDropDown.OnMouseDown = _ => ShowStatusBarsDropdown(statusBarsDropDown, gameSettings);
statusBarsDropDown.GetText = () => gs.StatusBars == StatusBarsType.Standard statusBarsDropDown.GetText = () => gameSettings.StatusBars == StatusBarsType.Standard
? FluentProvider.GetMessage(Standard) ? FluentProvider.GetMessage(Standard)
: gs.StatusBars == StatusBarsType.DamageShow : gameSettings.StatusBars == StatusBarsType.DamageShow
? showOnDamage ? showOnDamage
: alwaysShow; : alwaysShow;
var targetLinesDropDown = panel.Get<DropDownButtonWidget>("TARGET_LINES_DROPDOWN"); var targetLinesDropDown = panel.Get<DropDownButtonWidget>("TARGET_LINES_DROPDOWN");
targetLinesDropDown.OnMouseDown = _ => ShowTargetLinesDropdown(targetLinesDropDown, gs); targetLinesDropDown.OnMouseDown = _ => ShowTargetLinesDropdown(targetLinesDropDown, gameSettings);
targetLinesDropDown.GetText = () => gs.TargetLines == TargetLinesType.Automatic targetLinesDropDown.GetText = () => gameSettings.TargetLines == TargetLinesType.Automatic
? automatic ? automatic
: gs.TargetLines == TargetLinesType.Manual : gameSettings.TargetLines == TargetLinesType.Manual
? manual ? manual
: disabled; : disabled;
var battlefieldCameraDropDown = panel.Get<DropDownButtonWidget>("BATTLEFIELD_CAMERA_DROPDOWN"); var battlefieldCameraDropDown = panel.Get<DropDownButtonWidget>("BATTLEFIELD_CAMERA_DROPDOWN");
var battlefieldCameraLabel = new CachedTransform<WorldViewport, string>(vs => GetViewportSizeName(modData, vs)); var battlefieldCameraLabel = new CachedTransform<WorldViewport, string>(vs => GetViewportSizeName(modData, vs));
battlefieldCameraDropDown.OnMouseDown = _ => ShowBattlefieldCameraDropdown(modData, battlefieldCameraDropDown, viewportSizes, ds); battlefieldCameraDropDown.OnMouseDown = _ => ShowBattlefieldCameraDropdown(modData, battlefieldCameraDropDown, viewportSizes, graphicSettings);
battlefieldCameraDropDown.GetText = () => battlefieldCameraLabel.Update(ds.ViewportDistance); battlefieldCameraDropDown.GetText = () => battlefieldCameraLabel.Update(graphicSettings.ViewportDistance);
BindTextNotificationPoolFilterSettings(panel, gs); BindTextNotificationPoolFilterSettings(panel, gameSettings);
// Update vsync immediately // Update vsync immediately
var vsyncCheckbox = panel.Get<CheckboxWidget>("VSYNC_CHECKBOX"); var vsyncCheckbox = panel.Get<CheckboxWidget>("VSYNC_CHECKBOX");
@@ -211,50 +200,49 @@ namespace OpenRA.Mods.Common.Widgets.Logic
vsyncCheckbox.OnClick = () => vsyncCheckbox.OnClick = () =>
{ {
vsyncOnClick(); vsyncOnClick();
Game.Renderer.SetVSyncEnabled(ds.VSync); Game.Renderer.SetVSyncEnabled(graphicSettings.VSync);
}; };
var uiScaleDropdown = panel.Get<DropDownButtonWidget>("UI_SCALE_DROPDOWN"); var uiScaleDropdown = panel.Get<DropDownButtonWidget>("UI_SCALE_DROPDOWN");
var uiScaleLabel = new CachedTransform<float, string>(s => $"{(int)(100 * s)}%"); var uiScaleLabel = new CachedTransform<float, string>(s => $"{(int)(100 * s)}%");
uiScaleDropdown.OnMouseDown = _ => ShowUIScaleDropdown(uiScaleDropdown, ds); uiScaleDropdown.OnMouseDown = _ => ShowUIScaleDropdown(uiScaleDropdown, graphicSettings);
uiScaleDropdown.GetText = () => uiScaleLabel.Update(ds.UIScale); uiScaleDropdown.GetText = () => uiScaleLabel.Update(graphicSettings.UIScale);
var minResolution = viewportSizes.MinEffectiveResolution; var minResolution = viewportSizes.MinEffectiveResolution;
var resolution = Game.Renderer.Resolution; var resolution = Game.Renderer.Resolution;
var disableUIScale = world.Type != WorldType.Shellmap || var disableUIScale = world.Type != WorldType.Shellmap ||
resolution.Width * ds.UIScale < 1.25f * minResolution.Width || resolution.Width * graphicSettings.UIScale < 1.25f * minResolution.Width ||
resolution.Height * ds.UIScale < 1.25f * minResolution.Height; resolution.Height * graphicSettings.UIScale < 1.25f * minResolution.Height;
uiScaleDropdown.IsDisabled = () => disableUIScale; uiScaleDropdown.IsDisabled = () => disableUIScale;
panel.Get("DISPLAY_SELECTION_CONTAINER").IsVisible = () => ds.Mode != WindowMode.Windowed; panel.Get("DISPLAY_SELECTION_CONTAINER").IsVisible = () => graphicSettings.Mode != WindowMode.Windowed;
panel.Get("WINDOW_RESOLUTION_CONTAINER").IsVisible = () => ds.Mode == WindowMode.Windowed; panel.Get("WINDOW_RESOLUTION_CONTAINER").IsVisible = () => graphicSettings.Mode == WindowMode.Windowed;
var windowWidth = panel.Get<TextFieldWidget>("WINDOW_WIDTH"); var windowWidth = panel.Get<TextFieldWidget>("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<TextFieldWidget>("WINDOW_HEIGHT"); var windowHeight = panel.Get<TextFieldWidget>("WINDOW_HEIGHT");
var origHeightText = windowHeight.Text = ds.WindowedSize.Y.ToString(NumberFormatInfo.CurrentInfo); var origHeightText = windowHeight.Text = graphicSettings.WindowedSize.Y.ToString(NumberFormatInfo.CurrentInfo);
windowHeight.Text = ds.WindowedSize.Y.ToString(NumberFormatInfo.CurrentInfo); windowHeight.Text = graphicSettings.WindowedSize.Y.ToString(NumberFormatInfo.CurrentInfo);
var restartDesc = panel.Get("VIDEO_RESTART_REQUIRED_DESC"); var restartDesc = panel.Get("VIDEO_RESTART_REQUIRED_DESC");
restartDesc.IsVisible = () => ds.Mode != OriginalGraphicsMode || ds.VideoDisplay != OriginalVideoDisplay || ds.GLProfile != OriginalGLProfile || restartDesc.IsVisible = () => graphicSettings.Mode != originalGraphicSettings.Mode ||
(ds.Mode == WindowMode.Windowed && (origWidthText != windowWidth.Text || origHeightText != windowHeight.Text)); graphicSettings.VideoDisplay != originalGraphicSettings.VideoDisplay ||
graphicSettings.GLProfile != originalGraphicSettings.GLProfile ||
(graphicSettings.Mode == WindowMode.Windowed && (origWidthText != windowWidth.Text || origHeightText != windowHeight.Text));
var frameLimitGamespeedCheckbox = panel.Get<CheckboxWidget>("FRAME_LIMIT_GAMESPEED_CHECKBOX"); var frameLimitGamespeedCheckbox = panel.Get<CheckboxWidget>("FRAME_LIMIT_GAMESPEED_CHECKBOX");
var frameLimitCheckbox = panel.Get<CheckboxWidget>("FRAME_LIMIT_CHECKBOX"); var frameLimitCheckbox = panel.Get<CheckboxWidget>("FRAME_LIMIT_CHECKBOX");
var frameLimitLabel = new CachedTransform<int, string>(fps => FluentProvider.GetMessage(FrameLimiter, "fps", fps)); var frameLimitLabel = new CachedTransform<int, string>(fps => FluentProvider.GetMessage(FrameLimiter, "fps", fps));
frameLimitCheckbox.GetText = () => frameLimitLabel.Update(ds.MaxFramerate); frameLimitCheckbox.GetText = () => frameLimitLabel.Update(graphicSettings.MaxFramerate);
frameLimitCheckbox.IsDisabled = () => ds.CapFramerateToGameFps; frameLimitCheckbox.IsDisabled = () => graphicSettings.CapFramerateToGameFps;
panel.Get<SliderWidget>("FRAME_LIMIT_SLIDER").IsDisabled = () => !frameLimitCheckbox.IsChecked() || frameLimitGamespeedCheckbox.IsChecked(); panel.Get<SliderWidget>("FRAME_LIMIT_SLIDER").IsDisabled = () => !frameLimitCheckbox.IsChecked() || frameLimitGamespeedCheckbox.IsChecked();
// Player profile
var ps = Game.Settings.Player;
var escPressed = false; var escPressed = false;
var nameTextfield = panel.Get<TextFieldWidget>("PLAYERNAME"); var nameTextfield = panel.Get<TextFieldWidget>("PLAYERNAME");
nameTextfield.IsDisabled = () => world.Type != WorldType.Shellmap; nameTextfield.IsDisabled = () => world.Type != WorldType.Shellmap;
nameTextfield.Text = Settings.SanitizedPlayerName(ps.Name); nameTextfield.Text = Settings.SanitizedPlayerName(playerSettings.Name);
nameTextfield.OnLoseFocus = () => nameTextfield.OnLoseFocus = () =>
{ {
if (escPressed) if (escPressed)
@@ -265,18 +253,18 @@ namespace OpenRA.Mods.Common.Widgets.Logic
nameTextfield.Text = nameTextfield.Text.Trim(); nameTextfield.Text = nameTextfield.Text.Trim();
if (nameTextfield.Text.Length == 0) if (nameTextfield.Text.Length == 0)
nameTextfield.Text = Settings.SanitizedPlayerName(ps.Name); nameTextfield.Text = Settings.SanitizedPlayerName(playerSettings.Name);
else else
{ {
nameTextfield.Text = Settings.SanitizedPlayerName(nameTextfield.Text); nameTextfield.Text = Settings.SanitizedPlayerName(nameTextfield.Text);
ps.Name = nameTextfield.Text; playerSettings.Name = nameTextfield.Text;
} }
}; };
nameTextfield.OnEnterKey = _ => { nameTextfield.YieldKeyboardFocus(); return true; }; nameTextfield.OnEnterKey = _ => { nameTextfield.YieldKeyboardFocus(); return true; };
nameTextfield.OnEscKey = _ => nameTextfield.OnEscKey = _ =>
{ {
nameTextfield.Text = Settings.SanitizedPlayerName(ps.Name); nameTextfield.Text = Settings.SanitizedPlayerName(playerSettings.Name);
escPressed = true; escPressed = true;
nameTextfield.YieldKeyboardFocus(); nameTextfield.YieldKeyboardFocus();
return true; return true;
@@ -286,12 +274,12 @@ namespace OpenRA.Mods.Common.Widgets.Logic
var colorDropdown = panel.Get<DropDownButtonWidget>("PLAYERCOLOR"); var colorDropdown = panel.Get<DropDownButtonWidget>("PLAYERCOLOR");
colorDropdown.IsDisabled = () => world.Type != WorldType.Shellmap; 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; playerSettings.Color = color;
Game.Settings.Save(); playerSettings.Save();
}); });
colorDropdown.Get<ColorBlockWidget>("COLORBLOCK").GetColor = () => ps.Color; colorDropdown.Get<ColorBlockWidget>("COLORBLOCK").GetColor = () => playerSettings.Color;
SettingsUtils.AdjustSettingsScrollPanelLayout(scrollPanel); 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(windowWidth.Text, NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out var x);
int.TryParse(windowHeight.Text, NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out var y); 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(); nameTextfield.YieldKeyboardFocus();
return ds.Mode != OriginalGraphicsMode || return graphicSettings.Mode != originalGraphicSettings.Mode ||
ds.VideoDisplay != OriginalVideoDisplay || graphicSettings.VideoDisplay != originalGraphicSettings.VideoDisplay ||
ds.WindowedSize != OriginalGraphicsWindowedSize || graphicSettings.WindowedSize != originalGraphicSettings.WindowedSize ||
ds.FullscreenSize != OriginalGraphicsFullscreenSize || graphicSettings.FullscreenSize != originalGraphicSettings.FullscreenSize ||
ds.GLProfile != OriginalGLProfile; graphicSettings.GLProfile != originalGraphicSettings.GLProfile;
}; };
} }
Action ResetPanel(Widget panel) Action ResetPanel(Widget panel)
{ {
var ds = Game.Settings.Graphics; var defaultGameSettings = new GameSettings();
var ps = Game.Settings.Player; var defaultGraphicSettings = new GraphicSettings();
var gs = Game.Settings.Game; var defaultPlayerSettings = new PlayerSettings();
var dds = new GraphicSettings();
var dps = new PlayerSettings();
var dgs = new GameSettings();
return () => return () =>
{ {
ds.CapFramerate = dds.CapFramerate; graphicSettings.CapFramerate = defaultGraphicSettings.CapFramerate;
ds.MaxFramerate = dds.MaxFramerate; graphicSettings.MaxFramerate = defaultGraphicSettings.MaxFramerate;
ds.CapFramerateToGameFps = dds.CapFramerateToGameFps; graphicSettings.CapFramerateToGameFps = defaultGraphicSettings.CapFramerateToGameFps;
ds.GLProfile = dds.GLProfile; graphicSettings.GLProfile = defaultGraphicSettings.GLProfile;
ds.Mode = dds.Mode; graphicSettings.Mode = defaultGraphicSettings.Mode;
ds.VideoDisplay = dds.VideoDisplay; graphicSettings.VideoDisplay = defaultGraphicSettings.VideoDisplay;
ds.WindowedSize = dds.WindowedSize; graphicSettings.WindowedSize = defaultGraphicSettings.WindowedSize;
ds.CursorDouble = dds.CursorDouble; graphicSettings.CursorDouble = defaultGraphicSettings.CursorDouble;
ds.ViewportDistance = dds.ViewportDistance; graphicSettings.ViewportDistance = defaultGraphicSettings.ViewportDistance;
if (ds.UIScale != dds.UIScale) if (graphicSettings.UIScale != defaultGraphicSettings.UIScale)
{ {
var oldScale = ds.UIScale; var oldScale = graphicSettings.UIScale;
ds.UIScale = dds.UIScale; graphicSettings.UIScale = defaultGraphicSettings.UIScale;
Game.Renderer.SetUIScale(dds.UIScale); Game.Renderer.SetUIScale(defaultGraphicSettings.UIScale);
RecalculateWidgetLayout(Ui.Root); 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; playerSettings.Color = defaultPlayerSettings.Color;
ps.Name = dps.Name; 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<string, WindowMode>() var options = new Dictionary<string, WindowMode>()
{ {
@@ -358,10 +343,10 @@ namespace OpenRA.Mods.Common.Widgets.Logic
ScrollItemWidget SetupItem(string o, ScrollItemWidget itemTemplate) ScrollItemWidget SetupItem(string o, ScrollItemWidget itemTemplate)
{ {
var item = ScrollItemWidget.Setup(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); SettingsUtils.AdjustSettingsScrollPanelLayout(scrollPanel);
}); });
@@ -372,30 +357,30 @@ namespace OpenRA.Mods.Common.Widgets.Logic
dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, options.Keys, SetupItem); 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) void ToggleFilterFlag(TextNotificationPoolFilters f)
{ {
gs.TextNotificationPoolFilters ^= f; gameSettings.TextNotificationPoolFilters ^= f;
Game.Settings.Save(); gameSettings.Save();
} }
var feedbackCheckbox = panel.GetOrNull<CheckboxWidget>("UI_FEEDBACK_CHECKBOX"); var feedbackCheckbox = panel.GetOrNull<CheckboxWidget>("UI_FEEDBACK_CHECKBOX");
if (feedbackCheckbox != null) if (feedbackCheckbox != null)
{ {
feedbackCheckbox.IsChecked = () => gs.TextNotificationPoolFilters.HasFlag(TextNotificationPoolFilters.Feedback); feedbackCheckbox.IsChecked = () => gameSettings.TextNotificationPoolFilters.HasFlag(TextNotificationPoolFilters.Feedback);
feedbackCheckbox.OnClick = () => ToggleFilterFlag(TextNotificationPoolFilters.Feedback); feedbackCheckbox.OnClick = () => ToggleFilterFlag(TextNotificationPoolFilters.Feedback);
} }
var transientsCheckbox = panel.GetOrNull<CheckboxWidget>("TRANSIENTS_CHECKBOX"); var transientsCheckbox = panel.GetOrNull<CheckboxWidget>("TRANSIENTS_CHECKBOX");
if (transientsCheckbox != null) if (transientsCheckbox != null)
{ {
transientsCheckbox.IsChecked = () => gs.TextNotificationPoolFilters.HasFlag(TextNotificationPoolFilters.Transients); transientsCheckbox.IsChecked = () => gameSettings.TextNotificationPoolFilters.HasFlag(TextNotificationPoolFilters.Transients);
transientsCheckbox.OnClick = () => ToggleFilterFlag(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<string, StatusBarsType>() var options = new Dictionary<string, StatusBarsType>()
{ {
@@ -407,8 +392,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
ScrollItemWidget SetupItem(string o, ScrollItemWidget itemTemplate) ScrollItemWidget SetupItem(string o, ScrollItemWidget itemTemplate)
{ {
var item = ScrollItemWidget.Setup(itemTemplate, var item = ScrollItemWidget.Setup(itemTemplate,
() => s.StatusBars == options[o], () => gameSettings.StatusBars == options[o],
() => s.StatusBars = options[o]); () => gameSettings.StatusBars = options[o]);
item.Get<LabelWidget>("LABEL").GetText = () => o; item.Get<LabelWidget>("LABEL").GetText = () => o;
return item; return item;
@@ -417,13 +402,13 @@ namespace OpenRA.Mods.Common.Widgets.Logic
dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, options.Keys, SetupItem); 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) ScrollItemWidget SetupItem(int o, ScrollItemWidget itemTemplate)
{ {
var item = ScrollItemWidget.Setup(itemTemplate, var item = ScrollItemWidget.Setup(itemTemplate,
() => s.VideoDisplay == o, () => graphicSettings.VideoDisplay == o,
() => s.VideoDisplay = o); () => graphicSettings.VideoDisplay = o);
var label = $"Display {o + 1}"; var label = $"Display {o + 1}";
item.Get<LabelWidget>("LABEL").GetText = () => label; item.Get<LabelWidget>("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); 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) ScrollItemWidget SetupItem(GLProfile o, ScrollItemWidget itemTemplate)
{ {
var item = ScrollItemWidget.Setup(itemTemplate, var item = ScrollItemWidget.Setup(itemTemplate,
() => s.GLProfile == o, () => graphicSettings.GLProfile == o,
() => s.GLProfile = o); () => graphicSettings.GLProfile = o);
var label = o.ToString(); var label = o.ToString();
item.Get<LabelWidget>("LABEL").GetText = () => label; item.Get<LabelWidget>("LABEL").GetText = () => label;
@@ -450,7 +435,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, profiles, SetupItem); 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<string, TargetLinesType>() var options = new Dictionary<string, TargetLinesType>()
{ {
@@ -462,8 +447,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
ScrollItemWidget SetupItem(string o, ScrollItemWidget itemTemplate) ScrollItemWidget SetupItem(string o, ScrollItemWidget itemTemplate)
{ {
var item = ScrollItemWidget.Setup(itemTemplate, var item = ScrollItemWidget.Setup(itemTemplate,
() => s.TargetLines == options[o], () => gameSettings.TargetLines == options[o],
() => s.TargetLines = options[o]); () => gameSettings.TargetLines = options[o]);
item.Get<LabelWidget>("LABEL").GetText = () => o; item.Get<LabelWidget>("LABEL").GetText = () => o;
return item; return item;
@@ -472,13 +457,14 @@ namespace OpenRA.Mods.Common.Widgets.Logic
dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, options.Keys, SetupItem); 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) ScrollItemWidget SetupItem(WorldViewport o, ScrollItemWidget itemTemplate)
{ {
var item = ScrollItemWidget.Setup(itemTemplate, var item = ScrollItemWidget.Setup(itemTemplate,
() => gs.ViewportDistance == o, () => graphicSettings.ViewportDistance == o,
() => gs.ViewportDistance = o); () => graphicSettings.ViewportDistance = o);
var label = GetViewportSizeName(modData, o); var label = GetViewportSizeName(modData, o);
item.Get<LabelWidget>("LABEL").GetText = () => label; item.Get<LabelWidget>("LABEL").GetText = () => label;
@@ -543,22 +529,22 @@ namespace OpenRA.Mods.Common.Widgets.Logic
RecalculateWidgetLayout(c, insideScrollPanel || w is ScrollPanelWidget); 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) ScrollItemWidget SetupItem(float o, ScrollItemWidget itemTemplate)
{ {
var item = ScrollItemWidget.Setup(itemTemplate, var item = ScrollItemWidget.Setup(itemTemplate,
() => gs.UIScale == o, () => graphicSettings.UIScale == o,
() => () =>
{ {
Game.RunAfterTick(() => Game.RunAfterTick(() =>
{ {
var oldScale = gs.UIScale; var oldScale = graphicSettings.UIScale;
gs.UIScale = o; graphicSettings.UIScale = o;
Game.Renderer.SetUIScale(o); Game.Renderer.SetUIScale(o);
RecalculateWidgetLayout(Ui.Root); RecalculateWidgetLayout(Ui.Root);
Viewport.LastMousePos = (Viewport.LastMousePos.ToFloat2() * oldScale / gs.UIScale).ToInt2(); Viewport.LastMousePos = (Viewport.LastMousePos.ToFloat2() * oldScale / graphicSettings.UIScale).ToInt2();
}); });
}); });

View File

@@ -35,11 +35,10 @@ namespace OpenRA.Mods.Common.Widgets.Logic
readonly AutoSaveSettings autoSaveSettings; readonly AutoSaveSettings autoSaveSettings;
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public GameplaySettingsLogic(ModData modData, Action<string, string, Func<Widget, Func<bool>>, Func<Widget, Action>> registerPanel, public GameplaySettingsLogic(ModData modData, SettingsLogic settingsLogic, string panelID, string label)
string panelID, string label)
{ {
autoSaveSettings = modData.GetSettings<AutoSaveSettings>(); autoSaveSettings = modData.GetSettings<AutoSaveSettings>();
registerPanel(panelID, label, InitPanel, ResetPanel); settingsLogic.RegisterSettingsPanel(panelID, label, InitPanel, ResetPanel);
} }
Func<bool> InitPanel(Widget panel) Func<bool> InitPanel(Widget panel)
@@ -79,7 +78,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
() => () =>
{ {
autoSaveSettings.AutoSaveInterval = o; autoSaveSettings.AutoSaveInterval = o;
Game.Settings.Save(); autoSaveSettings.Save();
}); });
var deviceLabel = item.Get<LabelWidget>("LABEL"); var deviceLabel = item.Get<LabelWidget>("LABEL");
@@ -100,7 +99,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
() => () =>
{ {
autoSaveSettings.AutoSaveMaxFileCount = o; autoSaveSettings.AutoSaveMaxFileCount = o;
Game.Settings.Save(); autoSaveSettings.Save();
}); });
var deviceLabel = item.Get<LabelWidget>("LABEL"); var deviceLabel = item.Get<LabelWidget>("LABEL");

View File

@@ -60,17 +60,13 @@ namespace OpenRA.Mods.Common.Widgets.Logic
Widget emptyListMessage; Widget emptyListMessage;
Widget remapDialog; Widget remapDialog;
static HotkeysSettingsLogic() { }
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public HotkeysSettingsLogic( public HotkeysSettingsLogic(ModData modData, SettingsLogic settingsLogic, string panelID, string label, Dictionary<string, MiniYaml> logicArgs)
Action<string, string, Func<Widget, Func<bool>>, Func<Widget, Action>> registerPanel,
string panelID, string label, ModData modData, Dictionary<string, MiniYaml> logicArgs)
{ {
this.modData = modData; this.modData = modData;
this.logicArgs = logicArgs; this.logicArgs = logicArgs;
registerPanel(panelID, label, InitPanel, ResetPanel); settingsLogic.RegisterSettingsPanel(panelID, label, InitPanel, ResetPanel);
} }
void BindHotkeyPref(HotkeyDefinition hd, Widget template) void BindHotkeyPref(HotkeyDefinition hd, Widget template)

View File

@@ -36,71 +36,70 @@ namespace OpenRA.Mods.Common.Widgets.Logic
[FluentReference] [FluentReference]
const string Joystick = "options-mouse-scroll-type.joystick"; const string Joystick = "options-mouse-scroll-type.joystick";
static InputSettingsLogic() { }
readonly string classic; readonly string classic;
readonly string modern; readonly string modern;
readonly GameSettings gameSettings;
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public InputSettingsLogic(Action<string, string, Func<Widget, Func<bool>>, Func<Widget, Action>> registerPanel, string panelID, string label) public InputSettingsLogic(ModData modData, SettingsLogic settingsLogic, string panelID, string label)
{ {
classic = FluentProvider.GetMessage(Classic); classic = FluentProvider.GetMessage(Classic);
modern = FluentProvider.GetMessage(Modern); modern = FluentProvider.GetMessage(Modern);
gameSettings = modData.GetSettings<GameSettings>();
registerPanel(panelID, label, InitPanel, ResetPanel); settingsLogic.RegisterSettingsPanel(panelID, label, InitPanel, ResetPanel);
} }
Func<bool> InitPanel(Widget panel) Func<bool> InitPanel(Widget panel)
{ {
var gs = Game.Settings.Game;
var scrollPanel = panel.Get<ScrollPanelWidget>("SETTINGS_SCROLLPANEL"); var scrollPanel = panel.Get<ScrollPanelWidget>("SETTINGS_SCROLLPANEL");
SettingsUtils.BindCheckboxPref(panel, "ALTERNATE_SCROLL_CHECKBOX", gs, "UseAlternateScrollButton"); SettingsUtils.BindCheckboxPref(panel, "ALTERNATE_SCROLL_CHECKBOX", gameSettings, "UseAlternateScrollButton");
SettingsUtils.BindCheckboxPref(panel, "EDGESCROLL_CHECKBOX", gs, "ViewportEdgeScroll"); SettingsUtils.BindCheckboxPref(panel, "EDGESCROLL_CHECKBOX", gameSettings, "ViewportEdgeScroll");
SettingsUtils.BindCheckboxPref(panel, "LOCKMOUSE_CHECKBOX", gs, "LockMouseWindow"); SettingsUtils.BindCheckboxPref(panel, "LOCKMOUSE_CHECKBOX", gameSettings, "LockMouseWindow");
SettingsUtils.BindSliderPref(panel, "ZOOMSPEED_SLIDER", gs, "ZoomSpeed"); SettingsUtils.BindSliderPref(panel, "ZOOMSPEED_SLIDER", gameSettings, "ZoomSpeed");
SettingsUtils.BindSliderPref(panel, "SCROLLSPEED_SLIDER", gs, "ViewportEdgeScrollStep"); SettingsUtils.BindSliderPref(panel, "SCROLLSPEED_SLIDER", gameSettings, "ViewportEdgeScrollStep");
SettingsUtils.BindSliderPref(panel, "UI_SCROLLSPEED_SLIDER", gs, "UIScrollSpeed"); SettingsUtils.BindSliderPref(panel, "UI_SCROLLSPEED_SLIDER", gameSettings, "UIScrollSpeed");
var mouseControlDropdown = panel.Get<DropDownButtonWidget>("MOUSE_CONTROL_DROPDOWN"); var mouseControlDropdown = panel.Get<DropDownButtonWidget>("MOUSE_CONTROL_DROPDOWN");
mouseControlDropdown.OnMouseDown = _ => ShowMouseControlDropdown(mouseControlDropdown, gs); mouseControlDropdown.OnMouseDown = _ => ShowMouseControlDropdown(mouseControlDropdown, gameSettings);
mouseControlDropdown.GetText = () => gs.UseClassicMouseStyle ? classic : modern; mouseControlDropdown.GetText = () => gameSettings.UseClassicMouseStyle ? classic : modern;
var mouseScrollDropdown = panel.Get<DropDownButtonWidget>("MOUSE_SCROLL_TYPE_DROPDOWN"); var mouseScrollDropdown = panel.Get<DropDownButtonWidget>("MOUSE_SCROLL_TYPE_DROPDOWN");
mouseScrollDropdown.OnMouseDown = _ => ShowMouseScrollDropdown(mouseScrollDropdown, gs); mouseScrollDropdown.OnMouseDown = _ => ShowMouseScrollDropdown(mouseScrollDropdown, gameSettings);
// MouseScroll can change, must display latest value. // MouseScroll can change, must display latest value.
#pragma warning disable IDE0200 // Remove unnecessary lambda expression #pragma warning disable IDE0200 // Remove unnecessary lambda expression
mouseScrollDropdown.GetText = () => gs.MouseScroll.ToString(); mouseScrollDropdown.GetText = () => gameSettings.MouseScroll.ToString();
#pragma warning restore IDE0200 #pragma warning restore IDE0200
var mouseControlDescClassic = panel.Get("MOUSE_CONTROL_DESC_CLASSIC"); var mouseControlDescClassic = panel.Get("MOUSE_CONTROL_DESC_CLASSIC");
mouseControlDescClassic.IsVisible = () => gs.UseClassicMouseStyle; mouseControlDescClassic.IsVisible = () => gameSettings.UseClassicMouseStyle;
var mouseControlDescModern = panel.Get("MOUSE_CONTROL_DESC_MODERN"); var mouseControlDescModern = panel.Get("MOUSE_CONTROL_DESC_MODERN");
mouseControlDescModern.IsVisible = () => !gs.UseClassicMouseStyle; mouseControlDescModern.IsVisible = () => !gameSettings.UseClassicMouseStyle;
foreach (var container in new[] { mouseControlDescClassic, mouseControlDescModern }) foreach (var container in new[] { mouseControlDescClassic, mouseControlDescModern })
{ {
var classicScrollRight = container.Get("DESC_SCROLL_RIGHT"); 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"); 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"); var zoomDesc = container.Get("DESC_ZOOM");
zoomDesc.IsVisible = () => gs.ZoomModifier == Modifiers.None; zoomDesc.IsVisible = () => gameSettings.ZoomModifier == Modifiers.None;
var zoomDescModifier = container.Get<LabelWidget>("DESC_ZOOM_MODIFIER"); var zoomDescModifier = container.Get<LabelWidget>("DESC_ZOOM_MODIFIER");
zoomDescModifier.IsVisible = () => gs.ZoomModifier != Modifiers.None; zoomDescModifier.IsVisible = () => gameSettings.ZoomModifier != Modifiers.None;
var zoomDescModifierTemplate = zoomDescModifier.GetText(); var zoomDescModifierTemplate = zoomDescModifier.GetText();
var zoomDescModifierLabel = new CachedTransform<Modifiers, string>( var zoomDescModifierLabel = new CachedTransform<Modifiers, string>(
mod => zoomDescModifierTemplate.Replace("MODIFIER", mod.ToString())); mod => zoomDescModifierTemplate.Replace("MODIFIER", mod.ToString()));
zoomDescModifier.GetText = () => zoomDescModifierLabel.Update(gs.ZoomModifier); zoomDescModifier.GetText = () => zoomDescModifierLabel.Update(gameSettings.ZoomModifier);
var edgescrollDesc = container.Get<LabelWidget>("DESC_EDGESCROLL"); var edgescrollDesc = container.Get<LabelWidget>("DESC_EDGESCROLL");
edgescrollDesc.IsVisible = () => gs.ViewportEdgeScroll; edgescrollDesc.IsVisible = () => gameSettings.ViewportEdgeScroll;
} }
// Apply mouse focus preferences immediately // Apply mouse focus preferences immediately
@@ -112,15 +111,15 @@ namespace OpenRA.Mods.Common.Widgets.Logic
// applying the changes live. // applying the changes live.
oldOnClick(); oldOnClick();
MakeMouseFocusSettingsLive(); MakeMouseFocusSettingsLive(gameSettings);
}; };
var zoomModifierDropdown = panel.Get<DropDownButtonWidget>("ZOOM_MODIFIER"); var zoomModifierDropdown = panel.Get<DropDownButtonWidget>("ZOOM_MODIFIER");
zoomModifierDropdown.OnMouseDown = _ => ShowZoomModifierDropdown(zoomModifierDropdown, gs); zoomModifierDropdown.OnMouseDown = _ => ShowZoomModifierDropdown(zoomModifierDropdown, gameSettings);
// ZoomModifier can change, must display latest value. // ZoomModifier can change, must display latest value.
#pragma warning disable IDE0200 // Remove unnecessary lambda expression #pragma warning disable IDE0200 // Remove unnecessary lambda expression
zoomModifierDropdown.GetText = () => gs.ZoomModifier.ToString(); zoomModifierDropdown.GetText = () => gameSettings.ZoomModifier.ToString();
#pragma warning restore IDE0200 #pragma warning restore IDE0200
SettingsUtils.AdjustSettingsScrollPanelLayout(scrollPanel); SettingsUtils.AdjustSettingsScrollPanelLayout(scrollPanel);
@@ -130,29 +129,28 @@ namespace OpenRA.Mods.Common.Widgets.Logic
Action ResetPanel(Widget panel) Action ResetPanel(Widget panel)
{ {
var gs = Game.Settings.Game; var defaultGameSettings = new GameSettings();
var dgs = new GameSettings();
return () => return () =>
{ {
gs.UseClassicMouseStyle = dgs.UseClassicMouseStyle; gameSettings.UseClassicMouseStyle = defaultGameSettings.UseClassicMouseStyle;
gs.MouseScroll = dgs.MouseScroll; gameSettings.MouseScroll = defaultGameSettings.MouseScroll;
gs.UseAlternateScrollButton = dgs.UseAlternateScrollButton; gameSettings.UseAlternateScrollButton = defaultGameSettings.UseAlternateScrollButton;
gs.LockMouseWindow = dgs.LockMouseWindow; gameSettings.LockMouseWindow = defaultGameSettings.LockMouseWindow;
gs.ViewportEdgeScroll = dgs.ViewportEdgeScroll; gameSettings.ViewportEdgeScroll = defaultGameSettings.ViewportEdgeScroll;
gs.ViewportEdgeScrollStep = dgs.ViewportEdgeScrollStep; gameSettings.ViewportEdgeScrollStep = defaultGameSettings.ViewportEdgeScrollStep;
gs.ZoomSpeed = dgs.ZoomSpeed; gameSettings.ZoomSpeed = defaultGameSettings.ZoomSpeed;
gs.UIScrollSpeed = dgs.UIScrollSpeed; gameSettings.UIScrollSpeed = defaultGameSettings.UIScrollSpeed;
gs.ZoomModifier = dgs.ZoomModifier; gameSettings.ZoomModifier = defaultGameSettings.ZoomModifier;
panel.Get<SliderWidget>("SCROLLSPEED_SLIDER").Value = gs.ViewportEdgeScrollStep; panel.Get<SliderWidget>("SCROLLSPEED_SLIDER").Value = gameSettings.ViewportEdgeScrollStep;
panel.Get<SliderWidget>("UI_SCROLLSPEED_SLIDER").Value = gs.UIScrollSpeed; panel.Get<SliderWidget>("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<string, bool>() var options = new Dictionary<string, bool>()
{ {
@@ -163,8 +161,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
ScrollItemWidget SetupItem(string o, ScrollItemWidget itemTemplate) ScrollItemWidget SetupItem(string o, ScrollItemWidget itemTemplate)
{ {
var item = ScrollItemWidget.Setup(itemTemplate, var item = ScrollItemWidget.Setup(itemTemplate,
() => s.UseClassicMouseStyle == options[o], () => gameSettings.UseClassicMouseStyle == options[o],
() => s.UseClassicMouseStyle = options[o]); () => gameSettings.UseClassicMouseStyle = options[o]);
item.Get<LabelWidget>("LABEL").GetText = () => o; item.Get<LabelWidget>("LABEL").GetText = () => o;
return item; return item;
} }
@@ -172,7 +170,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, options.Keys, SetupItem); 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<string, MouseScrollType>() var options = new Dictionary<string, MouseScrollType>()
{ {
@@ -185,8 +183,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
ScrollItemWidget SetupItem(string o, ScrollItemWidget itemTemplate) ScrollItemWidget SetupItem(string o, ScrollItemWidget itemTemplate)
{ {
var item = ScrollItemWidget.Setup(itemTemplate, var item = ScrollItemWidget.Setup(itemTemplate,
() => s.MouseScroll == options[o], () => gameSettings.MouseScroll == options[o],
() => s.MouseScroll = options[o]); () => gameSettings.MouseScroll = options[o]);
item.Get<LabelWidget>("LABEL").GetText = () => o; item.Get<LabelWidget>("LABEL").GetText = () => o;
return item; return item;
} }
@@ -194,7 +192,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, options.Keys, SetupItem); 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<string, Modifiers>() var options = new Dictionary<string, Modifiers>()
{ {
@@ -208,8 +206,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
ScrollItemWidget SetupItem(string o, ScrollItemWidget itemTemplate) ScrollItemWidget SetupItem(string o, ScrollItemWidget itemTemplate)
{ {
var item = ScrollItemWidget.Setup(itemTemplate, var item = ScrollItemWidget.Setup(itemTemplate,
() => s.ZoomModifier == options[o], () => gameSettings.ZoomModifier == options[o],
() => s.ZoomModifier = options[o]); () => gameSettings.ZoomModifier = options[o]);
item.Get<LabelWidget>("LABEL").GetText = () => o; item.Get<LabelWidget>("LABEL").GetText = () => o;
return item; return item;
} }
@@ -217,10 +215,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, options.Keys, SetupItem); 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) if (gameSettings.LockMouseWindow)
Game.Renderer.GrabWindowMouseFocus(); Game.Renderer.GrabWindowMouseFocus();
else else

View File

@@ -17,7 +17,12 @@ using OpenRA.Widgets;
namespace OpenRA.Mods.Common.Widgets.Logic namespace OpenRA.Mods.Common.Widgets.Logic
{ {
public class SettingsLogic : ChromeLogic public interface ISettingsLogic
{
void RegisterSettingsPanel(string panelID, string label, Func<Widget, Func<bool>> init, Func<Widget, Action> reset);
}
public class SettingsLogic : ChromeLogic, ISettingsLogic
{ {
[FluentReference] [FluentReference]
const string SettingsSaveTitle = "dialog-settings-save.title"; const string SettingsSaveTitle = "dialog-settings-save.title";
@@ -64,8 +69,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic
bool needsRestart = false; bool needsRestart = false;
static SettingsLogic() { }
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public SettingsLogic(Widget widget, Action onExit, WorldRenderer worldRenderer, Dictionary<string, MiniYaml> logicArgs, ModData modData) public SettingsLogic(Widget widget, Action onExit, WorldRenderer worldRenderer, Dictionary<string, MiniYaml> logicArgs, ModData modData)
{ {
@@ -92,7 +95,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
Game.LoadWidget(worldRenderer.World, panel.Key, container, new WidgetArgs() Game.LoadWidget(worldRenderer.World, panel.Key, container, new WidgetArgs()
{ {
{ "registerPanel", (Action<string, string, Func<Widget, Func<bool>>, Func<Widget, Action>>)RegisterSettingsPanel }, { "settingsLogic", this },
{ "panelID", panel.Key }, { "panelID", panel.Key },
{ "label", panel.Value } { "label", panel.Value }
}); });
@@ -102,8 +105,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
widget.Get<ButtonWidget>("BACK_BUTTON").OnClick = () => widget.Get<ButtonWidget>("BACK_BUTTON").OnClick = () =>
{ {
needsRestart |= leavePanelActions[activePanel](); needsRestart |= leavePanelActions[activePanel]();
var current = Game.Settings; Game.Settings.Save();
current.Save();
void CloseAndExit() { Ui.CloseWindow(); onExit(); } void CloseAndExit() { Ui.CloseWindow(); onExit(); }
if (needsRestart) if (needsRestart)