From dd5e162c10c44d23da7b3e2743eb5fbd1622cd12 Mon Sep 17 00:00:00 2001 From: Robert McRackan Date: Tue, 10 May 2022 16:17:12 -0400 Subject: [PATCH] db persistence shouldn't be a side effect. the client should say when to persist in some fairly explicit way --- Source/LibationWinForms/grid/GridEntry.cs | 62 +++++++------------- Source/LibationWinForms/grid/ProductsGrid.cs | 24 ++++---- 2 files changed, 32 insertions(+), 54 deletions(-) diff --git a/Source/LibationWinForms/grid/GridEntry.cs b/Source/LibationWinForms/grid/GridEntry.cs index ce9d552d..7fabcb38 100644 --- a/Source/LibationWinForms/grid/GridEntry.cs +++ b/Source/LibationWinForms/grid/GridEntry.cs @@ -58,11 +58,7 @@ namespace LibationWinForms public string Category { get; private set; } public string Misc { get; private set; } public string Description { get; private set; } - public string DisplayTags - { - get => string.Join("\r\n", Book.UserDefinedItem.TagsEnumerated); - set => Book.UserDefinedItem.Tags = value; - } + public string DisplayTags => string.Join("\r\n", Book.UserDefinedItem.TagsEnumerated); // these 2 values being in 1 field is the trick behind getting the liberated+pdf 'stoplight' icon to draw. See: LiberateDataGridViewImageButtonCell.Paint public (LiberatedStatus BookStatus, LiberatedStatus? PdfStatus) Liberate @@ -77,18 +73,10 @@ namespace LibationWinForms } return (_bookStatus, _pdfStatus); } - - set - { - _bookStatus = value.BookStatus; - _pdfStatus = value.PdfStatus; - LibraryBook.Book.UserDefinedItem.BookStatus = value.BookStatus; - LibraryBook.Book.UserDefinedItem.PdfStatus = value.PdfStatus; - } } #endregion - public event EventHandler LibraryBookUpdated; + public event EventHandler LibraryBookUpdated; public event EventHandler Committed; // alias @@ -156,7 +144,7 @@ namespace LibationWinForms UserDefinedItem.ItemChanged += UserDefinedItem_ItemChanged; // this will never have a value when triggered by ctor b/c nothing can subscribe to the event until after ctor is complete - LibraryBookUpdated?.Invoke(this, AudibleProductId); + LibraryBookUpdated?.Invoke(this, null); } private void PictureStorage_PictureCached(object sender, PictureCachedEventArgs e) @@ -196,38 +184,30 @@ namespace LibationWinForms NotifyPropertyChanged(nameof(Liberate)); break; } - - if (!suspendCommit) - Commit(); - } - private bool suspendCommit = false; - - /// - /// Begin editing the model, suspending commits until is called. - /// - public void BeginEdit() => suspendCommit = true; - - /// - /// Save all edits to the database. - /// - public void EndEdit() - { - Commit(); - suspendCommit = false; } - private void Commit() + /// Save edits to the database + public void Commit(string newTags, LiberatedStatus bookStatus, LiberatedStatus? pdfStatus) { - // We don't want LiberatedStatus.PartialDownload to be a persistent status. - // If display/icon status is PartialDownload then save NotLiberated to db then restore PartialDownload for display - var displayStatus = Book.UserDefinedItem.BookStatus; - var saveStatus = displayStatus == LiberatedStatus.PartialDownload ? LiberatedStatus.NotLiberated : displayStatus; - Book.UserDefinedItem.BookStatus = saveStatus; + // validate + if (DisplayTags.EqualsInsensitive(newTags) && + Liberate.BookStatus == bookStatus && + Liberate.PdfStatus == pdfStatus) + return; + // set + Book.UserDefinedItem.Tags = newTags; + + _bookStatus = bookStatus; + _pdfStatus = pdfStatus; + + Book.UserDefinedItem.BookStatus = bookStatus; + Book.UserDefinedItem.PdfStatus = pdfStatus; + + // save LibraryCommands.UpdateUserDefinedItem(Book); - Book.UserDefinedItem.BookStatus = displayStatus; - + // notify Committed?.Invoke(this, null); } diff --git a/Source/LibationWinForms/grid/ProductsGrid.cs b/Source/LibationWinForms/grid/ProductsGrid.cs index 239288b6..71938d70 100644 --- a/Source/LibationWinForms/grid/ProductsGrid.cs +++ b/Source/LibationWinForms/grid/ProductsGrid.cs @@ -114,15 +114,8 @@ namespace LibationWinForms private static void Details_Click(GridEntry liveGridEntry) { var bookDetailsForm = new BookDetailsDialog(liveGridEntry.LibraryBook); - if (bookDetailsForm.ShowDialog() != DialogResult.OK) - return; - - liveGridEntry.BeginEdit(); - - liveGridEntry.DisplayTags = bookDetailsForm.NewTags; - liveGridEntry.Liberate = (bookDetailsForm.BookLiberatedStatus, bookDetailsForm.PdfLiberatedStatus); - - liveGridEntry.EndEdit(); + if (bookDetailsForm.ShowDialog() == DialogResult.OK) + liveGridEntry.Commit(bookDetailsForm.NewTags, bookDetailsForm.BookLiberatedStatus, bookDetailsForm.PdfLiberatedStatus); } #endregion @@ -203,7 +196,7 @@ namespace LibationWinForms { var entry = new GridEntry(libraryBook); entry.Committed += Filter; - entry.LibraryBookUpdated += (sender, productId) => _dataGridView.InvalidateRow(_dataGridView.GetRowIdOfBoundItem((GridEntry)sender)); + entry.LibraryBookUpdated += (sender, _) => _dataGridView.InvalidateRow(_dataGridView.GetRowIdOfBoundItem((GridEntry)sender)); return entry; } @@ -236,14 +229,19 @@ namespace LibationWinForms // Causes repainting of the DataGridView bindingContext.ResumeBinding(); - VisibleCountChanged?.Invoke(this, _dataGridView.AsEnumerable().Count(r => r.Visible)); + VisibleCountChanged?.Invoke(this, GetVisible().Count()); } #endregion - #region DataGridView Macro + internal IEnumerable GetVisible() + => _dataGridView + .AsEnumerable() + .Where(row => row.Visible) + .Select(row => ((GridEntry)row.DataBoundItem).LibraryBook) + .ToList(); + private GridEntry getGridEntry(int rowIndex) => _dataGridView.GetBoundItem(rowIndex); - #endregion #region Column Customizations