ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/EmuXPortal/branches/uienhancements/EmuXPortal/Form1.cs
(Generate patch)

Comparing branches/uienhancements/EmuXPortal/Form1.cs (file contents):
Revision 53 by william, Sun Apr 8 10:31:12 2012 UTC vs.
Revision 54 by william, Sun Apr 8 13:25:33 2012 UTC

--- 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
     }
 }