From 788bd5ef8c74e2aa91bd085a5d54bfe071ae99bd Mon Sep 17 00:00:00 2001 From: Kurt Date: Sat, 1 Jul 2017 16:07:02 -0700 Subject: [PATCH] Don't batch edit if no data to iterate over Closes #1287 Setting PartyData with Length==0 throws an exception from the SAV object; only process if necessary. Felt like splitting the method up into smaller pieces. --- .../Subforms/PKM Editors/BatchEditor.cs | 90 +++++++++---------- 1 file changed, 44 insertions(+), 46 deletions(-) diff --git a/PKHeX.WinForms/Subforms/PKM Editors/BatchEditor.cs b/PKHeX.WinForms/Subforms/PKM Editors/BatchEditor.cs index 0bbb92f79..2ea0c8be6 100644 --- a/PKHeX.WinForms/Subforms/PKM Editors/BatchEditor.cs +++ b/PKHeX.WinForms/Subforms/PKM Editors/BatchEditor.cs @@ -86,12 +86,6 @@ private void B_SAV_Click(object sender, EventArgs e) } private void B_Go_Click(object sender, EventArgs e) { - if (b.IsBusy) - { WinFormsUtil.Alert("Currently executing instruction list."); return; } - - if (RTB_Instructions.Lines.Any(line => line.Length == 0)) - { WinFormsUtil.Error("Line length error in instruction list."); return; } - RunBackgroundWorker(); } private void B_Add_Click(object sender, EventArgs e) @@ -148,28 +142,30 @@ private void TabMain_DragDrop(object sender, DragEventArgs e) RB_Path.Checked = true; } - private BackgroundWorker b = new BackgroundWorker { WorkerReportsProgress = true }; + private BackgroundWorker b; private void RunBackgroundWorker() { + if (RTB_Instructions.Lines.Any(line => line.Length == 0)) + { WinFormsUtil.Error("Line length error in instruction list."); return; } + var Filters = StringInstruction.GetFilters(RTB_Instructions.Lines).ToArray(); if (Filters.Any(z => string.IsNullOrWhiteSpace(z.PropertyValue))) { WinFormsUtil.Error("Empty Filter Value detected."); return; } var Instructions = StringInstruction.GetInstructions(RTB_Instructions.Lines).ToArray(); + if (!Instructions.Any()) + { WinFormsUtil.Error("No instructions defined."); return; } + var emptyVal = Instructions.Where(z => string.IsNullOrWhiteSpace(z.PropertyValue)).ToArray(); if (emptyVal.Any()) { string props = string.Join(", ", emptyVal.Select(z => z.PropertyName)); - if (DialogResult.Yes != WinFormsUtil.Prompt(MessageBoxButtons.YesNo, - $"Empty Property Value{(emptyVal.Length > 1 ? "s" : "")} detected:" + Environment.NewLine + props, - "Continue?")) + string invalid = $"Empty Property Value{(emptyVal.Length > 1 ? "s" : "")} detected:" + Environment.NewLine + props; + if (DialogResult.Yes != WinFormsUtil.Prompt(MessageBoxButtons.YesNo, invalid, "Continue?")) return; } - if (!Instructions.Any()) - { WinFormsUtil.Error("No instructions defined."); return; } - - string destPath = ""; + string destPath = null; if (RB_Path.Checked) { WinFormsUtil.Alert("Please select the folder where the files will be saved to.", "This can be the same folder as the source of PKM files."); @@ -183,42 +179,24 @@ private void RunBackgroundWorker() FLP_RB.Enabled = RTB_Instructions.Enabled = B_Go.Enabled = false; - b = new BackgroundWorker {WorkerReportsProgress = true}; ScreenStrings(Filters); ScreenStrings(Instructions); - - b.DoWork += (sender, e) => { - - len = err = ctr = 0; - if (RB_SAV.Checked) - { - if (SAV.HasParty) - { - var data = SAV.PartyData; - SetupProgressBar(data.Length); - ProcessSAV(data, Filters, Instructions); - SAV.PartyData = data; - } - if (SAV.HasBox) - { - var data = SAV.BoxData; - SetupProgressBar(data.Length); - ProcessSAV(data, Filters, Instructions); - SAV.BoxData = data; - } - } - else - { - var files = Directory.GetFiles(TB_Folder.Text, "*", SearchOption.AllDirectories); - SetupProgressBar(files.Length); - ProcessFolder(files, Filters, Instructions, destPath); - } - }; - b.ProgressChanged += (sender, e) => + RunBatchEdit(Filters, Instructions, TB_Folder.Text, destPath); + } + private void RunBatchEdit(StringInstruction[] Filters, StringInstruction[] Instructions, string source, string destination) + { + len = err = ctr = 0; + b = new BackgroundWorker { WorkerReportsProgress = true }; + b.DoWork += (sender, e) => { - SetProgressBar(e.ProgressPercentage); + if (RB_SAV.Checked) + RunBatchEditSaveFile(Filters, Instructions); + else + RunBatchEditFolder(Filters, Instructions, source, destination); }; - b.RunWorkerCompleted += (sender, e) => { + b.ProgressChanged += (sender, e) => SetProgressBar(e.ProgressPercentage); + b.RunWorkerCompleted += (sender, e) => + { string result = $"Modified {ctr}/{len} files."; if (err > 0) result += Environment.NewLine + $"{err} files ignored due to an internal error."; @@ -228,6 +206,26 @@ private void RunBackgroundWorker() }; b.RunWorkerAsync(); } + private void RunBatchEditFolder(StringInstruction[] Filters, StringInstruction[] Instructions, string source, string destination) + { + var files = Directory.GetFiles(source, "*", SearchOption.AllDirectories); + SetupProgressBar(files.Length); + ProcessFolder(files, Filters, Instructions, destination); + } + private void RunBatchEditSaveFile(StringInstruction[] Filters, StringInstruction[] Instructions) + { + PKM[] data; + if (SAV.HasParty && process(data = SAV.PartyData)) + SAV.PartyData = data; + if (SAV.HasBox && process(data = SAV.BoxData)) + SAV.BoxData = data; + bool process(PKM[] d) + { + SetupProgressBar(d.Length); + ProcessSAV(d, Filters, Instructions); + return d.Length != 0; + } + } // Progress Bar private void SetupProgressBar(int count)