private async void StartDoneButton_Click(object sender, RoutedEventArgs e) { // This list will hold key / value pairs that will be bound to the datagrid feedback, // which is the way to make those pairs appear in the data grid during background worker progress updates ObservableCollection<DateTimeRereadFeedbackTuple> feedbackRows = new ObservableCollection<DateTimeRereadFeedbackTuple>(); this.FeedbackGrid.ItemsSource = feedbackRows; this.CancelButton.IsEnabled = false; this.StartDoneButton.Content = "_Done"; this.StartDoneButton.Click -= this.StartDoneButton_Click; this.StartDoneButton.Click += this.DoneButton_Click; this.StartDoneButton.IsEnabled = false; IProgress<DateTimeRereadFeedbackTuple> rereadStatus = new Progress<DateTimeRereadFeedbackTuple>(this.ReportProgress); DateTimeRereadFeedbackTuple rereadProgress = new DateTimeRereadFeedbackTuple("Pass 1: Examining images and videos...", "Checking if dates/time differ"); rereadStatus.Report(rereadProgress); await Task.Run(() => { // check to see what date/times need updating List<ImageRow> filesToAdjust = new List<ImageRow>(); int count = this.database.CurrentlySelectedFileCount; TimeZoneInfo imageSetTimeZone = this.database.ImageSet.GetTimeZone(); for (int fileIndex = 0; fileIndex < count; ++fileIndex) { ImageRow file = this.database.Files[fileIndex]; DateTimeOffset originalDateTime = file.GetDateTime(); string feedbackMessage = String.Empty; try { DateTimeAdjustment dateTimeAdjustment = file.TryReadDateTimeOriginalFromMetadata(this.database.FolderPath, imageSetTimeZone); if (dateTimeAdjustment == DateTimeAdjustment.None) { // couldn't read metadata, so get a candidate date/time from the file file.SetDateTimeOffsetFromFileInfo(this.database.FolderPath, imageSetTimeZone); feedbackMessage = "Using file date/time: "; } else if ((dateTimeAdjustment & DateTimeAdjustment.PreviousMetadata) == DateTimeAdjustment.PreviousMetadata) { feedbackMessage = "Using previous metadata date/time: "; } else { feedbackMessage = "Using metadata date/time: "; } DateTimeOffset rescannedDateTime = file.GetDateTime(); bool updateNeeded = false; if (rescannedDateTime.Date == originalDateTime.Date) { feedbackMessage += "same date, "; } else { updateNeeded = true; feedbackMessage += "different date, "; } if (rescannedDateTime.TimeOfDay == originalDateTime.TimeOfDay) { feedbackMessage += "same time, "; } else { updateNeeded = true; feedbackMessage += "different time, "; } if (rescannedDateTime.Offset == originalDateTime.Offset) { feedbackMessage += "same UTC offset"; } else { updateNeeded = true; feedbackMessage += "different UTC offset"; } if (updateNeeded) { filesToAdjust.Add(file); } } catch (Exception exception) { Debug.Fail(String.Format("Unexpected exception processing '{0}'.", file.FileName), exception.ToString()); feedbackMessage += String.Format(" , skipping due to {0}: {1}.", exception.GetType().FullName, exception.Message); } if (fileIndex % Constant.ThrottleValues.SleepForImageRenderInterval == 0) { rereadProgress.FileName = file.FileName; rereadProgress.Message = feedbackMessage; rereadStatus.Report(new DateTimeRereadFeedbackTuple(file.FileName, feedbackMessage)); Thread.Sleep(Constant.ThrottleValues.RenderingBackoffTime); // Put in a delay every now and then, as otherwise the UI won't update. } } // Pass 2. Update each date as needed rereadProgress.FileName = String.Empty; rereadProgress.Message = String.Empty; rereadStatus.Report(rereadProgress); // A blank separator rereadProgress.FileName = "Pass 2: Updating date/times"; rereadProgress.Message = String.Format("Updating {0} images and videos...", filesToAdjust.Count); rereadStatus.Report(rereadProgress); List<ColumnTuplesWithWhere> imagesToUpdate = new List<ColumnTuplesWithWhere>(); foreach (ImageRow image in filesToAdjust) { imagesToUpdate.Add(image.GetDateTimeColumnTuples()); } database.UpdateFiles(imagesToUpdate); // Write the updates to the database rereadProgress.FileName = String.Empty; rereadProgress.Message = "Done"; rereadStatus.Report(rereadProgress); }); this.StartDoneButton.IsEnabled = true; }
private void ReportProgress(DateTimeRereadFeedbackTuple progress) { ObservableCollection<DateTimeRereadFeedbackTuple> feedbackRows = (ObservableCollection<DateTimeRereadFeedbackTuple>)this.FeedbackGrid.ItemsSource; feedbackRows.Add(progress); this.FeedbackGrid.ScrollIntoView(this.FeedbackGrid.Items[this.FeedbackGrid.Items.Count - 1]); }