From d64e81c86657845392fe02b8738d48f5ce32e27a Mon Sep 17 00:00:00 2001 From: N00MKRAD Date: Thu, 29 Apr 2021 22:57:00 +0200 Subject: [PATCH] Added pausing/resuming for interpolation, async (background) web checks --- Code/{ => Extensions}/ExtensionMethods.cs | 0 Code/Extensions/ProcessExtensions.cs | 61 +++++++++++ Code/Flowframes.csproj | 7 +- Code/Form1.Designer.cs | 87 +++++++++++---- Code/Form1.cs | 36 +++++-- Code/IO/IOUtils.cs | 2 +- Code/OS/AiProcess.cs | 12 +-- Code/OS/AiProcessSuspend.cs | 102 ++++++++++++++++++ Code/OS/OSUtils.cs | 16 ++- Code/Properties/Resources.Designer.cs | 30 ++++++ Code/Properties/Resources.resx | 25 +++-- Code/Resources/baseline_pause_white_48dp.png | Bin 0 -> 94 bytes .../baseline_play_arrow_white_48dp.png | Bin 0 -> 322 bytes Code/Resources/baseline_stop_white_48dp.png | Bin 0 -> 95 bytes Media/baseline_pause_white_48dp.png | Bin 0 -> 94 bytes Media/baseline_play_arrow_white_48dp.png | Bin 0 -> 322 bytes Media/baseline_stop_white_48dp.png | Bin 0 -> 95 bytes 17 files changed, 332 insertions(+), 46 deletions(-) rename Code/{ => Extensions}/ExtensionMethods.cs (100%) create mode 100644 Code/Extensions/ProcessExtensions.cs create mode 100644 Code/OS/AiProcessSuspend.cs create mode 100644 Code/Resources/baseline_pause_white_48dp.png create mode 100644 Code/Resources/baseline_play_arrow_white_48dp.png create mode 100644 Code/Resources/baseline_stop_white_48dp.png create mode 100644 Media/baseline_pause_white_48dp.png create mode 100644 Media/baseline_play_arrow_white_48dp.png create mode 100644 Media/baseline_stop_white_48dp.png diff --git a/Code/ExtensionMethods.cs b/Code/Extensions/ExtensionMethods.cs similarity index 100% rename from Code/ExtensionMethods.cs rename to Code/Extensions/ExtensionMethods.cs diff --git a/Code/Extensions/ProcessExtensions.cs b/Code/Extensions/ProcessExtensions.cs new file mode 100644 index 0000000..d7676c9 --- /dev/null +++ b/Code/Extensions/ProcessExtensions.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using Win32Interop; + +namespace Flowframes.Extensions +{ + public static class ProcessExtensions + { + [Flags] + public enum ThreadAccess : int + { + TERMINATE = (0x0001), + SUSPEND_RESUME = (0x0002), + GET_CONTEXT = (0x0008), + SET_CONTEXT = (0x0010), + SET_INFORMATION = (0x0020), + QUERY_INFORMATION = (0x0040), + SET_THREAD_TOKEN = (0x0080), + IMPERSONATE = (0x0100), + DIRECT_IMPERSONATION = (0x0200) + } + + [DllImport("kernel32.dll")] + static extern IntPtr OpenThread(ThreadAccess dwDesiredAccess, bool bInheritHandle, uint dwThreadId); + [DllImport("kernel32.dll")] + static extern uint SuspendThread(IntPtr hThread); + [DllImport("kernel32.dll")] + static extern int ResumeThread(IntPtr hThread); + + public static void Suspend(this Process process) + { + foreach (ProcessThread thread in process.Threads) + { + var pOpenThread = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)thread.Id); + + if (pOpenThread == IntPtr.Zero) + break; + + SuspendThread(pOpenThread); + } + } + + public static void Resume(this Process process) + { + foreach (ProcessThread thread in process.Threads) + { + var pOpenThread = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)thread.Id); + + if (pOpenThread == IntPtr.Zero) + break; + + ResumeThread(pOpenThread); + } + } + } +} diff --git a/Code/Flowframes.csproj b/Code/Flowframes.csproj index 3038046..bcdafc8 100644 --- a/Code/Flowframes.csproj +++ b/Code/Flowframes.csproj @@ -329,6 +329,7 @@ + Form @@ -377,7 +378,7 @@ - + Form @@ -392,6 +393,7 @@ + @@ -461,6 +463,9 @@ + + + diff --git a/Code/Form1.Designer.cs b/Code/Form1.Designer.cs index 1c9fd0b..9fffd49 100644 --- a/Code/Form1.Designer.cs +++ b/Code/Form1.Designer.cs @@ -78,7 +78,6 @@ this.panel14 = new System.Windows.Forms.Panel(); this.panel3 = new System.Windows.Forms.Panel(); this.longProgBar = new HTAlt.WinForms.HTProgressBar(); - this.cancelBtn = new System.Windows.Forms.Button(); this.mainTabControl = new HTAlt.WinForms.HTTabControl(); this.welcomeTab = new System.Windows.Forms.TabPage(); this.welcomeLabel2 = new System.Windows.Forms.Label(); @@ -125,6 +124,10 @@ this.htButton1 = new HTAlt.WinForms.HTButton(); this.runStepBtn = new System.Windows.Forms.Button(); this.stepSelector = new System.Windows.Forms.ComboBox(); + this.busyControlsPanel = new System.Windows.Forms.Panel(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.cancelBtn = new System.Windows.Forms.Button(); + this.pauseBtn = new System.Windows.Forms.Button(); this.panel1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); @@ -145,6 +148,8 @@ this.previewTab.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.previewPicturebox)).BeginInit(); this.abtTab.SuspendLayout(); + this.busyControlsPanel.SuspendLayout(); + this.tableLayoutPanel1.SuspendLayout(); this.SuspendLayout(); // // titleLabel @@ -734,21 +739,6 @@ this.longProgBar.Size = new System.Drawing.Size(700, 15); this.longProgBar.TabIndex = 33; // - // cancelBtn - // - this.cancelBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.cancelBtn.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48))))); - this.cancelBtn.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.cancelBtn.ForeColor = System.Drawing.Color.LightCoral; - this.cancelBtn.Location = new System.Drawing.Point(12, 418); - this.cancelBtn.Name = "cancelBtn"; - this.cancelBtn.Size = new System.Drawing.Size(203, 71); - this.cancelBtn.TabIndex = 34; - this.cancelBtn.Text = "Cancel"; - this.cancelBtn.UseVisualStyleBackColor = false; - this.cancelBtn.Visible = false; - this.cancelBtn.Click += new System.EventHandler(this.cancelBtn_Click); - // // mainTabControl // this.mainTabControl.AllowDrop = true; @@ -1447,6 +1437,62 @@ this.stepSelector.Size = new System.Drawing.Size(203, 24); this.stepSelector.TabIndex = 73; // + // busyControlsPanel + // + this.busyControlsPanel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48))))); + this.busyControlsPanel.Controls.Add(this.tableLayoutPanel1); + this.busyControlsPanel.Location = new System.Drawing.Point(12, 418); + this.busyControlsPanel.Name = "busyControlsPanel"; + this.busyControlsPanel.Size = new System.Drawing.Size(203, 71); + this.busyControlsPanel.TabIndex = 74; + this.busyControlsPanel.Visible = false; + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 2; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 49F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 51F)); + this.tableLayoutPanel1.Controls.Add(this.pauseBtn, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.cancelBtn, 0, 0); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 1; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(203, 71); + this.tableLayoutPanel1.TabIndex = 0; + // + // cancelBtn + // + this.cancelBtn.Anchor = System.Windows.Forms.AnchorStyles.None; + this.cancelBtn.BackgroundImage = global::Flowframes.Properties.Resources.baseline_stop_white_48dp; + this.cancelBtn.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.cancelBtn.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Firebrick; + this.cancelBtn.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.cancelBtn.ForeColor = System.Drawing.Color.Firebrick; + this.cancelBtn.Location = new System.Drawing.Point(24, 10); + this.cancelBtn.Name = "cancelBtn"; + this.cancelBtn.Size = new System.Drawing.Size(50, 50); + this.cancelBtn.TabIndex = 0; + this.cancelBtn.UseVisualStyleBackColor = true; + this.cancelBtn.Click += new System.EventHandler(this.cancelBtn_Click); + // + // pauseBtn + // + this.pauseBtn.Anchor = System.Windows.Forms.AnchorStyles.None; + this.pauseBtn.BackgroundImage = global::Flowframes.Properties.Resources.baseline_pause_white_48dp; + this.pauseBtn.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.pauseBtn.FlatAppearance.MouseOverBackColor = System.Drawing.Color.DarkOrange; + this.pauseBtn.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.pauseBtn.ForeColor = System.Drawing.Color.DarkOrange; + this.pauseBtn.Location = new System.Drawing.Point(126, 10); + this.pauseBtn.Name = "pauseBtn"; + this.pauseBtn.Size = new System.Drawing.Size(50, 50); + this.pauseBtn.TabIndex = 1; + this.pauseBtn.UseVisualStyleBackColor = true; + this.pauseBtn.Visible = false; + this.pauseBtn.Click += new System.EventHandler(this.pauseBtn_Click); + // // Form1 // this.AllowDrop = true; @@ -1454,7 +1500,7 @@ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32))))); this.ClientSize = new System.Drawing.Size(934, 501); - this.Controls.Add(this.cancelBtn); + this.Controls.Add(this.busyControlsPanel); this.Controls.Add(this.runBtn); this.Controls.Add(this.stepSelector); this.Controls.Add(this.runStepBtn); @@ -1510,6 +1556,8 @@ this.previewTab.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.previewPicturebox)).EndInit(); this.abtTab.ResumeLayout(false); + this.busyControlsPanel.ResumeLayout(false); + this.tableLayoutPanel1.ResumeLayout(false); this.ResumeLayout(false); this.PerformLayout(); @@ -1556,7 +1604,6 @@ private System.Windows.Forms.PictureBox pictureBox3; private System.Windows.Forms.Label label23; private HTAlt.WinForms.HTProgressBar longProgBar; - private System.Windows.Forms.Button cancelBtn; private HTAlt.WinForms.HTButton discordBtn; private HTAlt.WinForms.HTButton paypalBtn; private HTAlt.WinForms.HTButton patreonBtn; @@ -1612,6 +1659,10 @@ private System.Windows.Forms.ComboBox mpdecimateMode; private System.Windows.Forms.LinkLabel linkLabel1; private HTAlt.WinForms.HTButton scnDetectTestBtn; + private System.Windows.Forms.Panel busyControlsPanel; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.Button pauseBtn; + private System.Windows.Forms.Button cancelBtn; } } diff --git a/Code/Form1.cs b/Code/Form1.cs index c8430d6..5231e52 100644 --- a/Code/Form1.cs +++ b/Code/Form1.cs @@ -68,13 +68,14 @@ namespace Flowframes { try { - await Task.Delay(100); - await StartupChecks.SymlinksCheck(); - await Updater.UpdateModelList(); // Update AI model list - await Updater.AsyncUpdateCheck(); // Check for Flowframes updates - await GetWebInfo.LoadNews(newsLabel); // Loads news/MOTD - await GetWebInfo.LoadPatronListCsv(patronsLabel); // Load patron list + //await Task.Delay(100); + Task.Run(() => Updater.UpdateModelList()); + Task.Run(() => Updater.AsyncUpdateCheck()); + Task.Run(() => GetWebInfo.LoadNews(newsLabel)); + Task.Run(() => GetWebInfo.LoadPatronListCsv(patronsLabel)); await Python.CheckCompression(); + await StartupChecks.SymlinksCheck(); + } catch (Exception e) { @@ -106,6 +107,7 @@ namespace Flowframes public HTTabControl GetMainTabControl() { return mainTabControl; } public TextBox GetInputFpsTextbox () { return fpsInTbox; } + public Button GetPauseBtn() { return pauseBtn; } public bool IsInFocus() { return (ActiveForm == this); } @@ -223,6 +225,7 @@ namespace Flowframes if (!BatchProcessing.busy) // Don't load values from gui if batch processing is used Interpolate.current = GetCurrentSettings(); + AiProcessSuspend.Reset(); Interpolate.Start(); } @@ -324,12 +327,15 @@ namespace Flowframes Control[] controlsToDisable = new Control[] { runBtn, runStepBtn, stepSelector, settingsBtn }; Control[] controlsToHide = new Control[] { runBtn, runStepBtn, stepSelector }; progressCircle.Visible = state; - cancelBtn.Visible = state; + busyControlsPanel.Visible = state; + foreach (Control c in controlsToDisable) c.Enabled = !state; + foreach (Control c in controlsToHide) c.Visible = !state; - cancelBtn.Enabled = allowCancel; + + busyControlsPanel.Enabled = allowCancel; Program.busy = state; Program.mainForm.UpdateStepByStepControls(); } @@ -399,8 +405,13 @@ namespace Flowframes private void cancelBtn_Click(object sender, EventArgs e) { - SetTab("interpolation"); - Interpolate.Cancel(); + DialogResult dialog = MessageBox.Show($"Are you sure you want to cancel the interpolation?", "Are you sure?", MessageBoxButtons.YesNo); + + if (dialog == DialogResult.Yes) + { + SetTab("interpolation"); + Interpolate.Cancel(); + } } private void discordBtn_Click(object sender, EventArgs e) @@ -550,5 +561,10 @@ namespace Flowframes { Magick.SceneDetect.RunSceneDetection(inputTbox.Text.Trim()); } + + private void pauseBtn_Click(object sender, EventArgs e) + { + AiProcessSuspend.SuspendResumeAi(!AiProcessSuspend.aiProcFrozen); + } } } \ No newline at end of file diff --git a/Code/IO/IOUtils.cs b/Code/IO/IOUtils.cs index ae85a7b..4f26ab5 100644 --- a/Code/IO/IOUtils.cs +++ b/Code/IO/IOUtils.cs @@ -747,7 +747,7 @@ namespace Flowframes.IO } catch (Exception e) { - Logger.Log($"OverwriteWithText failed for '{path}': {e.Message}"); + Logger.Log($"OverwriteWithText failed for '{path}': {e.Message}", true); } } diff --git a/Code/OS/AiProcess.cs b/Code/OS/AiProcess.cs index 385eae1..0395244 100644 --- a/Code/OS/AiProcess.cs +++ b/Code/OS/AiProcess.cs @@ -1,20 +1,15 @@ using Flowframes.IO; using System; -using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; -using System.Runtime.InteropServices; -using System.Text; using System.Threading.Tasks; using Flowframes.OS; using Flowframes.UI; using Flowframes.Main; using Flowframes.Data; using Flowframes.MiscUtils; -using Flowframes.Magick; using Flowframes.Media; -using System.Drawing; namespace Flowframes { @@ -35,6 +30,7 @@ namespace Flowframes try { + AiProcessSuspend.SetRunning(false); OSUtils.KillProcessTree(lastAiProcess.Id); } catch (Exception e) @@ -48,13 +44,14 @@ namespace Flowframes lastStartupTimeMs = startupTimeMs; processTime.Restart(); lastAiProcess = proc; + AiProcessSuspend.SetRunning(true); lastInPath = string.IsNullOrWhiteSpace(inPath) ? Interpolate.current.framesFolder : inPath; hasShownError = false; } static void SetProgressCheck(string interpPath, float factor) { - int frames = IOUtils.GetAmountOfFiles(lastInPath, false, "*.*"); + int frames = IOUtils.GetAmountOfFiles(lastInPath, false); int target = ((frames * factor) - (factor - 1)).RoundToInt(); InterpolationProgress.progressPaused = false; InterpolationProgress.currentFactor = factor; @@ -69,6 +66,7 @@ namespace Flowframes { if (Interpolate.canceled) return; Program.mainForm.SetProgress(100); + AiProcessSuspend.SetRunning(false); InterpolationProgress.UpdateInterpProgress(IOUtils.GetAmountOfFiles(Interpolate.current.interpFolder, false, "*" + Interpolate.current.interpExt), InterpolationProgress.targetFrames); string logStr = $"Done running {aiName} - Interpolation took {FormatUtils.Time(processTime.Elapsed)}. Peak Output FPS: {InterpolationProgress.peakFpsOut.ToString("0.00")}"; @@ -164,7 +162,7 @@ namespace Flowframes } rifePy.Start(); - + if (!OSUtils.ShowHiddenCmd()) { rifePy.BeginOutputReadLine(); diff --git a/Code/OS/AiProcessSuspend.cs b/Code/OS/AiProcessSuspend.cs new file mode 100644 index 0000000..d62e14e --- /dev/null +++ b/Code/OS/AiProcessSuspend.cs @@ -0,0 +1,102 @@ +using Flowframes.Extensions; +using Flowframes.Properties; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; + +namespace Flowframes.OS +{ + class AiProcessSuspend + { + public static bool aiProcFrozen; + static List suspendedProcesses = new List(); + public static bool isRunning; + + public static void Reset() + { + SetRunning(false); + SetPauseButtonStyle(false); + } + + public static void SetRunning (bool running) + { + isRunning = running; + Program.mainForm.GetPauseBtn().Visible = running; + } + + public static void SuspendResumeAi(bool freeze, bool excludeCmd = true) + { + if (AiProcess.lastAiProcess == null || AiProcess.lastAiProcess.HasExited) + return; + + Process currProcess = AiProcess.lastAiProcess; + Logger.Log($"{(freeze ? "Suspending" : "Resuming")} main process ({currProcess.StartInfo.FileName} {currProcess.StartInfo.Arguments})", true); + + if (freeze) + { + List procs = new List(); + procs.Add(currProcess); + + foreach (var subProc in OSUtils.GetChildProcesses(currProcess)) + procs.Add(subProc); + + aiProcFrozen = true; + SetPauseButtonStyle(true); + AiProcess.processTime.Stop(); + + foreach (Process process in procs) + { + if (process == null || process.HasExited) + continue; + + if (excludeCmd && (process.ProcessName == "conhost" || process.ProcessName == "cmd")) + continue; + + Logger.Log($"Suspending {process.ProcessName}", true); + + process.Suspend(); + suspendedProcesses.Add(process); + } + } + else + { + aiProcFrozen = false; + SetPauseButtonStyle(false); + AiProcess.processTime.Start(); + + foreach (Process process in new List(suspendedProcesses)) // We MUST clone the list here since we modify it in the loop! + { + if (process == null || process.HasExited) + continue; + + Logger.Log($"Resuming {process.ProcessName}", true); + + process.Resume(); + suspendedProcesses.Remove(process); + } + } + } + + public static void SetPauseButtonStyle (bool paused) + { + System.Windows.Forms.Button btn = Program.mainForm.GetPauseBtn(); + + if (paused) + { + btn.BackgroundImage = Resources.baseline_play_arrow_white_48dp; + btn.FlatAppearance.BorderColor = System.Drawing.Color.MediumSeaGreen; + btn.FlatAppearance.MouseOverBackColor = System.Drawing.Color.MediumSeaGreen; + } + else + { + btn.BackgroundImage = Resources.baseline_pause_white_48dp; + btn.FlatAppearance.BorderColor= System.Drawing.Color.DarkOrange; + btn.FlatAppearance.MouseOverBackColor = System.Drawing.Color.DarkOrange; + } + } + + + } +} diff --git a/Code/OS/OSUtils.cs b/Code/OS/OSUtils.cs index f24cd17..1fbb8de 100644 --- a/Code/OS/OSUtils.cs +++ b/Code/OS/OSUtils.cs @@ -11,6 +11,7 @@ using Flowframes.IO; using DiskDetector; using DiskDetector.Models; using Microsoft.VisualBasic.Devices; +using Flowframes.Extensions; namespace Flowframes.OS { @@ -124,7 +125,7 @@ namespace Flowframes.OS return (Encoding.UTF8.GetByteCount(str) != str.Length); } - public static int GetFreeRamMb () + public static int GetFreeRamMb() { try { @@ -155,5 +156,18 @@ namespace Flowframes.OS return info; } + + public static IEnumerable GetChildProcesses(Process process) + { + List children = new List(); + ManagementObjectSearcher mos = new ManagementObjectSearcher(String.Format("Select * From Win32_Process Where ParentProcessID={0}", process.Id)); + + foreach (ManagementObject mo in mos.Get()) + { + children.Add(Process.GetProcessById(Convert.ToInt32(mo["ProcessID"]))); + } + + return children; + } } } \ No newline at end of file diff --git a/Code/Properties/Resources.Designer.cs b/Code/Properties/Resources.Designer.cs index c5f1218..3bbd5d2 100644 --- a/Code/Properties/Resources.Designer.cs +++ b/Code/Properties/Resources.Designer.cs @@ -120,6 +120,26 @@ namespace Flowframes.Properties { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap baseline_pause_white_48dp { + get { + object obj = ResourceManager.GetObject("baseline_pause_white_48dp", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap baseline_play_arrow_white_48dp { + get { + object obj = ResourceManager.GetObject("baseline_play_arrow_white_48dp", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -140,6 +160,16 @@ namespace Flowframes.Properties { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap baseline_stop_white_48dp { + get { + object obj = ResourceManager.GetObject("baseline_stop_white_48dp", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/Code/Properties/Resources.resx b/Code/Properties/Resources.resx index 89e9621..416aca2 100644 --- a/Code/Properties/Resources.resx +++ b/Code/Properties/Resources.resx @@ -133,12 +133,12 @@ ..\Resources\paypal256px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\flowframesIcoNew-512px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\baseline_system_update_alt_white_48dp.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\patreon256px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\questmark-72px-bordeer.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -157,22 +157,31 @@ ..\Resources\separatorTest1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\baseline_stop_white_48dp.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\devmode.bat;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + ..\Resources\baseline_pause_white_48dp.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\baseline_image_white_48dp.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\baseline_create_white_18dp-semiTransparent.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\patreon256px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\baseline_settings_white_48dp.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\baseline_image_white_48dp-4x-25pcAlpha.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\flowframesIcoNew-512px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\devmode.bat;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + ..\Resources\baseline_play_arrow_white_48dp.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a \ No newline at end of file diff --git a/Code/Resources/baseline_pause_white_48dp.png b/Code/Resources/baseline_pause_white_48dp.png new file mode 100644 index 0000000000000000000000000000000000000000..660ac658589240d14b259e91e6864dc8a8f3665d GIT binary patch literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^2_Vb}Bp6OT_L>T$m`Z~Df*BafCZDwc^29w|978G? plNp)=Km51n;8#DVkv_$ki-GCDeZ`wzAGd%sdb;|#taD0e0szsl7@+_F literal 0 HcmV?d00001 diff --git a/Code/Resources/baseline_play_arrow_white_48dp.png b/Code/Resources/baseline_play_arrow_white_48dp.png new file mode 100644 index 0000000000000000000000000000000000000000..55c8948d57fbe447050c3c59f204b9511686e104 GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>VC3|4aSW+oe0#?|l*K`W<$z+` z&c_VAD-N*g6*TgMEMR2ic;NA_S2;00f5oN?(p8t_cQXMsgMeq;q&t0ln?6o_VtDfA z0-*z6WT$m`Z~Df*BafCZDwc@+3T6978G? plNF?Un*Jv^WS`SWpW>`1!OD<-Rqn&L4h?CLPES`qmvv4FO#td&7>@t| literal 0 HcmV?d00001 diff --git a/Media/baseline_pause_white_48dp.png b/Media/baseline_pause_white_48dp.png new file mode 100644 index 0000000000000000000000000000000000000000..660ac658589240d14b259e91e6864dc8a8f3665d GIT binary patch literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^2_Vb}Bp6OT_L>T$m`Z~Df*BafCZDwc^29w|978G? plNp)=Km51n;8#DVkv_$ki-GCDeZ`wzAGd%sdb;|#taD0e0szsl7@+_F literal 0 HcmV?d00001 diff --git a/Media/baseline_play_arrow_white_48dp.png b/Media/baseline_play_arrow_white_48dp.png new file mode 100644 index 0000000000000000000000000000000000000000..55c8948d57fbe447050c3c59f204b9511686e104 GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>VC3|4aSW+oe0#?|l*K`W<$z+` z&c_VAD-N*g6*TgMEMR2ic;NA_S2;00f5oN?(p8t_cQXMsgMeq;q&t0ln?6o_VtDfA z0-*z6WT$m`Z~Df*BafCZDwc@+3T6978G? plNF?Un*Jv^WS`SWpW>`1!OD<-Rqn&L4h?CLPES`qmvv4FO#td&7>@t| literal 0 HcmV?d00001