using System; using System.Collections.Generic; using System.IO; using System.Text; using BizHawk.Common.PathExtensions; namespace BizHawk.Client.Common { public class LuaFileList : List { private string _filename = ""; private bool _changes; public Action ChangedCallback { get; set; } public Action LoadCallback { get; set; } public bool Changes { get => _changes; set { _changes = value; if (ChangedCallback != null && _changes != value) { ChangedCallback(); } } } public string Filename { get => _filename; set => _filename = value ?? ""; } public void StopAllScripts() { ForEach(lf => lf.State = LuaFile.RunState.Disabled); } public new void Clear() { StopAllScripts(); _filename = ""; Changes = false; base.Clear(); } public new void Add(LuaFile item) { Changes = true; base.Add(item); } public new void Insert(int index, LuaFile item) { Changes = true; base.Insert(index, item); } public new bool Remove(LuaFile item) { Changes = true; return base.Remove(item); } public new int RemoveAll(Predicate match) { return base.RemoveAll(match); } public bool LoadLuaSession(string path) { var file = new FileInfo(path); if (file.Exists) { Clear(); using (var sr = file.OpenText()) { string line; while ((line = sr.ReadLine()) != null) { if (line.StartsWith("---")) { Add(LuaFile.SeparatorInstance); } else { var scriptPath = line.Substring(2, line.Length - 2); if (!Path.IsPathRooted(scriptPath)) { var directory = Path.GetDirectoryName(path); scriptPath = Path.GetFullPath(Path.Combine(directory ?? "", scriptPath)); } Add(new LuaFile(scriptPath) { State = !Global.Config.DisableLuaScriptsOnLoad && line.Substring(0, 1) == "1" ? LuaFile.RunState.Running : LuaFile.RunState.Disabled }); } } } Global.Config.RecentLuaSession.Add(path); ForEach(lua => Global.Config.RecentLua.Add(lua.Path)); _filename = path; LoadCallback?.Invoke(); return true; } return false; } public void SaveSession() { if (!string.IsNullOrWhiteSpace(_filename)) { SaveSession(_filename); } } public void SaveSession(string path) { using (var sw = new StreamWriter(path)) { var sb = new StringBuilder(); foreach (var file in this) { if (file.IsSeparator) { sb.AppendLine("---"); } else { sb .Append(file.Enabled ? "1" : "0") .Append(' ') .Append(Global.Config.PathEntries.AbsolutePathFor(file.Path, "").MakeRelativeTo(Path.GetDirectoryName(path))) .AppendLine(); } } sw.Write(sb.ToString()); } Filename = path; Global.Config.RecentLuaSession.Add(path); Changes = false; } } }