BizHawk/BizHawk.Client.Common/lua/LuaFileList.cs

161 lines
2.9 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace BizHawk.Client.Common
{
public class LuaFileList : List<LuaFile>
{
private string _filename = string.Empty;
private bool _changes;
public Action ChangedCallback { get; set; }
public Action LoadCallback { get; set; }
public bool Changes
{
get
{
return _changes;
}
set
{
_changes = value;
if (ChangedCallback != null && _changes != value)
{
ChangedCallback();
}
}
}
public string Filename
{
get
{
return _filename;
}
set
{
_filename = value ?? string.Empty;
}
}
public void StopAllScripts()
{
ForEach(x => x.Enabled = false);
}
public new void Clear()
{
StopAllScripts();
_filename = string.Empty;
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<LuaFile> 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.Combine(directory, scriptPath);
}
Add(new LuaFile(scriptPath)
{
Enabled = !Global.Config.DisableLuaScriptsOnLoad &&
line.Substring(0, 1) == "1",
});
}
}
}
Global.Config.RecentLuaSession.Add(path);
ForEach(lua => Global.Config.RecentLua.Add(lua.Path));
_filename = path;
if (LoadCallback != null)
{
LoadCallback();
}
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)
{
sb
.Append(file.Enabled ? "1" : "0")
.Append(' ')
.Append(PathManager.MakeRelativeTo(PathManager.MakeAbsolutePath(file.Path, ""), Path.GetDirectoryName(path)))
.AppendLine();
}
sw.Write(sb.ToString());
}
Filename = path;
Global.Config.RecentLuaSession.Add(path);
Changes = false;
}
}
}