public void Save() { Trace.WriteLine($"Saving settings at '{path}'"); using (var stream = new SafeWriteStream(path)) using (var writer = new StreamWriter(stream, System.Text.Encoding.UTF8)) { foreach (var field in GetType().GetFields()) { if (!field.FieldType.IsGenericType || !typeof(Setting).IsAssignableFrom(field.FieldType.GetGenericTypeDefinition())) { continue; } var setting = (Setting)field.GetValue(this); writer.WriteLine($"{field.Name}: {setting}"); } stream.Commit(); } }
/// <summary> /// Doesn't run in the main thread /// </summary> public void ExportToOsb() { if (disposedValue) { throw new ObjectDisposedException(nameof(Project)); } string osuPath = null, osbPath = null; List <EditorStoryboardLayer> localLayers = null; Program.RunMainThread(() => { osuPath = MainBeatmap.Path; osbPath = OsbPath; if (!OwnsOsb && File.Exists(osbPath)) { File.Copy(osbPath, $"{osbPath}.bak"); } OwnsOsb = true; localLayers = new List <EditorStoryboardLayer>(layerManager.FindLayers(l => l.Visible)); }); var exportSettings = new ExportSettings(); if (!string.IsNullOrEmpty(osuPath)) { Debug.Print($"Exporting diff specific events to {osuPath}"); using (var stream = new SafeWriteStream(osuPath)) using (var writer = new StreamWriter(stream, Encoding.UTF8)) using (var fileStream = new FileStream(osuPath, FileMode.Open, FileAccess.Read, FileShare.Read)) using (var reader = new StreamReader(fileStream, Encoding.UTF8)) { string line; var inEvents = false; var inStoryboard = false; while ((line = reader.ReadLine()) != null) { var trimmedLine = line.Trim(); if (!inEvents && trimmedLine == "[Events]") { inEvents = true; } else if (trimmedLine.Length == 0) { inEvents = false; } if (inEvents) { if (trimmedLine.StartsWith("//Storyboard Layer")) { if (!inStoryboard) { foreach (var osbLayer in OsbLayers) { writer.WriteLine($"//Storyboard Layer {(int)osbLayer} ({osbLayer})"); foreach (var layer in localLayers) { if (layer.OsbLayer == osbLayer && layer.DiffSpecific) { layer.WriteOsbSprites(writer, exportSettings); } } } inStoryboard = true; } } else if (inStoryboard && trimmedLine.StartsWith("//")) { inStoryboard = false; } if (inStoryboard) { continue; } } writer.WriteLine(line); } stream.Commit(); } } Debug.Print($"Exporting osb to {osbPath}"); using (var stream = new SafeWriteStream(osbPath)) using (var writer = new StreamWriter(stream, Encoding.UTF8)) { writer.WriteLine("[Events]"); writer.WriteLine("//Background and Video events"); foreach (var osbLayer in OsbLayers) { writer.WriteLine($"//Storyboard Layer {(int)osbLayer} ({osbLayer})"); foreach (var layer in localLayers) { if (layer.OsbLayer == osbLayer && !layer.DiffSpecific) { layer.WriteOsbSprites(writer, exportSettings); } } } writer.WriteLine("//Storyboard Sound Samples"); stream.Commit(); } }
public void Save() { if (disposedValue) { throw new ObjectDisposedException(nameof(Project)); } using (var stream = new SafeWriteStream(projectPath)) using (var w = new BinaryWriter(stream, Encoding.UTF8)) { w.Write(Version); w.Write(Program.FullName); w.Write(MapsetPath); w.Write(MainBeatmap.Id); w.Write(MainBeatmap.Name); w.Write(OwnsOsb); w.Write(effects.Count); foreach (var effect in effects) { w.Write(effect.BaseName); w.Write(effect.Name); var config = effect.Config; w.Write(config.FieldCount); foreach (var field in config.SortedFields) { w.Write(field.Name); w.Write(field.DisplayName); ObjectSerializer.Write(w, field.Value); w.Write(field.AllowedValues?.Length ?? 0); if (field.AllowedValues != null) { foreach (var allowedValue in field.AllowedValues) { w.Write(allowedValue.Name); ObjectSerializer.Write(w, allowedValue.Value); } } } } w.Write(layerManager.LayersCount); foreach (var layer in layerManager.Layers) { w.Write(layer.Identifier); w.Write(effects.IndexOf(layer.Effect)); w.Write(layer.DiffSpecific); w.Write((int)layer.OsbLayer); w.Write(layer.Visible); } w.Write(importedAssemblies.Count); foreach (var assembly in importedAssemblies) { w.Write(assembly); } stream.Commit(); changed = false; } }