345 lines
13 KiB
C#
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();
|
|
}
|
|
}
|
|
} |