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; using EmuXPortal.Api; using EmuXPortal.Logging; using System.Diagnostics; using System.Reflection; using System.Threading; using Utilities.TransparentControls; namespace EmuXPortal { public partial class Form1 : Form { IEmuConfig CurrentSelectedRom = null; PlatformControl CurrentPlatformControl = null; GameControl CurrentGameControl = null; public Form1() { InitializeComponent(); platform_flow.Dock = DockStyle.Fill; rom_flow.Dock = DockStyle.Fill; } private void Form1_Load(object sender, EventArgs e) { Config.LoadConfig(); Config.InitializePresentationForm(this); } private void Form1_Shown(object sender, EventArgs e) { platform_flow.Visible = true; } void platform_ctrl_LostFocus(object sender, EventArgs e) { PlatformControl c = sender as PlatformControl; c.BorderStyle = BorderStyle.None; } void platform_ctrl_GotFocus(object sender, EventArgs e) { PlatformControl c = sender as PlatformControl; c.BorderStyle = BorderStyle.FixedSingle; CurrentPlatformControl = c; } void platform_ctrl_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { PlatformControl c = sender as PlatformControl; if (e.KeyCode == Keys.Enter) { // load this platform platform_flow.Visible = false; CurrentSelectedRom = c.Tag as IEmuConfig; rom_flow.Visible = true; rom_flow.BringToFront(); } if (e.KeyCode == Keys.Back) { this.Close(); } if ((e.KeyCode >= Keys.A && e.KeyCode <= Keys.Z) || (e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9)) { char t = (char)e.KeyCode; PlatformControl ctrl = (platform_flow.GetNextControl(CurrentPlatformControl, true) as PlatformControl); if (ctrl == null) { ctrl = (platform_flow.GetNextControl(platform_flow.Controls[0], true) as PlatformControl); } bool found = false; PlatformControl pc = CurrentPlatformControl; bool wrapped = false; bool not_found = true; while (!found) { if (wrapped) { foreach (Control ctl in platform_flow.Controls) { PlatformControl p_ctl = ctl as PlatformControl; if (p_ctl.PlatformName.ToLower().StartsWith(t.ToString().ToLower())) { not_found = false; } } if (not_found) { found = true; } } ctrl = (platform_flow.GetNextControl(pc, true) as PlatformControl); if (ctrl == null) { ctrl = platform_flow.Controls[0] as PlatformControl; wrapped = true; } if (ctrl.PlatformName.ToLower().StartsWith(t.ToString().ToLower())) { platform_flow.ScrollControlIntoView(ctrl); ctrl.Select(); found = true; } pc = ctrl; } } } private void platform_flow_VisibleChanged(object sender, EventArgs e) { if (!platform_flow.Visible) return; platform_flow.Controls.Clear(); platform_flow.BringToFront(); Stopwatch t = new Stopwatch(); t.Start(); platformWorker.RunWorkerAsync(t); } private void rom_flow_VisibleChanged(object sender, EventArgs e) { if (!rom_flow.Visible) return; rom_flow.Controls.Clear(); rom_flow.BringToFront(); Stopwatch t = new Stopwatch(); t.Start(); gameWorker.RunWorkerAsync(t); } void game_ctrl_LostFocus(object sender, EventArgs e) { GameControl c = sender as GameControl; c.BorderStyle = BorderStyle.None; } void game_ctrl_GotFocus(object sender, EventArgs e) { GameControl c = sender as GameControl; c.BorderStyle = BorderStyle.FixedSingle; CurrentGameControl = c; } void game_ctrl_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { GameControl c = sender as GameControl; if (e.KeyCode == Keys.Enter) { IRomConfig config = c.Tag as IRomConfig; Process p = new Process(); p.StartInfo.FileName = config.Config.EmuPath; p.StartInfo.Arguments = EmuConfigLoader.GetEMUOptions(config); p.Start(); } if (e.KeyCode == Keys.Back) { rom_flow.Visible = false; platform_flow.Visible = true; } if ( (e.KeyCode >= Keys.A && e.KeyCode <= Keys.Z) || (e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9)) { char t = (char)e.KeyCode; GameControl ctrl = (rom_flow.GetNextControl(CurrentPlatformControl, true) as GameControl); if (ctrl == null) { ctrl = (rom_flow.GetNextControl(rom_flow.Controls[0], true) as GameControl); } bool found = false; GameControl pc = CurrentGameControl; bool wrapped = false; bool not_found = true; while (!found) { if (wrapped) { foreach (Control ctl in rom_flow.Controls) { GameControl p_ctl = ctl as GameControl; if (p_ctl.GameName.ToLower().StartsWith(t.ToString().ToLower())) { not_found = false; } } if (not_found) { found = true; } } ctrl = (rom_flow.GetNextControl(pc, true) as GameControl); if (ctrl == null) { ctrl = rom_flow.Controls[0] as GameControl; wrapped = true; } if (ctrl.GameName.ToLower().StartsWith(t.ToString().ToLower())) { rom_flow.ScrollControlIntoView(ctrl); ctrl.Select(); found = true; } pc = ctrl; } } } #region Background Workers private int GetFormWidth() { if (this.InvokeRequired) { return Convert.ToInt32(this.Invoke((MethodInvoker)delegate() { GetFormWidth(); })); } else { return this.Width; } } private void AddPlatformControl(Control c) { if (platform_flow.InvokeRequired) { platform_flow.Invoke((MethodInvoker)delegate() { AddPlatformControl(c); }); } else { platform_flow.Controls.Add(c); } } private void UpdatePlatformControls() { if (platform_flow.InvokeRequired) { platform_flow.Invoke((MethodInvoker)delegate() { UpdatePlatformControls(); }); } else { this.Refresh(); this.Update(); } } private void AddGameControl(Control c) { if (rom_flow.InvokeRequired) { rom_flow.Invoke((MethodInvoker)delegate() { AddGameControl(c); }); } else { rom_flow.Controls.Add(c); } } private void UpdateGameControls() { if (rom_flow.InvokeRequired) { rom_flow.Invoke((MethodInvoker)delegate() { UpdateGameControls(); }); } else { this.Refresh(); this.Update(); } } #region gameWorker private void gameWorker_DoWork(object sender, DoWorkEventArgs e) { Stopwatch t = e.Argument as Stopwatch; RomParser parser = new RomParser(CurrentSelectedRom); ProgressBarWithPercentageLabel bar = new ProgressBarWithPercentageLabel(); AddGameControl(bar); UpdateGameControls(); Application.DoEvents(); Thread.Sleep(10); bar.Invoke(new MethodInvoker(delegate { bar.Message = "Please Wait..."; bar.ShowPercentageLabel = true; bar.Margin = new System.Windows.Forms.Padding(0); bar.Size = new Size(GetFormWidth() - 25, 100); })); double count = 0; double total_count = parser.Roms.Count; foreach (IRomConfig config in parser.Roms) { GameControl game_ctrl = new GameControl(); game_ctrl.Dock = DockStyle.Top; game_ctrl.Width = this.Width - 10; game_ctrl.Tag = config; game_ctrl.GameImage = config.RomImage; game_ctrl.GameName = config.RomTitle; game_ctrl.PreviewKeyDown += new PreviewKeyDownEventHandler(game_ctrl_PreviewKeyDown); game_ctrl.GotFocus += new EventHandler(game_ctrl_GotFocus); game_ctrl.LostFocus += new EventHandler(game_ctrl_LostFocus); AddGameControl(game_ctrl); UpdateGameControls(); Application.DoEvents(); int percent = (int)(100.0 * (count / total_count)); logger.WriteLine("gameWorker_DoWork(): count={0} total={1} percent={2}",count,total_count,percent); bar.Invoke(new MethodInvoker(delegate { bar.Value = percent; })); count++; } e.Result = t; } private void gameWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { } private void gameWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { Stopwatch t = e.Result as Stopwatch; rom_flow.Controls.RemoveAt(0); rom_flow.Controls[0].Select(); (rom_flow.Controls[0] as GameControl).BorderStyle = BorderStyle.FixedSingle; t.Stop(); logger.WriteLine("RomParser took: {0}s to parse roms", (int)t.Elapsed.TotalSeconds); } #endregion #region platformWorker private void platformWorker_DoWork(object sender, DoWorkEventArgs e) { Stopwatch t = e.Argument as Stopwatch; PlatformParser parser = new PlatformParser(Config.RomPath); double count = 0; double total_count = parser.Platforms.Count; ProgressBarWithPercentageLabel bar = new ProgressBarWithPercentageLabel(); AddPlatformControl(bar); UpdatePlatformControls(); Application.DoEvents(); Thread.Sleep(10); bar.Invoke(new MethodInvoker(delegate { bar.Margin = new System.Windows.Forms.Padding(0); bar.Size = new Size(GetFormWidth() - 25, 100); })); foreach (IEmuConfig config in parser.Platforms) { PlatformControl platform_ctrl = new PlatformControl(); platform_ctrl.Dock = DockStyle.Top; platform_ctrl.Width = this.Width - 10; platform_ctrl.Tag = config; platform_ctrl.PlatformImage = config.PlatformImage; platform_ctrl.PlatformName = config.ToString(); platform_ctrl.PreviewKeyDown += new PreviewKeyDownEventHandler(platform_ctrl_PreviewKeyDown); platform_ctrl.GotFocus += new EventHandler(platform_ctrl_GotFocus); platform_ctrl.LostFocus += new EventHandler(platform_ctrl_LostFocus); AddPlatformControl(platform_ctrl); Application.DoEvents(); int percent = (int)(100.0 * (count / total_count)); logger.WriteLine("platformWorker_DoWork(): count={0} total={1} percent={2}", count, total_count, percent); bar.Invoke(new MethodInvoker(delegate { bar.Value = percent; })); count++; } e.Result = t; } private void platformWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { } private void platformWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { Stopwatch t = e.Result as Stopwatch; platform_flow.Controls.RemoveAt(0); platform_flow.Controls[0].Select(); (platform_flow.Controls[0] as PlatformControl).BorderStyle = BorderStyle.FixedSingle; logger.WriteLine("PlatformParser took: {0}s to parse platforms", (int)t.Elapsed.TotalSeconds); } #endregion #endregion } }