rmdec/RMDEC/projectSelector.cs

177 lines
5.6 KiB
C#

using Microsoft.WindowsAPICodePack.Dialogs;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Windows.Forms;
namespace RMDEC
{
public partial class projectSelector : Form
{
private List<Object> globalProjectList = new List<Object>();
public projectSelector()
{
InitializeComponent();
}
private void onIndexingComplete()
{
this.Cursor = Cursors.Arrow;
}
private bool tryAddProject(string projectFile)
{
string relativeName = projectFile.Remove(0,projectDir.Text.Length + 1);
string extension = Path.GetExtension(projectFile).ToLower();
if (extension == ".json" || extension == ".js")
{
try
{
MVProject proj = MVProject.ParseSystemJson(projectFile);
globalProjectList.Add(proj);
if(!proj.MZ)
projectList.Items.Add("[RMMV] - " + proj.GameTitle + " - " + relativeName);
else
projectList.Items.Add("[RMMZ] - " + proj.GameTitle + " - " + relativeName);
selectButton.Enabled = true;
}
catch (Exception) { return false; }
}
else if (extension == ".rgss3a")
{
try
{
VXAProject proj = VXAProject.ParseRgss3a(projectFile);
globalProjectList.Add(proj);
projectList.Items.Add("[RMVXA] - " + proj.GameTitle + " - " + relativeName);
selectButton.Enabled = true;
}
catch (Exception) { return false; }
}
return true;
}
private void updateProjectList(string projectDir)
{
if (Directory.Exists(projectDir))
{
this.Cursor = Cursors.WaitCursor;
Thread indexProjects = new Thread(() =>
{
IEnumerable fileList = Directory.EnumerateFiles(projectDir, "*", SearchOption.AllDirectories);
try
{
foreach (string fileEntry in fileList)
{
if (Path.GetFileName(fileEntry).ToLower() == "system.json" || Path.GetFileName(fileEntry).ToLower().StartsWith("rmmz_core") || Path.GetFileName(fileEntry).ToLower().StartsWith("rpg_core") || Path.GetExtension(fileEntry).ToLower() == ".rgss3a")
{
Invoke((Action)delegate
{
tryAddProject(fileEntry);
});
}
}
}
catch (Exception) { };
Invoke((Action)delegate
{
onIndexingComplete();
});
});
indexProjects.Start();
}
}
private void clearProjectList()
{
globalProjectList.Clear();
projectList.Items.Clear();
selectButton.Enabled = false;
}
private void projectDir_TextChanged(object sender, EventArgs e)
{
clearProjectList();
string newDir = projectDir.Text;
updateProjectList(newDir);
}
private void browseButton_Click(object sender, EventArgs e)
{
CommonOpenFileDialog folderDialog = new CommonOpenFileDialog();
folderDialog.IsFolderPicker = true;
if (folderDialog.ShowDialog() == CommonFileDialogResult.Ok)
{
projectDir.Text = folderDialog.FileName;
}
}
private void selectButton_Click(object sender, EventArgs e)
{
int index = projectList.SelectedIndex;
if(index >= 0)
{
object proj = globalProjectList[index];
if(proj is MVProject)
{
mvProjectToolset mvToolset = new mvProjectToolset((MVProject)globalProjectList[index]);
this.Hide();
mvToolset.Show();
mvToolset.FormClosed += MvToolset_FormClosed;
}
if(proj is VXAProject)
{
vxaProjectToolset vxToolset = new vxaProjectToolset((VXAProject)globalProjectList[index]);
this.Hide();
vxToolset.Show();
vxToolset.FormClosed += VxToolset_FormClosed;
}
}
}
private void onChildFormClosed()
{
foreach (object proj in globalProjectList)
{
if (proj is VXAProject)
{
VXAProject vxproj = (VXAProject)proj;
vxproj.Close();
}
}
clearProjectList();
updateProjectList(projectDir.Text);
this.Show();
}
private void MvToolset_FormClosed(object sender, FormClosedEventArgs e)
{
onChildFormClosed();
}
private void VxToolset_FormClosed(object sender, FormClosedEventArgs e)
{
onChildFormClosed();
}
private void projectSelector_FormClosing(object sender, FormClosingEventArgs e)
{
Process.GetCurrentProcess().Kill();
}
}
}