BizHawk/BizHawk.Client.DBMan/DBMan_MainForm.cs

345 lines
13 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace BizHawk.Client.DBMan
{
public partial class DBMan_MainForm : Form
{
string[] Systems = { "SMS", "GG", "SG", "PCE", "PCECD", "SGX", "NES", "GEN" };
Rom SelectedRom;
public DBMan_MainForm()
{
InitializeComponent();
nameBox.GotFocus += (o, e) => { nameBox.SelectionLength = 0; nameBox.SelectionStart = nameBox.Text.Length; };
regionBox.GotFocus += (o, e) => { regionBox.SelectionLength = 0; regionBox.SelectionStart = versionBox.Text.Length; };
versionBox.GotFocus += (o, e) => { versionBox.SelectionLength = 0; versionBox.SelectionStart = versionBox.Text.Length; };
gameMetaBox.GotFocus += (o, e) => { gameMetaBox.SelectionLength = 0; gameMetaBox.SelectionStart = gameMetaBox.Text.Length; };
romMetaBox.GotFocus += (o, e) => { romMetaBox.SelectionLength = 0; romMetaBox.SelectionStart = romMetaBox.Text.Length; };
tagsBox.GotFocus += (o, e) => { tagsBox.SelectionLength = 0; tagsBox.SelectionStart = tagsBox.Text.Length; };
developerBox.GotFocus += (o, e) => { developerBox.SelectionLength = 0; developerBox.SelectionStart = developerBox.Text.Length; };
publisherBox.GotFocus += (o, e) => { publisherBox.SelectionLength = 0; publisherBox.SelectionStart = publisherBox.Text.Length; };
releaseDateBox.GotFocus += (o, e) => { releaseDateBox.SelectionLength = 0; releaseDateBox.SelectionStart = releaseDateBox.Text.Length; };
playersBox.GotFocus += (o, e) => { playersBox.SelectionLength = 0; playersBox.SelectionStart = playersBox.Text.Length; };
catalogBox.GotFocus += (o, e) => { catalogBox.SelectionLength = 0; catalogBox.SelectionStart = catalogBox.Text.Length; };
altNamesBox.GotFocus += (o, e) => { altNamesBox.SelectionLength = 0; altNamesBox.SelectionStart = altNamesBox.Text.Length; };
notesBox.GotFocus += (o, e) => { notesBox.SelectionLength = 0; notesBox.SelectionStart = notesBox.Text.Length; };
configSystemBox();
loadRomsForSelectedSystem();
}
void configSystemBox()
{
systemBox.Items.AddRange(Systems);
systemBox.Items.Add("Unassigned");
systemBox.SelectedIndex = 0;
gameSystemBox.Items.AddRange(Systems);
gameSystemBox.Items.Add("Unassigned");
}
void loadRomsForSelectedSystem()
{
DB.LoadDbForSystem(systemBox.SelectedItem.ToString());
var names = DB.GetDeveloperPublisherNames().ToArray();
romListView.Items.Clear();
foreach (var rom in DB.Roms)
{
var lvi = new ListViewItem(new string[] { rom.DisplayName, rom.Region, rom.VersionTags, rom.CombinedMetaData, rom.Game.Tags });
lvi.Tag = rom;
lvi.BackColor = rom.New ? Color.LightGreen : Color.White;
romListView.Items.Add(lvi);
}
detailPanel.Visible = false;
SelectedRom = null;
developerBox.AutoCompleteCustomSource.Clear();
developerBox.AutoCompleteCustomSource.AddRange(names);
publisherBox.AutoCompleteCustomSource.Clear();
publisherBox.AutoCompleteCustomSource.AddRange(names);
}
void systemBox_SelectedIndexChanged(object sender, EventArgs e)
{
loadRomsForSelectedSystem();
}
void directoryScanToolStripMenuItem_Click(object sender, EventArgs e)
{
var ds = new FolderBrowserDialog { ShowNewFolderButton = false };
var result = ds.ShowDialog();
if (result == DialogResult.OK)
{
var infos = DirectoryScan.GetRomInfos(ds.SelectedPath);
DirectoryScan.MergeRomInfosWithDatabase(infos);
MessageBox.Show("Directory Import complete!");
}
}
void selectedRomChanged(object sender, EventArgs e)
{
if (RomChangesMade())
{
var result = MessageBox.Show("Save changes?", "Save or Cancel Changes", MessageBoxButtons.YesNo);
if (result == DialogResult.Yes)
saveButton_Click(null, null);
SelectedRom = null;
}
if (romListView.SelectedItems.Count == 0)
{
detailPanel.Visible = false;
return;
}
var rom = (Rom)romListView.SelectedItems[0].Tag;
SelectedRom = rom;
gameSystemBox.Text = rom.System;
nameBox.Text = rom.Name;
crcBox.Text = rom.CRC32;
md5Box.Text = rom.MD5;
sha1Box.Text = rom.SHA1;
sizeBox.Text = rom.SizeFriendly;
regionBox.Text = rom.Region;
versionBox.Text = rom.VersionTags;
gameMetaBox.Text = rom.Game.GameMetadata;
romMetaBox.Text = rom.RomMetadata;
tagsBox.Text = rom.Game.Tags;
romStatusBox.Text = rom.RomStatus;
developerBox.Text = rom.Game.Developer;
publisherBox.Text = rom.Game.Publisher;
classificationBox.Text = rom.Game.Classification;
releaseDateBox.Text = rom.Game.ReleaseDate;
playersBox.Text = rom.Game.Players;
catalogBox.Text = rom.Catalog;
altNamesBox.Text = rom.Game.AltNames;
notesBox.Text = rom.Game.Notes;
detailPanel.Visible = true;
}
void cancelButton_Click(object sender, EventArgs e)
{
gameSystemBox.Text = SelectedRom.System;
nameBox.Text = SelectedRom.Name;
crcBox.Text = SelectedRom.CRC32;
md5Box.Text = SelectedRom.MD5;
sha1Box.Text = SelectedRom.SHA1;
sizeBox.Text = SelectedRom.SizeFriendly;
regionBox.Text = SelectedRom.Region;
versionBox.Text = SelectedRom.VersionTags;
gameMetaBox.Text = SelectedRom.Game.GameMetadata;
romMetaBox.Text = SelectedRom.RomMetadata;
tagsBox.Text = SelectedRom.Game.Tags;
romStatusBox.Text = SelectedRom.RomStatus;
developerBox.Text = SelectedRom.Game.Developer;
publisherBox.Text = SelectedRom.Game.Publisher;
classificationBox.Text = SelectedRom.Game.Classification;
releaseDateBox.Text = SelectedRom.Game.ReleaseDate;
playersBox.Text = SelectedRom.Game.Players;
catalogBox.Text = SelectedRom.Catalog;
altNamesBox.Text = SelectedRom.Game.AltNames;
notesBox.Text = SelectedRom.Game.Notes;
}
void saveButton_Click(object sender, EventArgs e)
{
// Check if any changes were made
if (SelectedRom.New == false && RomChangesMade() == false)
return;
int saveMode = 0;
string origSystem = SelectedRom.System;
string origName = SelectedRom.Name;
// Did we change System or Name?
if (KeyChangesMade())
{
var rslt = MessageBox.Show("Change all instances of this system/name?\n\nClicking Yes will change all roms to point to the new game info.\nClicking No will create a new Game instance.", "Confirm game change action", MessageBoxButtons.YesNo);
saveMode = (rslt == DialogResult.Yes) ? 1 : 2;
}
// Actually save the stuff
SelectedRom.System = fmt(gameSystemBox.Text);
SelectedRom.Name = fmt(nameBox.Text);
SelectedRom.Region = fmt(regionBox.Text);
SelectedRom.VersionTags = fmt(versionBox.Text);
SelectedRom.Game.GameMetadata = fmt(gameMetaBox.Text);
SelectedRom.RomMetadata = fmt(romMetaBox.Text);
SelectedRom.Game.Tags = fmt(tagsBox.Text);
SelectedRom.RomStatus = fmt(romStatusBox.Text);
SelectedRom.Game.Developer = fmt(developerBox.Text);
SelectedRom.Game.Publisher = fmt(publisherBox.Text);
SelectedRom.Game.Classification = fmt(classificationBox.Text);
SelectedRom.Game.ReleaseDate = fmt(releaseDateBox.Text);
SelectedRom.Game.Players = fmt(playersBox.Text);
SelectedRom.Catalog = fmt(catalogBox.Text);
SelectedRom.Game.AltNames = fmt(altNamesBox.Text);
SelectedRom.Game.Notes = fmt(notesBox.Text);
SelectedRom.Modified = DateTime.Now;
if (saveMode == 0) DB.SaveRom(SelectedRom);
if (saveMode == 1) DB.SaveRom1(SelectedRom, origSystem, origName);
if (saveMode == 2) DB.SaveRom2(SelectedRom);
if (romListView.SelectedItems.Count > 0)
{
// Update the side listing
var romListItem = (ListViewItem)romListView.SelectedItems[0];
romListItem.SubItems[0] = new ListViewItem.ListViewSubItem(romListItem, SelectedRom.DisplayName);
romListItem.SubItems[1] = new ListViewItem.ListViewSubItem(romListItem, SelectedRom.Region);
romListItem.SubItems[2] = new ListViewItem.ListViewSubItem(romListItem, SelectedRom.VersionTags);
romListItem.SubItems[3] = new ListViewItem.ListViewSubItem(romListItem, SelectedRom.CombinedMetaData);
romListItem.SubItems[4] = new ListViewItem.ListViewSubItem(romListItem, SelectedRom.Game.Tags);
romListItem.BackColor = SelectedRom.New ? Color.LightGreen : Color.White;
}
if (saveMode > 0) loadRomsForSelectedSystem();
}
bool RomChangesMade()
{
if (SelectedRom == null)
return false;
if (!streq(SelectedRom.System, gameSystemBox.Text)) return true;
if (!streq(SelectedRom.Name, nameBox.Text)) return true;
if (!streq(SelectedRom.Region, regionBox.Text)) return true;
if (!streq(SelectedRom.VersionTags, versionBox.Text)) return true;
if (!streq(SelectedRom.Game.GameMetadata, gameMetaBox.Text)) return true;
if (!streq(SelectedRom.RomMetadata, romMetaBox.Text)) return true;
if (!streq(SelectedRom.Game.Tags, tagsBox.Text)) return true;
if (!streq(SelectedRom.RomStatus, romStatusBox.Text)) return true;
if (!streq(SelectedRom.Game.Developer, developerBox.Text)) return true;
if (!streq(SelectedRom.Game.Publisher, publisherBox.Text)) return true;
if (!streq(SelectedRom.Game.Classification, classificationBox.Text)) return true;
if (!streq(SelectedRom.Game.ReleaseDate, releaseDateBox.Text)) return true;
if (!streq(SelectedRom.Game.Players, playersBox.Text)) return true;
if (!streq(SelectedRom.Catalog, catalogBox.Text)) return true;
if (!streq(SelectedRom.Game.AltNames, altNamesBox.Text)) return true;
if (!streq(SelectedRom.Game.Notes, notesBox.Text)) return true;
return false;
}
bool KeyChangesMade()
{
if (SelectedRom == null)
return false;
if (!streq(SelectedRom.System, gameSystemBox.Text)) return true;
if (!streq(SelectedRom.Name, nameBox.Text)) return true;
return false;
}
static bool streq(string s1, string s2)
{
if (string.IsNullOrWhiteSpace(s1) && string.IsNullOrWhiteSpace(s2)) return true;
if (s1 == null || s2 == null) return false;
return s1.Trim() == s2.Trim();
}
static string fmt(string s)
{
var trimmed = s.Trim();
if (trimmed.Length == 0)
return null;
return trimmed;
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.F5))
{
loadRomsForSelectedSystem();
return true;
}
if (keyData == (Keys.S | Keys.Control) && SelectedRom != null)
{
saveButton_Click(null, null);
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
void cleanupDBToolStripMenuItem_Click(object sender, EventArgs e)
{
DB.Cleanup();
MessageBox.Show("Orphaned GAME records deleted and Sqlite VACUUM performed.");
}
void exportGameDBToolStripMenuItem_Click(object sender, EventArgs e)
{
var sfd = new SaveFileDialog();
sfd.DefaultExt = ".txt";
sfd.AddExtension = true;
var result = sfd.ShowDialog();
if (result == System.Windows.Forms.DialogResult.Cancel)
return;
var tw = new StreamWriter(sfd.FileName);
loadRomsForSelectedSystem();
foreach (var rom in DB.Roms)
{
string romCode = "";
if (rom.Game.Classification == "Homebrew") romCode = "D";
if (rom.RomStatus == "Overdump") romCode = "O";
if (rom.RomStatus == "Bad Dump") romCode = "V";
string regionStr = "";
if (rom.Region != null)
{
if (rom.Region.IndexOf("Japan") >= 0) regionStr += "J";
if (rom.Region.IndexOf("USA") >= 0) regionStr += "U";
if (rom.Region.IndexOf("Europe") >= 0) regionStr += "E";
if (rom.Region.IndexOf("Brazil") >= 0) regionStr += "B";
if (rom.Region.IndexOf("Taiwan") >= 0) regionStr += "T";
if (rom.Region.IndexOf("Korea") >= 0) regionStr += "K";
if (rom.Region.IndexOf("Australia") >= 0) regionStr += "Aus";
if (rom.Region.IndexOf("World") >= 0) regionStr += "W";
}
string romName = rom.NameWithTheFlipped;
if (regionStr.Length > 0)
romName += " ("+regionStr+")";
if (rom.VersionTags != null)
{
var versions = rom.VersionTags.Split(';');
foreach (var version in versions)
{
if (version.Trim().Length == 0)
continue;
romName += " (" + version + ")";
}
}
tw.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}", rom.MD5, romCode, romName, rom.System, rom.Game.Tags, rom.CombinedMetaData, rom.Region);
}
tw.Close();
}
void deleteButton_Click(object sender, EventArgs e)
{
var rslt = MessageBox.Show("Confirm deletion for ROM: "+SelectedRom.Name+" "+SelectedRom.Region+" "+SelectedRom.VersionTags+"?", "Confirm ROM Delete", MessageBoxButtons.YesNo);
if (rslt != System.Windows.Forms.DialogResult.Yes)
return;
DB.DeleteRom(SelectedRom);
loadRomsForSelectedSystem();
}
}
}