From 04bb5b0a4b2d1150614a22382ecba6a5c54e05d4 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 10 Jul 2010 14:58:50 +1200 Subject: [PATCH] Load/Save settings from /settings.yaml --- OpenRA.FileFormats/FieldLoader.cs | 13 +++++++ OpenRA.Game/Game.cs | 38 +++++++++---------- OpenRA.Game/GameRules/UserSettings.cs | 35 +++++++++++++---- .../Widgets/Delegates/SettingsMenuDelegate.cs | 6 +++ 4 files changed, 64 insertions(+), 28 deletions(-) diff --git a/OpenRA.FileFormats/FieldLoader.cs b/OpenRA.FileFormats/FieldLoader.cs index e34fd0034e..8fcba641a9 100644 --- a/OpenRA.FileFormats/FieldLoader.cs +++ b/OpenRA.FileFormats/FieldLoader.cs @@ -132,6 +132,19 @@ namespace OpenRA.FileFormats f => f.Name, f => new MiniYaml(FormatValue(o, f)))); } + + public static MiniYaml SaveDifferences(object o, object from) + { + if (o.GetType() != from.GetType()) + throw new InvalidOperationException("FieldLoader: can't diff objects of different types"); + + var fields = o.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance) + .Where(f => FormatValue(o,f) != FormatValue(from,f)); + + return new MiniYaml(null, fields.ToDictionary( + f => f.Name, + f => new MiniYaml(FormatValue(o, f)))); + } public static string FormatValue(object o, FieldInfo f) { diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index 2d8a505dd4..8f93a84770 100644 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -561,16 +561,19 @@ namespace OpenRA internal static void Initialize(Settings settings) { - AppDomain.CurrentDomain.AssemblyResolve += FileSystem.ResolveAssembly; - - LoadUserSettings(settings); + AppDomain.CurrentDomain.AssemblyResolve += FileSystem.ResolveAssembly; + + var defaultSupport = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + + Path.DirectorySeparatorChar + "OpenRA"; + + SupportDir = settings.GetValue("SupportDir", defaultSupport); + Settings = new UserSettings(settings); Log.LogPath = SupportDir + "Logs" + Path.DirectorySeparatorChar; Log.AddChannel("perf", "perf.log", false, false); Log.AddChannel("debug", "debug.log", false, false); Log.AddChannel("sync", "syncreport.log", true, true); - - + LobbyInfo.GlobalSettings.Mods = Settings.InitialMods; // Load the default mod to access required files @@ -605,19 +608,6 @@ namespace OpenRA } - static void LoadUserSettings(Settings settings) - { - Settings = new UserSettings(); - var settingsFile = settings.GetValue("settings", "settings.ini"); - FileSystem.Mount("./"); - if (FileSystem.Exists(settingsFile)) - FieldLoader.Load(Settings, - new IniFile(FileSystem.Open(settingsFile)).GetSection("Settings")); - FileSystem.UnmountAll(); - - Settings.AddSettings(settings); - } - static bool quit; internal static void Run() { @@ -644,16 +634,22 @@ namespace OpenRA Chrome.rootWidget.OpenWindow("MAINMENU_BG"); } + static string baseSupportDir = null; public static string SupportDir { - get { - var dir = Settings.SupportDir; + set { + var dir = value; // Expand paths relative to the personal directory if (dir.ElementAt(0) == '~') dir = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + dir.Substring(1); - return dir + Path.DirectorySeparatorChar; + + if (!Directory.Exists(dir)) + Directory.CreateDirectory(dir); + + baseSupportDir = dir + Path.DirectorySeparatorChar; } + get {return baseSupportDir;} } diff --git a/OpenRA.Game/GameRules/UserSettings.cs b/OpenRA.Game/GameRules/UserSettings.cs index d763276f84..9dd814a01f 100644 --- a/OpenRA.Game/GameRules/UserSettings.cs +++ b/OpenRA.Game/GameRules/UserSettings.cs @@ -18,15 +18,15 @@ */ #endregion +using OpenRA.FileFormats; using OpenRA.FileFormats.Graphics; -using System; using System.IO; +using System.Collections.Generic; + namespace OpenRA.GameRules { public class UserSettings { - public readonly string SupportDir = Environment.GetFolderPath(Environment.SpecialFolder.Personal) - + Path.DirectorySeparatorChar + "OpenRA" + Path.DirectorySeparatorChar; // Debug settings public bool UnitDebug = false; public bool PathDebug = true; @@ -58,11 +58,32 @@ namespace OpenRA.GameRules public readonly bool InternetServer = true; public readonly string MasterServer = "http://open-ra.org/master/"; - public void AddSettings(Settings settings) - { + string SettingsFile; + UserSettings defaults; + + public UserSettings() {} + public UserSettings(Settings args) + { + defaults = new UserSettings(); + SettingsFile = Game.SupportDir + "settings.yaml"; + + if (File.Exists(SettingsFile)) + { + System.Console.WriteLine("Loading settings file {0}",SettingsFile); + var yaml = MiniYaml.FromFile(SettingsFile); + FieldLoader.Load(this, yaml["Settings"]); + } + foreach (var f in this.GetType().GetFields()) - if (settings.Contains(f.Name)) - OpenRA.FileFormats.FieldLoader.LoadField( this, f.Name, settings.GetValue(f.Name, "") ); + if (args.Contains(f.Name)) + OpenRA.FileFormats.FieldLoader.LoadField( this, f.Name, args.GetValue(f.Name, "") ); + } + + public void Save() + { + Dictionary root = new Dictionary(); + root.Add("Settings", FieldSaver.SaveDifferences(this, defaults)); + root.WriteToFile(SettingsFile); } } } diff --git a/OpenRA.Game/Widgets/Delegates/SettingsMenuDelegate.cs b/OpenRA.Game/Widgets/Delegates/SettingsMenuDelegate.cs index e417ed0247..a42339adb5 100644 --- a/OpenRA.Game/Widgets/Delegates/SettingsMenuDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/SettingsMenuDelegate.cs @@ -15,24 +15,28 @@ namespace OpenRA.Widgets.Delegates r.GetWidget("SETTINGS_CHECKBOX_UNITDEBUG").Checked = () => {return Game.Settings.UnitDebug;}; r.GetWidget("SETTINGS_CHECKBOX_UNITDEBUG").OnMouseDown = mi => { Game.Settings.UnitDebug ^= true; + Game.Settings.Save(); return true; }; r.GetWidget("SETTINGS_CHECKBOX_PATHDEBUG").Checked = () => {return Game.Settings.PathDebug;}; r.GetWidget("SETTINGS_CHECKBOX_PATHDEBUG").OnMouseDown = mi => { Game.Settings.PathDebug ^= true; + Game.Settings.Save(); return true; }; r.GetWidget("SETTINGS_CHECKBOX_INDEXDEBUG").Checked = () => {return Game.Settings.IndexDebug;}; r.GetWidget("SETTINGS_CHECKBOX_INDEXDEBUG").OnMouseDown = mi => { Game.Settings.IndexDebug ^= true; + Game.Settings.Save(); return true; }; r.GetWidget("SETTINGS_CHECKBOX_PERFDEBUG").Checked = () => {return Game.Settings.PerfDebug;}; r.GetWidget("SETTINGS_CHECKBOX_PERFDEBUG").OnMouseDown = mi => { Game.Settings.PerfDebug ^= true; + Game.Settings.Save(); return true; }; @@ -40,6 +44,7 @@ namespace OpenRA.Widgets.Delegates r.GetWidget("SETTINGS_CHECKBOX_SYNCREPORTS").OnMouseDown = mi => { Game.Settings.RecordSyncReports ^= true; + Game.Settings.Save(); return true; }; @@ -48,6 +53,7 @@ namespace OpenRA.Widgets.Delegates { Game.Settings.MusicPlayer ^= true; r.GetWidget("MUSIC_BG").Visible = Game.Settings.MusicPlayer; + Game.Settings.Save(); return true; };