private void HandleRescaleAnimationsToolStripMenuItemClick(object sender, EventArgs e) { string directoryPath; using (var dialog = new VistaFolderBrowserDialog()) { dialog.Description = "Select a directory containing GAP files, or subdirectories containing GAP files to rescale.\n" + "Note that this will replace the original files."; if (dialog.ShowDialog() != DialogResult.OK) { return; } directoryPath = dialog.SelectedPath; } Vector3 scale; Vector3 position; using (var scaleDialog = new SetScaleValueDialog()) { if (scaleDialog.ShowDialog() != DialogResult.OK) { return; } scale = scaleDialog.Result.Scale; position = scaleDialog.Result.Position; } var failures = new ConcurrentBag <string>(); using (var dialog = new ProgressDialog()) { dialog.DoWork += (o, progress) => { var filePaths = Directory.EnumerateFiles(directoryPath, "*.GAP", SearchOption.AllDirectories).ToList(); var processedFileCount = 0; Parallel.ForEach(filePaths, (filePath, state) => { lock (dialog) { if (dialog.CancellationPending) { state.Stop(); return; } dialog.ReportProgress((int)(((float)++processedFileCount / filePaths.Count) * 100), $"Processing {Path.GetFileName(filePath)}", null); } try { var animationPack = Resource.Load <AnimationPack>(filePath); animationPack.Rescale(scale, position); animationPack.Save(filePath); } catch (Exception) { failures.Add(filePath); } }); }; dialog.ShowDialog(); } if (failures.Count > 0) { MessageBox.Show("An error occured while processing the following files:\n" + string.Join("\n", failures)); } }
internal ResultValue(SetScaleValueDialog parent) { mParent = parent; }