--- branches/uienhancements/EmuXPortal/Form1.cs 2012/04/08 13:03:46 53 +++ branches/uienhancements/EmuXPortal/Form1.cs 2012/04/08 13:25:33 54 @@ -9,6 +9,9 @@ using System.Windows.Forms; using EmuXPortal.Api; using EmuXPortal.Logging; using System.Diagnostics; +using System.Reflection; +using System.Threading; +using Utilities.TransparentControls; namespace EmuXPortal { @@ -103,24 +106,7 @@ namespace EmuXPortal platform_flow.BringToFront(); Stopwatch t = new Stopwatch(); t.Start(); - PlatformParser parser = new PlatformParser(Config.RomPath); - 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); - platform_flow.Controls.Add(platform_ctrl); - - } - 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); + platformWorker.RunWorkerAsync(t); } private void rom_flow_VisibleChanged(object sender, EventArgs e) @@ -130,25 +116,7 @@ namespace EmuXPortal rom_flow.BringToFront(); Stopwatch t = new Stopwatch(); t.Start(); - RomParser parser = new RomParser(CurrentSelectedRom); - 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); - rom_flow.Controls.Add(game_ctrl); - rom_flow.Update(); - } - 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); + gameWorker.RunWorkerAsync(t); } void game_ctrl_LostFocus(object sender, EventArgs e) @@ -217,6 +185,153 @@ namespace EmuXPortal 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 } } |