From 903686aed7f634f84cdc50580f0881b6cded7288 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Sat, 18 Nov 2017 14:18:46 +0200 Subject: [PATCH] Modified particle properties can be saved directly to the config file --- .../Source/Particles/ParticleManager.cs | 2 + .../Source/Screens/ParticleEditorScreen.cs | 37 ++++++++++++++++++- .../Serialization/SerializableProperty.cs | 4 +- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/Barotrauma/BarotraumaClient/Source/Particles/ParticleManager.cs b/Barotrauma/BarotraumaClient/Source/Particles/ParticleManager.cs index 882c022c0..75e3df2e7 100644 --- a/Barotrauma/BarotraumaClient/Source/Particles/ParticleManager.cs +++ b/Barotrauma/BarotraumaClient/Source/Particles/ParticleManager.cs @@ -14,6 +14,7 @@ namespace Barotrauma.Particles class ParticleManager { + public readonly string ConfigFile; public static int particleCount; private const int MaxOutOfViewDist = 500; @@ -27,6 +28,7 @@ namespace Barotrauma.Particles public ParticleManager(string configFile, Camera cam) { + ConfigFile = configFile; this.cam = cam; particles = new Particle[MaxParticles]; diff --git a/Barotrauma/BarotraumaClient/Source/Screens/ParticleEditorScreen.cs b/Barotrauma/BarotraumaClient/Source/Screens/ParticleEditorScreen.cs index 0da3c8d1d..e13245f55 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/ParticleEditorScreen.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/ParticleEditorScreen.cs @@ -83,13 +83,20 @@ namespace Barotrauma rightPanel = new GUIFrame(new Rectangle(0, 0, 450, GameMain.GraphicsHeight), null, Alignment.Right, "GUIFrameRight", guiRoot); rightPanel.Padding = new Vector4(10.0f, 20.0f, 0.0f, 20.0f); + var saveAllButton = new GUIButton(new Rectangle(leftPanel.Rect.Right + 20, 10, 150, 20), "Save all", "", guiRoot); + saveAllButton.OnClicked += (btn, obj) => + { + SerializeAll(); + return true; + }; + var serializeToClipBoardButton = new GUIButton(new Rectangle(leftPanel.Rect.Right + 20, 10, 150, 20), "Copy to clipboard", "", guiRoot); serializeToClipBoardButton.OnClicked += (btn, obj) => { SerializeToClipboard(selectedPrefab); return true; }; - + emitter = new Emitter(); var emitterEditor = new SerializableEntityEditor(emitter, false, rightPanel, true); @@ -142,6 +149,34 @@ namespace Barotrauma } } + private void SerializeAll() + { + XDocument doc = XMLExtensions.TryLoadXml(GameMain.ParticleManager.ConfigFile); + if (doc == null || doc.Root == null) return; + + var prefabList = GameMain.ParticleManager.GetPrefabList(); + foreach (ParticlePrefab prefab in prefabList) + { + foreach (XElement element in doc.Root.Elements()) + { + if (element.Name.ToString().ToLowerInvariant() != prefab.Name.ToLowerInvariant()) continue; + + SerializableProperty.SerializeProperties(prefab, element, true); + } + } + + XmlWriterSettings settings = new XmlWriterSettings(); + settings.Indent = true; + settings.OmitXmlDeclaration = true; + settings.NewLineOnAttributes = true; + + using (var writer = XmlWriter.Create(GameMain.ParticleManager.ConfigFile, settings)) + { + doc.WriteTo(writer); + writer.Flush(); + } + } + private void SerializeToClipboard(ParticlePrefab prefab) { if (prefab == null) return; diff --git a/Barotrauma/BarotraumaShared/Source/Serialization/SerializableProperty.cs b/Barotrauma/BarotraumaShared/Source/Serialization/SerializableProperty.cs index 3b41471f6..2dd952ac4 100644 --- a/Barotrauma/BarotraumaShared/Source/Serialization/SerializableProperty.cs +++ b/Barotrauma/BarotraumaShared/Source/Serialization/SerializableProperty.cs @@ -443,8 +443,8 @@ namespace Barotrauma break; } } - - element.Add(new XAttribute(property.Name.ToLowerInvariant(), stringValue)); + + element.SetAttributeValue(property.Name.ToLowerInvariant(), stringValue); } } }