BizHawk/BizHawk.MultiClient/tools/LuaConsole.cs

1290 lines
32 KiB
C#
Raw Normal View History

2011-05-06 01:37:28 +00:00
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
2011-05-07 00:07:27 +00:00
using System.IO;
using LuaInterface;
2011-05-06 01:37:28 +00:00
namespace BizHawk.MultiClient
{
public partial class LuaConsole : Form
{
//TODO: remember column widths
//TODO: restore column width on restore default settings
int defaultWidth; //For saving the default size of the dialog, so the user can restore if desired
int defaultHeight;
string currentSessionFile = "";
2012-03-23 19:48:45 +00:00
List<LuaFile> luaList = new List<LuaFile>();
public LuaImplementation LuaImp;
string lastLuaFile = "";
bool changes = false;
2012-03-23 19:48:45 +00:00
private List<LuaFile> GetLuaFileList()
{
2012-03-23 19:48:45 +00:00
List<LuaFile> l = new List<LuaFile>();
for (int x = 0; x < luaList.Count; x++)
2012-03-23 19:48:45 +00:00
l.Add(new LuaFile(luaList[x]));
return l;
}
public LuaConsole get()
{
return this;
}
public void AddText(string s)
{
OutputBox.Text += s + "\n\n";
}
public LuaConsole()
{
InitializeComponent();
LuaImp = new LuaImplementation(this);
Closing += (o, e) => SaveConfigSettings();
LuaListView.QueryItemText += new QueryItemTextHandler(LuaListView_QueryItemText);
LuaListView.QueryItemBkColor += new QueryItemBkColorHandler(LuaListView_QueryItemBkColor);
LuaListView.VirtualMode = true;
}
private void Changes(bool changesOccured)
{
if (changesOccured)
{
changes = true;
OutputMessages.Text = "* " + Path.GetFileName(currentSessionFile);
}
else
{
changes = false;
OutputMessages.Text = Path.GetFileName(currentSessionFile);
}
}
private void LuaListView_QueryItemBkColor(int index, int column, ref Color color)
{
if (column == 0)
{
if (luaList[index].IsSeparator)
color = this.BackColor;
else if (luaList[index].Enabled && !luaList[index].Paused)
color = Color.LightCyan;
else if (luaList[index].Enabled && luaList[index].Paused)
color = Color.IndianRed;
}
UpdateNumberOfScripts();
}
private void LuaListView_QueryItemText(int index, int column, out string text)
{
text = "";
if (column == 0)
text = Path.GetFileNameWithoutExtension(luaList[index].Path); //TODO: how about a list of Names and allow the user to name them?
if (column == 1)
text = luaList[index].Path;
}
private void LuaConsole_Load(object sender, EventArgs e)
{
LoadConfigSettings();
2012-03-19 16:49:47 +00:00
if (Global.Config.AutoLoadLuaSession)
{
if (!Global.Config.RecentLuaSession.IsEmpty())
{
LoadSessionFromRecent(Global.Config.RecentLuaSession.GetRecentFileByPosition(0));
}
}
newStripButton1.Visible = Global.MainForm.INTERIM;
newScriptToolStripMenuItem.Visible = Global.MainForm.INTERIM;
newStripButton1.Enabled = Global.MainForm.INTERIM;
newScriptToolStripMenuItem.Enabled = Global.MainForm.INTERIM;
}
private void StopScript(int x)
{
2012-03-23 19:48:45 +00:00
luaList[x].Stop();
Changes(true);
}
private void StopAllScripts()
{
for (int x = 0; x < luaList.Count; x++)
luaList[x].Enabled = false;
Changes(true);
}
public void Restart()
{
StopAllScripts();
}
private void SaveConfigSettings()
{
LuaImp.Close();
Global.Config.LuaConsoleWndx = this.Location.X;
Global.Config.LuaConsoleWndy = this.Location.Y;
Global.Config.LuaConsoleWidth = this.Right - this.Left;
Global.Config.LuaConsoleHeight = this.Bottom - this.Top;
}
private void LoadConfigSettings()
{
defaultWidth = Size.Width; //Save these first so that the user can restore to its original size
defaultHeight = Size.Height;
if (Global.Config.LuaConsoleSaveWindowPosition && Global.Config.LuaConsoleWndx >= 0 && Global.Config.LuaConsoleWndy >= 0)
Location = new Point(Global.Config.LuaConsoleWndx, Global.Config.LuaConsoleWndy);
if (Global.Config.LuaConsoleWidth >= 0 && Global.Config.LuaConsoleHeight >= 0)
{
Size = new System.Drawing.Size(Global.Config.LuaConsoleWidth, Global.Config.LuaConsoleHeight);
}
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Close();
}
private void restoreWindowSizeToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Size = new System.Drawing.Size(defaultWidth, defaultHeight);
}
private FileInfo GetFileFromUser(string filter)
{
var ofd = new OpenFileDialog();
if (lastLuaFile.Length > 0)
ofd.FileName = Path.GetFileNameWithoutExtension(lastLuaFile);
ofd.InitialDirectory = PathManager.MakeAbsolutePath(Global.Config.LuaPath, "");
ofd.Filter = filter;
ofd.RestoreDirectory = true;
if (!Directory.Exists(ofd.InitialDirectory))
Directory.CreateDirectory(ofd.InitialDirectory);
Global.Sound.StopSound();
var result = ofd.ShowDialog();
Global.Sound.StartSound();
if (result != DialogResult.OK)
return null;
var file = new FileInfo(ofd.FileName);
return file;
}
public void LoadLuaFile(string path)
{
if (LuaAlreadyInSession(path) == false)
{
LuaFile l = new LuaFile("", path);
luaList.Add(l);
LuaListView.ItemCount = luaList.Count;
LuaListView.Refresh();
Global.Config.RecentLua.Add(path);
if (!Global.Config.DisableLuaScriptsOnLoad)
{
try
{
l.Thread = LuaImp.SpawnCoroutine(path);
l.Enabled = true;
}
catch (Exception e)
{
if (e.ToString().Substring(0, 32) == "LuaInterface.LuaScriptException:")
{
l.Enabled = false;
AddText(e.Message);
}
else MessageBox.Show(e.ToString());
}
}
else l.Enabled = false;
l.Paused = false;
Changes(true);
}
else
{
for (int i = 0; i < luaList.Count; i++)
{
if (path == luaList[i].Path && luaList[i].Enabled == false && !Global.Config.DisableLuaScriptsOnLoad)
{
luaList[i].Toggle();
RunLuaScripts();
LuaListView.Refresh();
Changes(true);
break;
}
}
}
}
private void OpenLuaFile()
{
var file = GetFileFromUser("Lua Scripts (*.lua)|*.lua|Text (*.text)|*.txt|All Files|*.*");
if (file != null)
{
LoadLuaFile(file.FullName);
DisplayLuaList();
}
}
public void DisplayLuaList()
{
LuaListView.ItemCount = luaList.Count;
}
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenLuaFile();
}
private void optionsToolStripMenuItem_DropDownOpened(object sender, EventArgs e)
{
saveWindowPositionToolStripMenuItem.Checked = Global.Config.LuaConsoleSaveWindowPosition;
autoloadConsoleToolStripMenuItem.Checked = Global.Config.AutoLoadLuaConsole;
2012-03-19 16:49:47 +00:00
autoloadSessionToolStripMenuItem.Checked = Global.Config.AutoLoadLuaSession;
disableScriptsOnLoadToolStripMenuItem.Checked = Global.Config.DisableLuaScriptsOnLoad;
}
private void saveWindowPositionToolStripMenuItem_Click(object sender, EventArgs e)
{
Global.Config.LuaConsoleSaveWindowPosition ^= true;
}
private void Toggle()
{
ListView.SelectedIndexCollection indexes = LuaListView.SelectedIndices;
if (indexes.Count > 0)
{
for (int x = 0; x < indexes.Count; x++)
{
2012-03-23 19:48:45 +00:00
var item = luaList[indexes[x]];
if (!item.IsSeparator)
{
item.Toggle();
}
2012-03-23 19:48:45 +00:00
if (item.Enabled && item.Thread == null)
try
{
item.Thread = LuaImp.SpawnCoroutine(item.Path);
}
catch (Exception e)
{
if (e.ToString().Substring(0, 32) == "LuaInterface.LuaScriptException:")
{
item.Enabled = false;
AddText(e.Message);
}
else MessageBox.Show(e.ToString());
}
2012-03-23 19:48:45 +00:00
else if (!item.Enabled && item.Thread != null)
item.Stop();
}
}
LuaListView.Refresh();
Changes(true);
}
public void RunLuaScripts()
{
for (int x = 0; x < luaList.Count; x++)
{
if (luaList[x].Enabled && luaList[x].Thread == null)
{
try
{
luaList[x].Thread = LuaImp.SpawnCoroutine(luaList[x].Path);
}
catch (Exception e)
{
if (e.ToString().Substring(0, 32) == "LuaInterface.LuaScriptException:")
{
luaList[x].Enabled = false;
AddText(e.Message);
}
else MessageBox.Show(e.ToString());
}
}
else
{
StopScript(x);
}
}
}
private void UpdateNumberOfScripts()
{
string message = "";
int active = 0, paused = 0, separators = 0;
for (int x = 0; x < luaList.Count; x++)
{
if (!luaList[x].IsSeparator)
{
if (luaList[x].Enabled)
{
active++;
if (luaList[x].Paused)
paused++;
}
}
else
{
separators++;
}
}
int L = luaList.Count - separators;
if (L == 1)
message += L.ToString() + " script (" + active.ToString() + " active, " + paused.ToString() + " paused)";
else if (L == 0)
message += L.ToString() + " script";
else
message += L.ToString() + " scripts (" + active.ToString() + " active, " + paused.ToString() + " paused)";
NumberOfScripts.Text = message;
}
private void moveUpToolStripMenuItem_Click(object sender, EventArgs e)
{
MoveUp();
}
private void moveDownToolStripMenuItem_Click(object sender, EventArgs e)
{
MoveDown();
}
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
if (changes)
{
if (string.Compare(currentSessionFile, "") == 0)
SaveAs();
else SaveSession(currentSessionFile);
Changes(false);
OutputMessages.Text = Path.GetFileName(currentSessionFile) + " saved.";
}
}
private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
{
SaveAs();
}
private void newToolStripMenuItem_Click(object sender, EventArgs e)
{
NewLuaSession(false);
}
private void NewLuaSession(bool suppressAsk)
{
bool result = true;
if (changes) result = AskSave();
if (result == true || suppressAsk)
{
ClearOutput();
StopAllScripts();
luaList.Clear();
DisplayLuaList();
currentSessionFile = "";
Changes(false);
}
}
private void turnOffAllScriptsToolStripMenuItem_Click(object sender, EventArgs e)
{
StopAllScripts();
}
private void stopAllScriptsToolStripMenuItem_Click(object sender, EventArgs e)
{
StopAllScripts();
}
private void autoloadConsoleToolStripMenuItem_Click(object sender, EventArgs e)
{
Global.Config.AutoLoadLuaConsole ^= true;
}
private void removeToolStripMenuItem_Click(object sender, EventArgs e)
{
RemoveScript();
}
private void RemoveScript()
{
if (luaList.Count == 0) return;
Changes(true);
ListView.SelectedIndexCollection indexes = LuaListView.SelectedIndices;
if (indexes.Count > 0)
{
foreach (int index in indexes)
{
luaList.Remove(luaList[indexes[0]]); //index[0] used since each iteration will make this the correct list index
}
indexes.Clear();
DisplayLuaList();
UpdateNumberOfScripts();
}
}
private void removeScriptToolStripMenuItem_Click(object sender, EventArgs e)
{
RemoveScript();
}
private void insertSeperatorToolStripMenuItem_Click(object sender, EventArgs e)
{
InsertSeparator();
}
private void InsertSeparator()
{
2012-03-23 19:48:45 +00:00
LuaFile f = new LuaFile(true);
f.IsSeparator = true;
ListView.SelectedIndexCollection indexes = LuaListView.SelectedIndices;
int x;
if (indexes.Count > 0)
{
x = indexes[0];
if (indexes[0] > 0)
luaList.Insert(indexes[0], f);
}
else
luaList.Add(f);
DisplayLuaList();
LuaListView.Refresh();
Changes(true);
}
private void insertSeperatorToolStripMenuItem1_Click(object sender, EventArgs e)
{
InsertSeparator();
}
private void MoveUp()
{
ListView.SelectedIndexCollection indexes = LuaListView.SelectedIndices;
if (indexes[0] == 0)
return;
2012-03-23 19:48:45 +00:00
LuaFile temp = new LuaFile(false);
if (indexes.Count == 0) return;
foreach (int index in indexes)
{
temp = luaList[index];
luaList.Remove(luaList[index]);
luaList.Insert(index - 1, temp);
//Note: here it will get flagged many times redundantly potentially,
//but this avoids it being flagged falsely when the user did not select an index
Changes(true);
}
List<int> i = new List<int>();
for (int z = 0; z < indexes.Count; z++)
i.Add(indexes[z] - 1);
LuaListView.SelectedIndices.Clear();
for (int z = 0; z < i.Count; z++)
LuaListView.SelectItem(i[z], true);
DisplayLuaList();
}
private void MoveDown()
{
ListView.SelectedIndexCollection indexes = LuaListView.SelectedIndices;
2012-03-23 19:48:45 +00:00
LuaFile temp = new LuaFile(false);
if (indexes.Count == 0) return;
foreach (int index in indexes)
{
temp = luaList[index];
if (index < luaList.Count - 1)
{
luaList.Remove(luaList[index]);
luaList.Insert(index + 1, temp);
}
//Note: here it will get flagged many times redundantly potnetially,
//but this avoids it being flagged falsely when the user did not select an index
Changes(true);
}
List<int> i = new List<int>();
for (int z = 0; z < indexes.Count; z++)
i.Add(indexes[z] + 1);
LuaListView.SelectedIndices.Clear();
for (int z = 0; z < i.Count; z++)
LuaListView.SelectItem(i[z], true);
DisplayLuaList();
}
private void toggleToolStripMenuItem_Click(object sender, EventArgs e)
{
Toggle();
}
private void recentToolStripMenuItem_DropDownOpened(object sender, EventArgs e)
{
//Clear out recent Cheats list
//repopulate it with an up to date list
recentToolStripMenuItem.DropDownItems.Clear();
if (Global.Config.RecentLua.IsEmpty())
{
var none = new ToolStripMenuItem();
none.Enabled = false;
none.Text = "None";
recentToolStripMenuItem.DropDownItems.Add(none);
}
else
{
for (int x = 0; x < Global.Config.RecentLua.Length(); x++)
{
string path = Global.Config.RecentLua.GetRecentFileByPosition(x);
var item = new ToolStripMenuItem();
item.Text = path;
item.Click += (o, ev) => LoadLuaFromRecent(path);
recentToolStripMenuItem.DropDownItems.Add(item);
}
}
recentToolStripMenuItem.DropDownItems.Add("-");
var clearitem = new ToolStripMenuItem();
clearitem.Text = "&Clear";
clearitem.Click += (o, ev) => Global.Config.RecentLua.Clear();
recentToolStripMenuItem.DropDownItems.Add(clearitem);
}
private void LoadLuaFromRecent(string path)
{
LoadLuaFile(path);
}
private bool LuaAlreadyInSession(string path)
{
bool Validated = false;
for (int i = 0; i < luaList.Count; i++)
{
if (path == luaList[i].Path)
{
Validated = true;
break;
}
}
return Validated;
}
private void LuaConsole_DragDrop(object sender, DragEventArgs e)
{
string[] filePaths = (string[])e.Data.GetData(DataFormats.FileDrop);
try
{
foreach (string path in filePaths)
{
if (Path.GetExtension(path) == (".lua") || Path.GetExtension(path) == (".txt"))
{
LoadLuaFile(path);
DisplayLuaList();
}
else if (Path.GetExtension(path) == (".luases"))
{
LoadLuaSession(path);
RunLuaScripts();
return;
}
}
}
catch (Exception ex)
{
if (ex.ToString().Substring(0, 32) == "LuaInterface.LuaScriptException:" || ex.ToString().Substring(0, 26) == "LuaInterface.LuaException:")
{
AddText(ex.Message);
}
else MessageBox.Show(ex.Message);
}
}
private void LuaConsole_DragEnter(object sender, DragEventArgs e)
{
e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Copy : DragDropEffects.None; string[] filePaths = (string[])e.Data.GetData(DataFormats.FileDrop);
}
private void LuaListView_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Delete && !e.Control && !e.Alt && !e.Shift)
{
RemoveScript();
}
else if (e.KeyCode == Keys.A && e.Control && !e.Alt && !e.Shift) //Select All
{
SelectAll();
}
}
private void editScriptToolStripMenuItem_Click(object sender, EventArgs e)
{
EditScript();
}
private void editToolStripMenuItem_Click(object sender, EventArgs e)
{
EditScript();
}
private void EditScript()
{
ListView.SelectedIndexCollection indexes = LuaListView.SelectedIndices;
if (indexes.Count == 0)
return;
if (indexes.Count > 0)
{
for (int x = 0; x < indexes.Count; x++)
{
var item = luaList[indexes[x]];
if (!item.IsSeparator)
System.Diagnostics.Process.Start(luaList[indexes[x]].Path);
}
}
}
private void toggleScriptToolStripMenuItem_Click(object sender, EventArgs e)
{
Toggle();
}
private void selectAllToolStripMenuItem_Click(object sender, EventArgs e)
{
SelectAll();
}
private void SelectAll()
{
for (int x = 0; x < luaList.Count; x++)
{
LuaListView.SelectItem(x, true);
}
}
private void toolStripButtonMoveDown_Click(object sender, EventArgs e)
{
MoveDown();
}
private void toolStripButtonMoveUp_Click(object sender, EventArgs e)
{
MoveUp();
}
private void toolStripButtonSeparator_Click(object sender, EventArgs e)
{
InsertSeparator();
}
private void copyToolStripButton_Click(object sender, EventArgs e)
{
Toggle();
}
private void EditToolstripButton_Click(object sender, EventArgs e)
{
if (Global.MainForm.INTERIM)
{
DoLuaWriter();
}
else
{
EditScript();
}
}
private void cutToolStripButton_Click(object sender, EventArgs e)
{
RemoveScript();
}
public void WriteToOutputWindow(string message)
{
if (!OutputBox.IsHandleCreated || OutputBox.IsDisposed)
return;
2012-03-17 23:40:30 +00:00
OutputBox.Invoke(() =>
{
OutputBox.Text += message + "\n\n";
2012-03-17 23:40:30 +00:00
OutputBox.Refresh();
});
}
2012-01-21 20:38:43 +00:00
public void ClearOutputWindow()
{
if (!OutputBox.IsHandleCreated || OutputBox.IsDisposed)
return;
2012-03-17 23:40:30 +00:00
OutputBox.Invoke(() =>
{
OutputBox.Text = "";
OutputBox.Refresh();
});
}
2012-01-21 20:38:43 +00:00
private void openToolStripMenuItem_Click_1(object sender, EventArgs e)
{
OpenLuaFile();
}
private void luaFunctionsListToolStripMenuItem_Click(object sender, EventArgs e)
{
Global.Sound.StopSound();
new LuaFunctionList().ShowDialog();
Global.Sound.StartSound();
}
public bool LoadLuaSession(string path)
{
var file = new FileInfo(path);
if (file.Exists == false) return false;
ClearOutput();
StopAllScripts();
2012-03-23 19:48:45 +00:00
luaList = new List<LuaFile>();
using (StreamReader sr = file.OpenText())
{
bool enabled = false;
string s = "";
string temp = "";
LuaFile l;
while ((s = sr.ReadLine()) != null)
{
//.luases
if (s.Length < 3) continue;
if (s.Substring(0, 3) == "---")
{
l = new LuaFile(true);
l.IsSeparator = true;
}
else
{
temp = s.Substring(0, 1); //Get enabled flag
try
{
if (int.Parse(temp) == 0)
enabled = false;
else
enabled = true;
}
catch
{
return false; //TODO: report an error?
}
s = s.Substring(2, s.Length - 2); //Get path
l = new LuaFile(s);
if (!Global.Config.DisableLuaScriptsOnLoad)
l.Enabled = enabled;
else
l.Enabled = false;
}
luaList.Add(l);
}
}
2012-03-17 21:59:56 +00:00
Global.Config.RecentLuaSession.Add(path);
currentSessionFile = path;
Changes(false);
return true;
}
private void OpenLuaSession()
{
var file = GetFileFromUser("Lua Session Files (*.luases)|*.luases|All Files|*.*");
if (file != null)
{
LoadLuaSession(file.FullName);
RunLuaScripts();
DisplayLuaList();
}
}
private void openSessionToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenLuaSession();
}
/// <summary>
/// resumes suspended coroutines
/// </summary>
/// <param name="includeFrameWaiters">should frame waiters be waken up? only use this immediately before a frame of emulation</param>
public void ResumeScripts(bool includeFrameWaiters)
{
2012-08-02 21:46:08 +00:00
for (int i = 0; i < luaList.Count; i++)
2012-03-23 19:48:45 +00:00
{
try
{
LuaImp.gui_drawNewEmu();
//LuaImp.gui_clearGraphics();
2012-08-02 21:46:08 +00:00
if (luaList[i].Enabled && luaList[i].Thread != null && !(luaList[i].Paused))
{
bool prohibit = false;
2012-08-02 21:46:08 +00:00
if (luaList[i].FrameWaiting && !includeFrameWaiters)
prohibit = true;
if (!prohibit)
{
2012-08-02 21:46:08 +00:00
var result = LuaImp.ResumeScript(luaList[i].Thread);
if (result.Terminated) luaList[i].Stop();
luaList[i].FrameWaiting = result.WaitForFrame;
}
}
LuaImp.gui_drawFinishEmu();
}
catch (Exception ex)
{
if (ex is LuaInterface.LuaScriptException || ex is LuaInterface.LuaException)
{
2012-08-02 21:46:08 +00:00
luaList[i].Enabled = false;
luaList[i].Thread = null;
AddText(ex.ToString());
}
else MessageBox.Show(ex.ToString());
}
2012-03-23 19:48:45 +00:00
}
}
public bool IsRunning()
{
2012-03-23 19:48:45 +00:00
return true;
}
2012-03-17 23:40:30 +00:00
public bool WaitOne(int timeout)
{
if (!this.IsHandleCreated || this.IsDisposed)
2012-03-17 23:40:30 +00:00
return true;
2012-03-17 23:40:30 +00:00
return this.LuaImp.LuaWait.WaitOne(timeout);
}
private void openToolStripButton_Click(object sender, EventArgs e)
{
OpenLuaFile();
}
private void LuaListView_ItemActivate(object sender, EventArgs e)
{
Toggle();
}
private void clearToolStripMenuItem2_Click(object sender, EventArgs e)
{
ClearOutput();
}
private void ClearOutput()
{
OutputBox.Text = "";
}
private FileInfo GetSaveFileFromUser()
{
var sfd = new SaveFileDialog();
if (currentSessionFile.Length > 0)
{
sfd.FileName = Path.GetFileNameWithoutExtension(currentSessionFile);
sfd.InitialDirectory = Path.GetDirectoryName(currentSessionFile);
}
else if (!(Global.Emulator is NullEmulator))
{
sfd.FileName = PathManager.FilesystemSafeName(Global.Game);
sfd.InitialDirectory = PathManager.MakeAbsolutePath(Global.Config.LuaPath, "");
}
else
{
sfd.FileName = "NULL";
sfd.InitialDirectory = PathManager.MakeAbsolutePath(Global.Config.LuaPath, "");
}
sfd.Filter = "Lua Session Files (*.luases)|*.luases|All Files|*.*";
sfd.RestoreDirectory = true;
Global.Sound.StopSound();
var result = sfd.ShowDialog();
Global.Sound.StartSound();
if (result != DialogResult.OK)
return null;
var file = new FileInfo(sfd.FileName);
return file;
}
private void SaveAs()
{
var file = GetSaveFileFromUser();
if (file != null)
{
SaveSession(file.FullName);
currentSessionFile = file.FullName;
OutputMessages.Text = Path.GetFileName(currentSessionFile) + " saved.";
Global.Config.RecentLuaSession.Add(file.FullName);
Changes(false);
}
}
private bool SaveSession(string path)
{
var file = new FileInfo(path);
using (StreamWriter sw = new StreamWriter(path))
{
string str = "";
for (int i = 0; i < luaList.Count; i++)
{
if (!luaList[i].IsSeparator)
{
if (luaList[i].Enabled)
str += "1 ";
else
str += "0 ";
str += luaList[i].Path + "\n";
}
else
{
str += "---\n";
}
}
sw.Write(str);
}
Changes(false);
return true;
}
private void fileToolStripMenuItem_DropDownOpened(object sender, EventArgs e)
{
if (!changes)
{
saveToolStripMenuItem.Enabled = false;
}
else
{
saveToolStripMenuItem.Enabled = true;
}
}
2012-03-17 21:59:56 +00:00
private void recentSessionsToolStripMenuItem_DropDownOpened(object sender, EventArgs e)
{
//Clear out recent Cheats list
//repopulate it with an up to date list
recentSessionsToolStripMenuItem.DropDownItems.Clear();
if (Global.Config.RecentLuaSession.IsEmpty())
{
var none = new ToolStripMenuItem();
none.Enabled = false;
none.Text = "None";
recentSessionsToolStripMenuItem.DropDownItems.Add(none);
}
else
{
for (int x = 0; x < Global.Config.RecentLuaSession.Length(); x++)
{
string path = Global.Config.RecentLuaSession.GetRecentFileByPosition(x);
var item = new ToolStripMenuItem();
item.Text = path;
item.Click += (o, ev) => LoadSessionFromRecent(path);
recentSessionsToolStripMenuItem.DropDownItems.Add(item);
}
}
recentSessionsToolStripMenuItem.DropDownItems.Add("-");
var clearitem = new ToolStripMenuItem();
clearitem.Text = "&Clear";
clearitem.Click += (o, ev) => Global.Config.RecentLuaSession.Clear();
recentSessionsToolStripMenuItem.DropDownItems.Add(clearitem);
}
public void LoadSessionFromRecent(string file)
{
bool z = true;
if (changes) z = AskSave();
if (z)
{
bool r = LoadLuaSession(file);
if (!r)
{
DialogResult result = MessageBox.Show("Could not open " + file + "\nRemove from list?", "File not found", MessageBoxButtons.YesNo, MessageBoxIcon.Error);
if (result == DialogResult.Yes)
Global.Config.RecentLuaSession.Remove(file);
}
RunLuaScripts();
DisplayLuaList();
//ClearOutput();
LuaListView.Refresh();
currentSessionFile = file;
Changes(false);
2012-03-17 21:59:56 +00:00
}
}
public bool AskSave()
{
if (Global.Config.SupressAskSave) //User has elected to not be nagged
{
return true;
}
2012-03-17 21:59:56 +00:00
if (changes)
{
Global.Sound.StopSound();
DialogResult result = MessageBox.Show("Save changes to session?", "Lua Console", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button3);
Global.Sound.StartSound();
if (result == DialogResult.Yes)
{
if (string.Compare(currentSessionFile, "") == 0)
{
SaveAs();
}
else
SaveSession(currentSessionFile);
return true;
}
else if (result == DialogResult.No)
return true;
else if (result == DialogResult.Cancel)
return false;
}
return true;
}
private void moveUpToolStripMenuItem_Click_1(object sender, EventArgs e)
{
MoveUp();
}
private void moveDownToolStripMenuItem_Click_1(object sender, EventArgs e)
{
MoveDown();
}
private void scriptToolStripMenuItem_DropDownOpened(object sender, EventArgs e)
{
bool luaRunning = false;
for (int i = 0; i < luaList.Count; i++)
{
if (luaList[i].Enabled)
luaRunning = true;
}
ListView.SelectedIndexCollection indexes = LuaListView.SelectedIndices;
if (indexes.Count > 0)
{
scriptToolStripMenuItem.DropDownItems[1].Enabled = true;
scriptToolStripMenuItem.DropDownItems[2].Enabled = true;
scriptToolStripMenuItem.DropDownItems[3].Enabled = true;
scriptToolStripMenuItem.DropDownItems[4].Enabled = true;
scriptToolStripMenuItem.DropDownItems[7].Enabled = true;
scriptToolStripMenuItem.DropDownItems[8].Enabled = true;
bool allSeparators = true;
for (int i = 0; i < indexes.Count; i++)
{
if (!luaList[indexes[i]].IsSeparator)
allSeparators = false;
}
if (allSeparators)
scriptToolStripMenuItem.DropDownItems[3].Enabled = false;
else
scriptToolStripMenuItem.DropDownItems[3].Enabled = true;
}
else
{
scriptToolStripMenuItem.DropDownItems[1].Enabled = false;
scriptToolStripMenuItem.DropDownItems[2].Enabled = false;
scriptToolStripMenuItem.DropDownItems[3].Enabled = false;
scriptToolStripMenuItem.DropDownItems[4].Enabled = false;
scriptToolStripMenuItem.DropDownItems[7].Enabled = false;
scriptToolStripMenuItem.DropDownItems[8].Enabled = false;
}
if (luaList.Count > 0)
scriptToolStripMenuItem.DropDownItems[9].Enabled = true;
else
scriptToolStripMenuItem.DropDownItems[9].Enabled = false;
if (luaRunning)
scriptToolStripMenuItem.DropDownItems[11].Enabled = true;
else
scriptToolStripMenuItem.DropDownItems[11].Enabled = false;
}
private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
{
ListView.SelectedIndexCollection indexes = LuaListView.SelectedIndices;
bool luaRunning = false;
for (int i = 0; i < luaList.Count; i++)
{
if (luaList[i].Enabled)
luaRunning = true;
}
if (indexes.Count > 0)
{
contextMenuStrip1.Items[0].Enabled = true;
contextMenuStrip1.Items[1].Enabled = true;
contextMenuStrip1.Items[2].Enabled = true;
contextMenuStrip1.Items[3].Enabled = true;
bool allSeparators = true;
for (int i = 0; i < indexes.Count; i++)
{
if (!luaList[indexes[i]].IsSeparator)
allSeparators = false;
}
if (allSeparators)
contextMenuStrip1.Items[2].Enabled = false;
else
contextMenuStrip1.Items[2].Enabled = true;
}
else
{
contextMenuStrip1.Items[0].Enabled = false;
contextMenuStrip1.Items[1].Enabled = false;
contextMenuStrip1.Items[2].Enabled = false;
contextMenuStrip1.Items[3].Enabled = true;
}
if (luaRunning)
{
contextMenuStrip1.Items[5].Visible = true;
contextMenuStrip1.Items[6].Visible = true;
}
else
{
contextMenuStrip1.Items[5].Visible = false;
contextMenuStrip1.Items[6].Visible = false;
}
}
private void disableScriptsOnLoadToolStripMenuItem_Click(object sender, EventArgs e)
{
Global.Config.DisableLuaScriptsOnLoad ^= true;
}
2012-03-19 16:49:47 +00:00
private void autoloadSessionToolStripMenuItem_Click(object sender, EventArgs e)
{
Global.Config.AutoLoadLuaSession ^= true;
}
private void toolStripButton1_Click(object sender, EventArgs e)
{
TogglePause();
}
private void TogglePause()
{
ListView.SelectedIndexCollection indexes = LuaListView.SelectedIndices;
if (indexes.Count > 0)
{
for (int x = 0; x < indexes.Count; x++)
{
var item = luaList[indexes[x]];
if (!item.IsSeparator)
item.TogglePause();
}
}
LuaListView.Refresh();
}
private void pauseResumeToolStripMenuItem_Click(object sender, EventArgs e)
{
TogglePause();
}
private void toolStripButton1_Click_1(object sender, EventArgs e)
{
TogglePause();
}
private void resumePauseToolStripMenuItem_Click(object sender, EventArgs e)
{
TogglePause();
}
private void onlineDocumentationToolStripMenuItem_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://tasvideos.org/BizHawk/LuaFunctions.html");
}
private void DoLuaWriter()
{
ListView.SelectedIndexCollection indexes = LuaListView.SelectedIndices;
if (indexes.Count == 0)
return;
if (indexes.Count > 0)
{
//If/When we want multiple file editing
/*
for (int x = 0; x < indexes.Count; x++)
{
var item = luaList[indexes[x]];
if (!item.IsSeparator)
{
OpenLuaWriter(luaList[indexes[x]].Path);
}
}
*/
var item = luaList[indexes[0]];
if (!item.IsSeparator)
{
OpenLuaWriter(luaList[indexes[0]].Path);
}
}
}
private void OpenLuaWriter(string path)
{
LuaWriter writer = new LuaWriter();
writer.CurrentFile = path;
writer.Show();
}
private void newScriptToolStripMenuItem_Click(object sender, EventArgs e)
{
NewScript();
}
private void NewScript()
{
OpenLuaWriter(null);
}
private void newStripButton1_Click(object sender, EventArgs e)
{
NewScript();
}
}
2011-05-06 01:37:28 +00:00
}