Add scan and remove books tomain view, remove separate dialog.
This commit is contained in:
parent
7bcabdda38
commit
52193933b2
@ -27,7 +27,7 @@ namespace ApplicationServices
|
|||||||
ScanEnd += (_, __) => Scanning = false;
|
ScanEnd += (_, __) => Scanning = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task<List<LibraryBook>> FindInactiveBooks(Func<Account, Task<ApiExtended>> apiExtendedfunc, List<LibraryBook> existingLibrary, params Account[] accounts)
|
public static async Task<List<LibraryBook>> FindInactiveBooks(Func<Account, Task<ApiExtended>> apiExtendedfunc, IEnumerable<LibraryBook> existingLibrary, params Account[] accounts)
|
||||||
{
|
{
|
||||||
logRestart();
|
logRestart();
|
||||||
|
|
||||||
|
|||||||
@ -151,13 +151,13 @@ namespace LibationWinForms.Dialogs
|
|||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(dto.AccountId))
|
if (string.IsNullOrWhiteSpace(dto.AccountId))
|
||||||
{
|
{
|
||||||
MessageBox.Show("Account id cannot be blank. Please enter an account id for all accounts.", "Blank account", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
MessageBox.Show(this, "Account id cannot be blank. Please enter an account id for all accounts.", "Blank account", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(dto.LocaleName))
|
if (string.IsNullOrWhiteSpace(dto.LocaleName))
|
||||||
{
|
{
|
||||||
MessageBox.Show("Please select a locale (i.e.: country or region) for all accounts.", "Blank region", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
MessageBox.Show(this, "Please select a locale (i.e.: country or region) for all accounts.", "Blank region", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -222,7 +222,7 @@ namespace LibationWinForms.Dialogs
|
|||||||
|
|
||||||
if (account.IdentityTokens?.IsValid != true)
|
if (account.IdentityTokens?.IsValid != true)
|
||||||
{
|
{
|
||||||
MessageBox.Show("This account hasn't been authenticated yet. First scan your library to log into your account, then try exporting again.", "Account Not Authenticated");
|
MessageBox.Show(this, "This account hasn't been authenticated yet. First scan your library to log into your account, then try exporting again.", "Account Not Authenticated");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -238,12 +238,15 @@ namespace LibationWinForms.Dialogs
|
|||||||
|
|
||||||
File.WriteAllText(sfd.FileName, jsonText);
|
File.WriteAllText(sfd.FileName, jsonText);
|
||||||
|
|
||||||
MessageBox.Show($"Successfully exported {account.AccountName} to\r\n\r\n{sfd.FileName}", "Success!");
|
MessageBox.Show(this, $"Successfully exported {account.AccountName} to\r\n\r\n{sfd.FileName}", "Success!");
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Serilog.Log.Logger.Error(ex, "Unable to export account: {0}", account);
|
MessageBoxLib.ShowAdminAlert(
|
||||||
MessageBox.Show($"An error occured while exporting account:\r\n{account.AccountName}", "Error Exporting Account");
|
this,
|
||||||
|
$"An error occured while exporting account:\r\n{account.AccountName}",
|
||||||
|
"Error Exporting Account",
|
||||||
|
ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private async void importBtn_Click(object sender, EventArgs e)
|
private async void importBtn_Click(object sender, EventArgs e)
|
||||||
@ -264,7 +267,7 @@ namespace LibationWinForms.Dialogs
|
|||||||
|
|
||||||
if (persister.AccountsSettings.Accounts.Any(a => a.AccountId == account.AccountId && a.IdentityTokens.Locale.Name == account.Locale.Name))
|
if (persister.AccountsSettings.Accounts.Any(a => a.AccountId == account.AccountId && a.IdentityTokens.Locale.Name == account.Locale.Name))
|
||||||
{
|
{
|
||||||
MessageBox.Show($"An account with that account id and country already exists.\r\n\r\nAccount ID: {account.AccountId}\r\nCountry: {account.Locale.Name}", "Cannot Add Duplicate Account");
|
MessageBox.Show(this, $"An account with that account id and country already exists.\r\n\r\nAccount ID: {account.AccountId}\r\nCountry: {account.Locale.Name}", "Cannot Add Duplicate Account");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -274,8 +277,11 @@ namespace LibationWinForms.Dialogs
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Serilog.Log.Logger.Error(ex, "Unable to import audible-cli auth file: {0}", ofd.FileName);
|
MessageBoxLib.ShowAdminAlert(
|
||||||
MessageBox.Show($"An error occured while importing an account from:\r\n{ofd.FileName}\r\n\r\nIs the file encrypted?", "Error Importing Account");
|
this,
|
||||||
|
$"An error occured while importing an account from:\r\n{ofd.FileName}\r\n\r\nIs the file encrypted?",
|
||||||
|
"Error Importing Account",
|
||||||
|
ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,189 +0,0 @@
|
|||||||
|
|
||||||
namespace LibationWinForms.Dialogs
|
|
||||||
{
|
|
||||||
partial class RemoveBooksDialog
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Required designer variable.
|
|
||||||
/// </summary>
|
|
||||||
private System.ComponentModel.IContainer components = null;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Clean up any resources being used.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
|
||||||
protected override void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
if (disposing && (components != null))
|
|
||||||
{
|
|
||||||
components.Dispose();
|
|
||||||
}
|
|
||||||
base.Dispose(disposing);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Windows Form Designer generated code
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Required method for Designer support - do not modify
|
|
||||||
/// the contents of this method with the code editor.
|
|
||||||
/// </summary>
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
this.components = new System.ComponentModel.Container();
|
|
||||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
|
|
||||||
this._dataGridView = new System.Windows.Forms.DataGridView();
|
|
||||||
this.removeDataGridViewCheckBoxColumn = new System.Windows.Forms.DataGridViewCheckBoxColumn();
|
|
||||||
this.coverDataGridViewImageColumn = new System.Windows.Forms.DataGridViewImageColumn();
|
|
||||||
this.titleDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
|
||||||
this.authorsDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
|
||||||
this.miscDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
|
||||||
this.purchaseDateGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
|
||||||
this.gridEntryBindingSource = new LibationWinForms.GridView.SyncBindingSource(this.components);
|
|
||||||
this.btnRemoveBooks = new System.Windows.Forms.Button();
|
|
||||||
this.label1 = new System.Windows.Forms.Label();
|
|
||||||
((System.ComponentModel.ISupportInitialize)(this._dataGridView)).BeginInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)(this.gridEntryBindingSource)).BeginInit();
|
|
||||||
this.SuspendLayout();
|
|
||||||
//
|
|
||||||
// _dataGridView
|
|
||||||
//
|
|
||||||
this._dataGridView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
|
||||||
| System.Windows.Forms.AnchorStyles.Left)
|
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
|
||||||
this._dataGridView.AutoGenerateColumns = false;
|
|
||||||
this._dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
|
|
||||||
this._dataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
|
|
||||||
this.removeDataGridViewCheckBoxColumn,
|
|
||||||
this.coverDataGridViewImageColumn,
|
|
||||||
this.titleDataGridViewTextBoxColumn,
|
|
||||||
this.authorsDataGridViewTextBoxColumn,
|
|
||||||
this.miscDataGridViewTextBoxColumn,
|
|
||||||
this.purchaseDateGridViewTextBoxColumn});
|
|
||||||
this._dataGridView.DataSource = this.gridEntryBindingSource;
|
|
||||||
dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
|
|
||||||
dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Window;
|
|
||||||
dataGridViewCellStyle1.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
|
|
||||||
dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.ControlText;
|
|
||||||
dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight;
|
|
||||||
dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
|
|
||||||
dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
|
|
||||||
this._dataGridView.DefaultCellStyle = dataGridViewCellStyle1;
|
|
||||||
this._dataGridView.Location = new System.Drawing.Point(0, 0);
|
|
||||||
this._dataGridView.Name = "_dataGridView";
|
|
||||||
this._dataGridView.RowHeadersVisible = false;
|
|
||||||
this._dataGridView.RowTemplate.Height = 82;
|
|
||||||
this._dataGridView.Size = new System.Drawing.Size(730, 409);
|
|
||||||
this._dataGridView.TabIndex = 0;
|
|
||||||
//
|
|
||||||
// removeDataGridViewCheckBoxColumn
|
|
||||||
//
|
|
||||||
this.removeDataGridViewCheckBoxColumn.DataPropertyName = "Remove";
|
|
||||||
this.removeDataGridViewCheckBoxColumn.FalseValue = "False";
|
|
||||||
this.removeDataGridViewCheckBoxColumn.Frozen = true;
|
|
||||||
this.removeDataGridViewCheckBoxColumn.HeaderText = "Remove";
|
|
||||||
this.removeDataGridViewCheckBoxColumn.MinimumWidth = 80;
|
|
||||||
this.removeDataGridViewCheckBoxColumn.Name = "removeDataGridViewCheckBoxColumn";
|
|
||||||
this.removeDataGridViewCheckBoxColumn.Resizable = System.Windows.Forms.DataGridViewTriState.False;
|
|
||||||
this.removeDataGridViewCheckBoxColumn.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic;
|
|
||||||
this.removeDataGridViewCheckBoxColumn.TrueValue = "True";
|
|
||||||
this.removeDataGridViewCheckBoxColumn.Width = 80;
|
|
||||||
//
|
|
||||||
// coverDataGridViewImageColumn
|
|
||||||
//
|
|
||||||
this.coverDataGridViewImageColumn.DataPropertyName = "Cover";
|
|
||||||
this.coverDataGridViewImageColumn.HeaderText = "Cover";
|
|
||||||
this.coverDataGridViewImageColumn.MinimumWidth = 80;
|
|
||||||
this.coverDataGridViewImageColumn.Name = "coverDataGridViewImageColumn";
|
|
||||||
this.coverDataGridViewImageColumn.ReadOnly = true;
|
|
||||||
this.coverDataGridViewImageColumn.Resizable = System.Windows.Forms.DataGridViewTriState.False;
|
|
||||||
this.coverDataGridViewImageColumn.Width = 80;
|
|
||||||
//
|
|
||||||
// titleDataGridViewTextBoxColumn
|
|
||||||
//
|
|
||||||
this.titleDataGridViewTextBoxColumn.DataPropertyName = "Title";
|
|
||||||
this.titleDataGridViewTextBoxColumn.HeaderText = "Title";
|
|
||||||
this.titleDataGridViewTextBoxColumn.Name = "titleDataGridViewTextBoxColumn";
|
|
||||||
this.titleDataGridViewTextBoxColumn.ReadOnly = true;
|
|
||||||
this.titleDataGridViewTextBoxColumn.Width = 200;
|
|
||||||
//
|
|
||||||
// authorsDataGridViewTextBoxColumn
|
|
||||||
//
|
|
||||||
this.authorsDataGridViewTextBoxColumn.DataPropertyName = "Authors";
|
|
||||||
this.authorsDataGridViewTextBoxColumn.HeaderText = "Authors";
|
|
||||||
this.authorsDataGridViewTextBoxColumn.Name = "authorsDataGridViewTextBoxColumn";
|
|
||||||
this.authorsDataGridViewTextBoxColumn.ReadOnly = true;
|
|
||||||
//
|
|
||||||
// miscDataGridViewTextBoxColumn
|
|
||||||
//
|
|
||||||
this.miscDataGridViewTextBoxColumn.DataPropertyName = "Misc";
|
|
||||||
this.miscDataGridViewTextBoxColumn.HeaderText = "Misc";
|
|
||||||
this.miscDataGridViewTextBoxColumn.Name = "miscDataGridViewTextBoxColumn";
|
|
||||||
this.miscDataGridViewTextBoxColumn.ReadOnly = true;
|
|
||||||
this.miscDataGridViewTextBoxColumn.Width = 150;
|
|
||||||
//
|
|
||||||
// purchaseDateGridViewTextBoxColumn
|
|
||||||
//
|
|
||||||
this.purchaseDateGridViewTextBoxColumn.DataPropertyName = "PurchaseDate";
|
|
||||||
this.purchaseDateGridViewTextBoxColumn.HeaderText = "Purchase Date";
|
|
||||||
this.purchaseDateGridViewTextBoxColumn.Name = "purchaseDateGridViewTextBoxColumn";
|
|
||||||
this.purchaseDateGridViewTextBoxColumn.ReadOnly = true;
|
|
||||||
this.purchaseDateGridViewTextBoxColumn.Resizable = System.Windows.Forms.DataGridViewTriState.False;
|
|
||||||
//
|
|
||||||
// gridEntryBindingSource
|
|
||||||
//
|
|
||||||
this.gridEntryBindingSource.AllowNew = false;
|
|
||||||
this.gridEntryBindingSource.DataSource = typeof(LibationWinForms.Dialogs.RemovableGridEntry);
|
|
||||||
//
|
|
||||||
// btnRemoveBooks
|
|
||||||
//
|
|
||||||
this.btnRemoveBooks.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
|
||||||
this.btnRemoveBooks.Location = new System.Drawing.Point(500, 419);
|
|
||||||
this.btnRemoveBooks.Name = "btnRemoveBooks";
|
|
||||||
this.btnRemoveBooks.Size = new System.Drawing.Size(218, 23);
|
|
||||||
this.btnRemoveBooks.TabIndex = 1;
|
|
||||||
this.btnRemoveBooks.Text = "Remove Selected Books from Libation";
|
|
||||||
this.btnRemoveBooks.UseVisualStyleBackColor = true;
|
|
||||||
this.btnRemoveBooks.Click += new System.EventHandler(this.btnRemoveBooks_Click);
|
|
||||||
//
|
|
||||||
// label1
|
|
||||||
//
|
|
||||||
this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
|
||||||
this.label1.AutoSize = true;
|
|
||||||
this.label1.Location = new System.Drawing.Point(12, 423);
|
|
||||||
this.label1.Name = "label1";
|
|
||||||
this.label1.Size = new System.Drawing.Size(178, 15);
|
|
||||||
this.label1.TabIndex = 2;
|
|
||||||
this.label1.Text = "{0} book{1} selected for removal.";
|
|
||||||
//
|
|
||||||
// RemoveBooksDialog
|
|
||||||
//
|
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
|
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
|
||||||
this.ClientSize = new System.Drawing.Size(730, 450);
|
|
||||||
this.Controls.Add(this.label1);
|
|
||||||
this.Controls.Add(this.btnRemoveBooks);
|
|
||||||
this.Controls.Add(this._dataGridView);
|
|
||||||
this.Name = "RemoveBooksDialog";
|
|
||||||
this.Text = "Remove Books from Libation's Database";
|
|
||||||
this.Shown += new System.EventHandler(this.RemoveBooksDialog_Shown);
|
|
||||||
((System.ComponentModel.ISupportInitialize)(this._dataGridView)).EndInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)(this.gridEntryBindingSource)).EndInit();
|
|
||||||
this.ResumeLayout(false);
|
|
||||||
this.PerformLayout();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
private System.Windows.Forms.DataGridView _dataGridView;
|
|
||||||
private LibationWinForms.GridView.SyncBindingSource gridEntryBindingSource;
|
|
||||||
private System.Windows.Forms.Button btnRemoveBooks;
|
|
||||||
private System.Windows.Forms.Label label1;
|
|
||||||
private System.Windows.Forms.DataGridViewCheckBoxColumn removeDataGridViewCheckBoxColumn;
|
|
||||||
private System.Windows.Forms.DataGridViewImageColumn coverDataGridViewImageColumn;
|
|
||||||
private System.Windows.Forms.DataGridViewTextBoxColumn titleDataGridViewTextBoxColumn;
|
|
||||||
private System.Windows.Forms.DataGridViewTextBoxColumn authorsDataGridViewTextBoxColumn;
|
|
||||||
private System.Windows.Forms.DataGridViewTextBoxColumn miscDataGridViewTextBoxColumn;
|
|
||||||
private System.Windows.Forms.DataGridViewTextBoxColumn purchaseDateGridViewTextBoxColumn;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,149 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.ComponentModel;
|
|
||||||
using System.Data;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
using ApplicationServices;
|
|
||||||
using AudibleUtilities;
|
|
||||||
using DataLayer;
|
|
||||||
using Dinah.Core.DataBinding;
|
|
||||||
using LibationFileManager;
|
|
||||||
using LibationWinForms.Login;
|
|
||||||
|
|
||||||
namespace LibationWinForms.Dialogs
|
|
||||||
{
|
|
||||||
public partial class RemoveBooksDialog : Form
|
|
||||||
{
|
|
||||||
private Account[] _accounts { get; }
|
|
||||||
private List<LibraryBook> _libraryBooks { get; }
|
|
||||||
private SortableBindingList<RemovableGridEntry> _removableGridEntries { get; }
|
|
||||||
private string _labelFormat { get; }
|
|
||||||
private int SelectedCount => SelectedEntries?.Count() ?? 0;
|
|
||||||
private IEnumerable<RemovableGridEntry> SelectedEntries => _removableGridEntries?.Where(b => b.Remove);
|
|
||||||
|
|
||||||
public RemoveBooksDialog(params Account[] accounts)
|
|
||||||
{
|
|
||||||
_libraryBooks = DbContexts.GetLibrary_Flat_NoTracking();
|
|
||||||
_accounts = accounts;
|
|
||||||
|
|
||||||
InitializeComponent();
|
|
||||||
|
|
||||||
this.Load += (_, _) => this.RestoreSizeAndLocation(Configuration.Instance);
|
|
||||||
this.FormClosing += (_, _) => this.SaveSizeAndLocation(Configuration.Instance);
|
|
||||||
|
|
||||||
_labelFormat = label1.Text;
|
|
||||||
|
|
||||||
_dataGridView.CellContentClick += (_, _) => _dataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
|
|
||||||
_dataGridView.CellValueChanged += (_, _) => UpdateSelection();
|
|
||||||
_dataGridView.BindingContextChanged += _dataGridView_BindingContextChanged;
|
|
||||||
|
|
||||||
var orderedGridEntries = _libraryBooks
|
|
||||||
.Select(lb => new RemovableGridEntry(lb))
|
|
||||||
.OrderByDescending(ge => (DateTime)ge.GetMemberValue(nameof(ge.PurchaseDate)))
|
|
||||||
.ToList();
|
|
||||||
|
|
||||||
_removableGridEntries = new SortableBindingList<RemovableGridEntry>(orderedGridEntries);
|
|
||||||
gridEntryBindingSource.DataSource = _removableGridEntries;
|
|
||||||
|
|
||||||
_dataGridView.Enabled = false;
|
|
||||||
this.SetLibationIcon();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void _dataGridView_BindingContextChanged(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
_dataGridView.Sort(_dataGridView.Columns[0], ListSortDirection.Descending);
|
|
||||||
UpdateSelection();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void RemoveBooksDialog_Shown(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
if (_accounts is null || _accounts.Length == 0)
|
|
||||||
return;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var removedBooks = await LibraryCommands.FindInactiveBooks(WinformLoginChoiceEager.ApiExtendedFunc, _libraryBooks, _accounts);
|
|
||||||
|
|
||||||
var removable = _removableGridEntries.Where(rge => removedBooks.Any(rb => rb.Book.AudibleProductId == rge.AudibleProductId)).ToList();
|
|
||||||
|
|
||||||
if (!removable.Any())
|
|
||||||
return;
|
|
||||||
|
|
||||||
foreach (var r in removable)
|
|
||||||
r.Remove = true;
|
|
||||||
|
|
||||||
UpdateSelection();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
MessageBoxLib.ShowAdminAlert(
|
|
||||||
this,
|
|
||||||
"Error scanning library. You may still manually select books to remove from Libation's library.",
|
|
||||||
"Error scanning library",
|
|
||||||
ex);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
_dataGridView.Enabled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void btnRemoveBooks_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
var selectedBooks = SelectedEntries.ToList();
|
|
||||||
|
|
||||||
if (selectedBooks.Count == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var libraryBooks = selectedBooks.Select(rge => rge.LibraryBook).ToList();
|
|
||||||
var result = MessageBoxLib.ShowConfirmationDialog(
|
|
||||||
libraryBooks,
|
|
||||||
$"Are you sure you want to remove {0} from Libation's library?",
|
|
||||||
"Remove books from Libation?");
|
|
||||||
|
|
||||||
if (result != DialogResult.Yes)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var idsToRemove = libraryBooks.Select(lb => lb.Book.AudibleProductId).ToList();
|
|
||||||
var removeLibraryBooks = await LibraryCommands.RemoveBooksAsync(idsToRemove);
|
|
||||||
|
|
||||||
foreach (var rEntry in selectedBooks)
|
|
||||||
_removableGridEntries.Remove(rEntry);
|
|
||||||
|
|
||||||
UpdateSelection();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UpdateSelection()
|
|
||||||
{
|
|
||||||
var selectedCount = SelectedCount;
|
|
||||||
label1.Text = string.Format(_labelFormat, selectedCount, selectedCount != 1 ? "s" : string.Empty);
|
|
||||||
btnRemoveBooks.Enabled = selectedCount > 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal class RemovableGridEntry : GridView.LibraryBookEntry
|
|
||||||
{
|
|
||||||
private bool _remove = false;
|
|
||||||
public RemovableGridEntry(LibraryBook libraryBook) : base(libraryBook) { }
|
|
||||||
|
|
||||||
public bool Remove
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return _remove;
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
_remove = value;
|
|
||||||
NotifyPropertyChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override object GetMemberValue(string memberName)
|
|
||||||
{
|
|
||||||
if (memberName == nameof(Remove))
|
|
||||||
return Remove;
|
|
||||||
return base.GetMemberValue(memberName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,63 +0,0 @@
|
|||||||
<root>
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<metadata name="gridEntryBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
|
||||||
<value>17, 17</value>
|
|
||||||
</metadata>
|
|
||||||
</root>
|
|
||||||
15
Source/LibationWinForms/Form1.Designer.cs
generated
15
Source/LibationWinForms/Form1.Designer.cs
generated
@ -42,6 +42,7 @@
|
|||||||
this.removeLibraryBooksToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.removeLibraryBooksToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.removeAllAccountsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.removeAllAccountsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.removeSomeAccountsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.removeSomeAccountsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.closeRemoveBooksColumnToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.liberateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.liberateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.beginBookBackupsToolStripMenuItem = new LibationWinForms.FormattableToolStripMenuItem();
|
this.beginBookBackupsToolStripMenuItem = new LibationWinForms.FormattableToolStripMenuItem();
|
||||||
this.beginPdfBackupsToolStripMenuItem = new LibationWinForms.FormattableToolStripMenuItem();
|
this.beginPdfBackupsToolStripMenuItem = new LibationWinForms.FormattableToolStripMenuItem();
|
||||||
@ -144,7 +145,8 @@
|
|||||||
this.scanLibraryToolStripMenuItem,
|
this.scanLibraryToolStripMenuItem,
|
||||||
this.scanLibraryOfAllAccountsToolStripMenuItem,
|
this.scanLibraryOfAllAccountsToolStripMenuItem,
|
||||||
this.scanLibraryOfSomeAccountsToolStripMenuItem,
|
this.scanLibraryOfSomeAccountsToolStripMenuItem,
|
||||||
this.removeLibraryBooksToolStripMenuItem});
|
this.removeLibraryBooksToolStripMenuItem,
|
||||||
|
this.closeRemoveBooksColumnToolStripMenuItem});
|
||||||
this.importToolStripMenuItem.Name = "importToolStripMenuItem";
|
this.importToolStripMenuItem.Name = "importToolStripMenuItem";
|
||||||
this.importToolStripMenuItem.Size = new System.Drawing.Size(55, 20);
|
this.importToolStripMenuItem.Size = new System.Drawing.Size(55, 20);
|
||||||
this.importToolStripMenuItem.Text = "&Import";
|
this.importToolStripMenuItem.Text = "&Import";
|
||||||
@ -209,6 +211,14 @@
|
|||||||
this.removeSomeAccountsToolStripMenuItem.Text = "Some Accounts";
|
this.removeSomeAccountsToolStripMenuItem.Text = "Some Accounts";
|
||||||
this.removeSomeAccountsToolStripMenuItem.Click += new System.EventHandler(this.removeSomeAccountsToolStripMenuItem_Click);
|
this.removeSomeAccountsToolStripMenuItem.Click += new System.EventHandler(this.removeSomeAccountsToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
|
// closeRemoveBooksColumnToolStripMenuItem
|
||||||
|
//
|
||||||
|
this.closeRemoveBooksColumnToolStripMenuItem.Name = "closeRemoveBooksColumnToolStripMenuItem";
|
||||||
|
this.closeRemoveBooksColumnToolStripMenuItem.Size = new System.Drawing.Size(247, 22);
|
||||||
|
this.closeRemoveBooksColumnToolStripMenuItem.Text = "&Done Removing Books";
|
||||||
|
this.closeRemoveBooksColumnToolStripMenuItem.Visible = false;
|
||||||
|
this.closeRemoveBooksColumnToolStripMenuItem.Click += new System.EventHandler(this.closeRemoveBooksColumnToolStripMenuItem_Click);
|
||||||
|
//
|
||||||
// liberateToolStripMenuItem
|
// liberateToolStripMenuItem
|
||||||
//
|
//
|
||||||
this.liberateToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
this.liberateToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
@ -396,6 +406,7 @@
|
|||||||
this.statusStrip1.Location = new System.Drawing.Point(0, 618);
|
this.statusStrip1.Location = new System.Drawing.Point(0, 618);
|
||||||
this.statusStrip1.Name = "statusStrip1";
|
this.statusStrip1.Name = "statusStrip1";
|
||||||
this.statusStrip1.Padding = new System.Windows.Forms.Padding(1, 0, 16, 0);
|
this.statusStrip1.Padding = new System.Windows.Forms.Padding(1, 0, 16, 0);
|
||||||
|
this.statusStrip1.ShowItemToolTips = true;
|
||||||
this.statusStrip1.Size = new System.Drawing.Size(1061, 22);
|
this.statusStrip1.Size = new System.Drawing.Size(1061, 22);
|
||||||
this.statusStrip1.TabIndex = 6;
|
this.statusStrip1.TabIndex = 6;
|
||||||
this.statusStrip1.Text = "statusStrip1";
|
this.statusStrip1.Text = "statusStrip1";
|
||||||
@ -485,6 +496,7 @@
|
|||||||
this.productsDisplay.Size = new System.Drawing.Size(1031, 555);
|
this.productsDisplay.Size = new System.Drawing.Size(1031, 555);
|
||||||
this.productsDisplay.TabIndex = 9;
|
this.productsDisplay.TabIndex = 9;
|
||||||
this.productsDisplay.VisibleCountChanged += new System.EventHandler<int>(this.productsDisplay_VisibleCountChanged);
|
this.productsDisplay.VisibleCountChanged += new System.EventHandler<int>(this.productsDisplay_VisibleCountChanged);
|
||||||
|
this.productsDisplay.RemovableCountChanged += new System.EventHandler<int>(this.productsDisplay_RemovableCountChanged);
|
||||||
this.productsDisplay.LiberateClicked += new System.EventHandler<DataLayer.LibraryBook>(this.ProductsDisplay_LiberateClicked);
|
this.productsDisplay.LiberateClicked += new System.EventHandler<DataLayer.LibraryBook>(this.ProductsDisplay_LiberateClicked);
|
||||||
this.productsDisplay.InitialLoaded += new System.EventHandler(this.productsDisplay_InitialLoaded);
|
this.productsDisplay.InitialLoaded += new System.EventHandler(this.productsDisplay_InitialLoaded);
|
||||||
//
|
//
|
||||||
@ -584,5 +596,6 @@
|
|||||||
private System.Windows.Forms.Panel panel1;
|
private System.Windows.Forms.Panel panel1;
|
||||||
private System.Windows.Forms.Button toggleQueueHideBtn;
|
private System.Windows.Forms.Button toggleQueueHideBtn;
|
||||||
private LibationWinForms.GridView.ProductsDisplay productsDisplay;
|
private LibationWinForms.GridView.ProductsDisplay productsDisplay;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem closeRemoveBooksColumnToolStripMenuItem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,10 +13,27 @@ namespace LibationWinForms
|
|||||||
// this is for manual scan/import. Unrelated to auto-scan
|
// this is for manual scan/import. Unrelated to auto-scan
|
||||||
public partial class Form1
|
public partial class Form1
|
||||||
{
|
{
|
||||||
|
|
||||||
|
private ToolStripButton removeCheckedBtn = new();
|
||||||
private void Configure_ScanManual()
|
private void Configure_ScanManual()
|
||||||
{
|
{
|
||||||
this.Load += refreshImportMenu;
|
this.Load += refreshImportMenu;
|
||||||
AccountsSettingsPersister.Saved += refreshImportMenu;
|
AccountsSettingsPersister.Saved += refreshImportMenu;
|
||||||
|
|
||||||
|
#region Create and Add Tool Strip Button
|
||||||
|
removeCheckedBtn.DisplayStyle = ToolStripItemDisplayStyle.Text;
|
||||||
|
removeCheckedBtn.Name = "removeSelectedBtn";
|
||||||
|
removeCheckedBtn.Text = "Remove 0 Books";
|
||||||
|
removeCheckedBtn.AutoToolTip = false;
|
||||||
|
removeCheckedBtn.ToolTipText = "Remove checked books and series\r\nfrom Libation's database.\r\n\r\nThey will remain in your Audible account.";
|
||||||
|
removeCheckedBtn.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||||
|
removeCheckedBtn.Alignment = ToolStripItemAlignment.Left;
|
||||||
|
removeCheckedBtn.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
|
||||||
|
removeCheckedBtn.Font = new System.Drawing.Font(removeCheckedBtn.Font, System.Drawing.FontStyle.Bold);
|
||||||
|
removeCheckedBtn.Click += (_, _) => productsDisplay.RemoveCheckedBooksAsync();
|
||||||
|
removeCheckedBtn.Visible = false;
|
||||||
|
statusStrip1.Items.Insert(1, removeCheckedBtn);
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
private void refreshImportMenu(object _, EventArgs __)
|
private void refreshImportMenu(object _, EventArgs __)
|
||||||
@ -106,10 +123,37 @@ namespace LibationWinForms
|
|||||||
scanLibrariesRemovedBooks(scanAccountsDialog.CheckedAccounts.ToArray());
|
scanLibrariesRemovedBooks(scanAccountsDialog.CheckedAccounts.ToArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void scanLibrariesRemovedBooks(params Account[] accounts)
|
private async void scanLibrariesRemovedBooks(params Account[] accounts)
|
||||||
{
|
{
|
||||||
using var dialog = new RemoveBooksDialog(accounts);
|
//This action is meant to operate on the entire library.
|
||||||
dialog.ShowDialog();
|
//For removing books within a filter set, use
|
||||||
|
//Visible Books > Remove from library
|
||||||
|
filterSearchTb.Enabled = false;
|
||||||
|
productsDisplay.Filter(null);
|
||||||
|
|
||||||
|
removeCheckedBtn.Visible = true;
|
||||||
|
closeRemoveBooksColumnToolStripMenuItem.Visible = true;
|
||||||
|
await productsDisplay.ScanAndRemoveBooksAsync(accounts);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void closeRemoveBooksColumnToolStripMenuItem_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
removeCheckedBtn.Visible = false;
|
||||||
|
closeRemoveBooksColumnToolStripMenuItem.Visible = false;
|
||||||
|
productsDisplay.CloseRemoveBooksColumn();
|
||||||
|
|
||||||
|
//Restore the filter
|
||||||
|
filterSearchTb.Enabled = true;
|
||||||
|
performFilter(filterSearchTb.Text);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void productsDisplay_RemovableCountChanged(object sender, int removeCount)
|
||||||
|
{
|
||||||
|
removeCheckedBtn.Text = removeCount switch
|
||||||
|
{
|
||||||
|
1 => "Remove 1 Book",
|
||||||
|
_ => $"Remove {removeCount} Books"
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task scanLibrariesAsync(IEnumerable<Account> accounts) => await scanLibrariesAsync(accounts.ToArray());
|
private async Task scanLibrariesAsync(IEnumerable<Account> accounts) => await scanLibrariesAsync(accounts.ToArray());
|
||||||
|
|||||||
@ -14,6 +14,9 @@ namespace LibationWinForms
|
|||||||
|
|
||||||
private void LibraryCommands_ScanBegin(object sender, int accountsLength)
|
private void LibraryCommands_ScanBegin(object sender, int accountsLength)
|
||||||
{
|
{
|
||||||
|
removeLibraryBooksToolStripMenuItem.Enabled = false;
|
||||||
|
removeAllAccountsToolStripMenuItem.Enabled = false;
|
||||||
|
removeSomeAccountsToolStripMenuItem.Enabled = false;
|
||||||
scanLibraryToolStripMenuItem.Enabled = false;
|
scanLibraryToolStripMenuItem.Enabled = false;
|
||||||
scanLibraryOfAllAccountsToolStripMenuItem.Enabled = false;
|
scanLibraryOfAllAccountsToolStripMenuItem.Enabled = false;
|
||||||
scanLibraryOfSomeAccountsToolStripMenuItem.Enabled = false;
|
scanLibraryOfSomeAccountsToolStripMenuItem.Enabled = false;
|
||||||
@ -27,6 +30,9 @@ namespace LibationWinForms
|
|||||||
|
|
||||||
private void LibraryCommands_ScanEnd(object sender, EventArgs e)
|
private void LibraryCommands_ScanEnd(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
removeLibraryBooksToolStripMenuItem.Enabled = true;
|
||||||
|
removeAllAccountsToolStripMenuItem.Enabled = true;
|
||||||
|
removeSomeAccountsToolStripMenuItem.Enabled = true;
|
||||||
scanLibraryToolStripMenuItem.Enabled = true;
|
scanLibraryToolStripMenuItem.Enabled = true;
|
||||||
scanLibraryOfAllAccountsToolStripMenuItem.Enabled = true;
|
scanLibraryOfAllAccountsToolStripMenuItem.Enabled = true;
|
||||||
scanLibraryOfSomeAccountsToolStripMenuItem.Enabled = true;
|
scanLibraryOfSomeAccountsToolStripMenuItem.Enabled = true;
|
||||||
|
|||||||
@ -57,48 +57,12 @@
|
|||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<metadata name="filterHelpBtn.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="filterBtn.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="filterSearchTb.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
<metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
<value>17, 17</value>
|
<value>17, 17</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
<metadata name="menuStrip1.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
<value>132, 17</value>
|
<value>132, 17</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
<metadata name="statusStrip1.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="addQuickFilterBtn.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="splitContainer1.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="panel1.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="productsDisplay.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="toggleQueueHideBtn.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="processBookQueue1.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
|
|||||||
@ -12,6 +12,12 @@ using System.Linq;
|
|||||||
|
|
||||||
namespace LibationWinForms.GridView
|
namespace LibationWinForms.GridView
|
||||||
{
|
{
|
||||||
|
public enum RemoveStatus
|
||||||
|
{
|
||||||
|
NotRemoved,
|
||||||
|
Removed,
|
||||||
|
SomeRemoved
|
||||||
|
}
|
||||||
/// <summary>The View Model base for the DataGridView</summary>
|
/// <summary>The View Model base for the DataGridView</summary>
|
||||||
public abstract class GridEntry : AsyncNotifyPropertyChanged, IMemberComparable
|
public abstract class GridEntry : AsyncNotifyPropertyChanged, IMemberComparable
|
||||||
{
|
{
|
||||||
@ -24,6 +30,9 @@ namespace LibationWinForms.GridView
|
|||||||
|
|
||||||
#region Model properties exposed to the view
|
#region Model properties exposed to the view
|
||||||
|
|
||||||
|
protected RemoveStatus _remove = RemoveStatus.NotRemoved;
|
||||||
|
public abstract RemoveStatus Remove { get; set; }
|
||||||
|
|
||||||
public abstract LiberateButtonStatus Liberate { get; }
|
public abstract LiberateButtonStatus Liberate { get; }
|
||||||
public Image Cover
|
public Image Cover
|
||||||
{
|
{
|
||||||
|
|||||||
@ -20,6 +20,20 @@ namespace LibationWinForms.GridView
|
|||||||
private LiberatedStatus _bookStatus;
|
private LiberatedStatus _bookStatus;
|
||||||
private LiberatedStatus? _pdfStatus;
|
private LiberatedStatus? _pdfStatus;
|
||||||
|
|
||||||
|
public override RemoveStatus Remove
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _remove;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_remove = value is RemoveStatus.SomeRemoved ? RemoveStatus.NotRemoved : value;
|
||||||
|
Parent?.ChildRemoveUpdate();
|
||||||
|
NotifyPropertyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override LiberateButtonStatus Liberate
|
public override LiberateButtonStatus Liberate
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
|||||||
@ -39,11 +39,12 @@
|
|||||||
this.productsGrid.Name = "productsGrid";
|
this.productsGrid.Name = "productsGrid";
|
||||||
this.productsGrid.Size = new System.Drawing.Size(1510, 380);
|
this.productsGrid.Size = new System.Drawing.Size(1510, 380);
|
||||||
this.productsGrid.TabIndex = 0;
|
this.productsGrid.TabIndex = 0;
|
||||||
|
this.productsGrid.VisibleCountChanged += new System.EventHandler<int>(this.productsGrid_VisibleCountChanged);
|
||||||
this.productsGrid.LiberateClicked += new LibationWinForms.GridView.LibraryBookEntryClickedEventHandler(this.productsGrid_LiberateClicked);
|
this.productsGrid.LiberateClicked += new LibationWinForms.GridView.LibraryBookEntryClickedEventHandler(this.productsGrid_LiberateClicked);
|
||||||
this.productsGrid.CoverClicked += new LibationWinForms.GridView.GridEntryClickedEventHandler(this.productsGrid_CoverClicked);
|
this.productsGrid.CoverClicked += new LibationWinForms.GridView.GridEntryClickedEventHandler(this.productsGrid_CoverClicked);
|
||||||
this.productsGrid.DetailsClicked += new LibationWinForms.GridView.LibraryBookEntryClickedEventHandler(this.productsGrid_DetailsClicked);
|
this.productsGrid.DetailsClicked += new LibationWinForms.GridView.LibraryBookEntryClickedEventHandler(this.productsGrid_DetailsClicked);
|
||||||
this.productsGrid.DescriptionClicked += new LibationWinForms.GridView.GridEntryRectangleClickedEventHandler(this.productsGrid_DescriptionClicked);
|
this.productsGrid.DescriptionClicked += new LibationWinForms.GridView.GridEntryRectangleClickedEventHandler(this.productsGrid_DescriptionClicked);
|
||||||
this.productsGrid.VisibleCountChanged += new System.EventHandler<int>(this.productsGrid_VisibleCountChanged);
|
this.productsGrid.RemovableCountChanged += new LibationWinForms.GridView.GridEntryClickedEventHandler(this.productsGrid_RemovableCountChanged);
|
||||||
//
|
//
|
||||||
// ProductsDisplay
|
// ProductsDisplay
|
||||||
//
|
//
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
using ApplicationServices;
|
using ApplicationServices;
|
||||||
|
using AudibleUtilities;
|
||||||
using DataLayer;
|
using DataLayer;
|
||||||
using FileLiberator;
|
using FileLiberator;
|
||||||
using LibationFileManager;
|
using LibationFileManager;
|
||||||
@ -16,6 +17,7 @@ namespace LibationWinForms.GridView
|
|||||||
{
|
{
|
||||||
/// <summary>Number of visible rows has changed</summary>
|
/// <summary>Number of visible rows has changed</summary>
|
||||||
public event EventHandler<int> VisibleCountChanged;
|
public event EventHandler<int> VisibleCountChanged;
|
||||||
|
public event EventHandler<int> RemovableCountChanged;
|
||||||
public event EventHandler<LibraryBook> LiberateClicked;
|
public event EventHandler<LibraryBook> LiberateClicked;
|
||||||
public event EventHandler InitialLoaded;
|
public event EventHandler InitialLoaded;
|
||||||
|
|
||||||
@ -82,6 +84,61 @@ namespace LibationWinForms.GridView
|
|||||||
|
|
||||||
#region UI display functions
|
#region UI display functions
|
||||||
|
|
||||||
|
public void CloseRemoveBooksColumn()
|
||||||
|
=> productsGrid.RemoveColumnVisible = false;
|
||||||
|
|
||||||
|
public async void RemoveCheckedBooksAsync()
|
||||||
|
{
|
||||||
|
var selectedBooks = productsGrid.GetAllBookEntries().Where(lbe => lbe.Remove is RemoveStatus.Removed).ToList();
|
||||||
|
|
||||||
|
if (selectedBooks.Count == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var libraryBooks = selectedBooks.Select(rge => rge.LibraryBook).ToList();
|
||||||
|
var result = MessageBoxLib.ShowConfirmationDialog(
|
||||||
|
libraryBooks,
|
||||||
|
$"Are you sure you want to remove {selectedBooks.Count} books from Libation's library?",
|
||||||
|
"Remove books from Libation?");
|
||||||
|
|
||||||
|
if (result != DialogResult.Yes)
|
||||||
|
return;
|
||||||
|
|
||||||
|
productsGrid.RemoveBooks(selectedBooks);
|
||||||
|
var idsToRemove = libraryBooks.Select(lb => lb.Book.AudibleProductId).ToList();
|
||||||
|
var removeLibraryBooks = await LibraryCommands.RemoveBooksAsync(idsToRemove);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task ScanAndRemoveBooksAsync(params Account[] accounts)
|
||||||
|
{
|
||||||
|
RemovableCountChanged?.Invoke(this, 0);
|
||||||
|
productsGrid.RemoveColumnVisible = true;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (accounts is null || accounts.Length == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var allBooks = productsGrid.GetAllBookEntries();
|
||||||
|
var lib = allBooks.Select(lbe => lbe.LibraryBook);
|
||||||
|
var removedBooks = await LibraryCommands.FindInactiveBooks(Login.WinformLoginChoiceEager.ApiExtendedFunc, lib, accounts);
|
||||||
|
|
||||||
|
var removable = allBooks.Where(lbe => removedBooks.Any(rb => rb.Book.AudibleProductId == lbe.AudibleProductId)).ToList();
|
||||||
|
|
||||||
|
foreach (var r in removable)
|
||||||
|
r.Remove = RemoveStatus.Removed;
|
||||||
|
|
||||||
|
productsGrid_RemovableCountChanged(null);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
MessageBoxLib.ShowAdminAlert(
|
||||||
|
this,
|
||||||
|
"Error scanning library. You may still manually select books to remove from Libation's library.",
|
||||||
|
"Error scanning library",
|
||||||
|
ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void Display()
|
public void Display()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@ -125,5 +182,10 @@ namespace LibationWinForms.GridView
|
|||||||
{
|
{
|
||||||
LiberateClicked?.Invoke(this, liveGridEntry.LibraryBook);
|
LiberateClicked?.Invoke(this, liveGridEntry.LibraryBook);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void productsGrid_RemovableCountChanged(GridEntry liveGridEntry)
|
||||||
|
{
|
||||||
|
RemovableCountChanged?.Invoke(this, productsGrid.GetAllBookEntries().Count(lbe => lbe.Remove is RemoveStatus.Removed));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,8 +29,9 @@
|
|||||||
private void InitializeComponent()
|
private void InitializeComponent()
|
||||||
{
|
{
|
||||||
this.components = new System.ComponentModel.Container();
|
this.components = new System.ComponentModel.Container();
|
||||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();
|
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||||
this.gridEntryDataGridView = new System.Windows.Forms.DataGridView();
|
this.gridEntryDataGridView = new System.Windows.Forms.DataGridView();
|
||||||
|
this.removeGVColumn = new System.Windows.Forms.DataGridViewCheckBoxColumn();
|
||||||
this.liberateGVColumn = new LibationWinForms.GridView.LiberateDataGridViewImageButtonColumn();
|
this.liberateGVColumn = new LibationWinForms.GridView.LiberateDataGridViewImageButtonColumn();
|
||||||
this.coverGVColumn = new System.Windows.Forms.DataGridViewImageColumn();
|
this.coverGVColumn = new System.Windows.Forms.DataGridViewImageColumn();
|
||||||
this.titleGVColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
this.titleGVColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||||
@ -60,6 +61,7 @@
|
|||||||
this.gridEntryDataGridView.AutoGenerateColumns = false;
|
this.gridEntryDataGridView.AutoGenerateColumns = false;
|
||||||
this.gridEntryDataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
|
this.gridEntryDataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
|
||||||
this.gridEntryDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
|
this.gridEntryDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
|
||||||
|
this.removeGVColumn,
|
||||||
this.liberateGVColumn,
|
this.liberateGVColumn,
|
||||||
this.coverGVColumn,
|
this.coverGVColumn,
|
||||||
this.titleGVColumn,
|
this.titleGVColumn,
|
||||||
@ -76,25 +78,39 @@
|
|||||||
this.tagAndDetailsGVColumn});
|
this.tagAndDetailsGVColumn});
|
||||||
this.gridEntryDataGridView.ContextMenuStrip = this.contextMenuStrip1;
|
this.gridEntryDataGridView.ContextMenuStrip = this.contextMenuStrip1;
|
||||||
this.gridEntryDataGridView.DataSource = this.syncBindingSource;
|
this.gridEntryDataGridView.DataSource = this.syncBindingSource;
|
||||||
dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
|
dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
|
||||||
dataGridViewCellStyle2.BackColor = System.Drawing.SystemColors.Window;
|
dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Window;
|
||||||
dataGridViewCellStyle2.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
|
dataGridViewCellStyle1.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
|
||||||
dataGridViewCellStyle2.ForeColor = System.Drawing.SystemColors.ControlText;
|
dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.ControlText;
|
||||||
dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight;
|
dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight;
|
||||||
dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
|
dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
|
||||||
dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
|
dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
|
||||||
this.gridEntryDataGridView.DefaultCellStyle = dataGridViewCellStyle2;
|
this.gridEntryDataGridView.DefaultCellStyle = dataGridViewCellStyle1;
|
||||||
this.gridEntryDataGridView.Dock = System.Windows.Forms.DockStyle.Fill;
|
this.gridEntryDataGridView.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
this.gridEntryDataGridView.Location = new System.Drawing.Point(0, 0);
|
this.gridEntryDataGridView.Location = new System.Drawing.Point(0, 0);
|
||||||
this.gridEntryDataGridView.Name = "gridEntryDataGridView";
|
this.gridEntryDataGridView.Name = "gridEntryDataGridView";
|
||||||
this.gridEntryDataGridView.ReadOnly = true;
|
|
||||||
this.gridEntryDataGridView.RowHeadersVisible = false;
|
this.gridEntryDataGridView.RowHeadersVisible = false;
|
||||||
this.gridEntryDataGridView.RowTemplate.Height = 82;
|
this.gridEntryDataGridView.RowTemplate.Height = 82;
|
||||||
this.gridEntryDataGridView.Size = new System.Drawing.Size(1510, 380);
|
this.gridEntryDataGridView.Size = new System.Drawing.Size(1570, 380);
|
||||||
this.gridEntryDataGridView.TabIndex = 0;
|
this.gridEntryDataGridView.TabIndex = 0;
|
||||||
this.gridEntryDataGridView.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.DataGridView_CellContentClick);
|
this.gridEntryDataGridView.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.DataGridView_CellContentClick);
|
||||||
this.gridEntryDataGridView.CellToolTipTextNeeded += new System.Windows.Forms.DataGridViewCellToolTipTextNeededEventHandler(this.gridEntryDataGridView_CellToolTipTextNeeded);
|
this.gridEntryDataGridView.CellToolTipTextNeeded += new System.Windows.Forms.DataGridViewCellToolTipTextNeededEventHandler(this.gridEntryDataGridView_CellToolTipTextNeeded);
|
||||||
//
|
//
|
||||||
|
// removeGVColumn
|
||||||
|
//
|
||||||
|
this.removeGVColumn.DataPropertyName = "Remove";
|
||||||
|
this.removeGVColumn.FalseValue = "";
|
||||||
|
this.removeGVColumn.Frozen = true;
|
||||||
|
this.removeGVColumn.HeaderText = "Remove";
|
||||||
|
this.removeGVColumn.IndeterminateValue = "";
|
||||||
|
this.removeGVColumn.MinimumWidth = 60;
|
||||||
|
this.removeGVColumn.Name = "removeGVColumn";
|
||||||
|
this.removeGVColumn.Resizable = System.Windows.Forms.DataGridViewTriState.False;
|
||||||
|
this.removeGVColumn.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic;
|
||||||
|
this.removeGVColumn.ThreeState = true;
|
||||||
|
this.removeGVColumn.TrueValue = "";
|
||||||
|
this.removeGVColumn.Width = 60;
|
||||||
|
//
|
||||||
// liberateGVColumn
|
// liberateGVColumn
|
||||||
//
|
//
|
||||||
this.liberateGVColumn.DataPropertyName = "Liberate";
|
this.liberateGVColumn.DataPropertyName = "Liberate";
|
||||||
@ -223,7 +239,7 @@
|
|||||||
this.AutoScroll = true;
|
this.AutoScroll = true;
|
||||||
this.Controls.Add(this.gridEntryDataGridView);
|
this.Controls.Add(this.gridEntryDataGridView);
|
||||||
this.Name = "ProductsGrid";
|
this.Name = "ProductsGrid";
|
||||||
this.Size = new System.Drawing.Size(1510, 380);
|
this.Size = new System.Drawing.Size(1570, 380);
|
||||||
this.Load += new System.EventHandler(this.ProductsGrid_Load);
|
this.Load += new System.EventHandler(this.ProductsGrid_Load);
|
||||||
((System.ComponentModel.ISupportInitialize)(this.gridEntryDataGridView)).EndInit();
|
((System.ComponentModel.ISupportInitialize)(this.gridEntryDataGridView)).EndInit();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.syncBindingSource)).EndInit();
|
((System.ComponentModel.ISupportInitialize)(this.syncBindingSource)).EndInit();
|
||||||
@ -235,6 +251,8 @@
|
|||||||
#endregion
|
#endregion
|
||||||
private System.Windows.Forms.DataGridView gridEntryDataGridView;
|
private System.Windows.Forms.DataGridView gridEntryDataGridView;
|
||||||
private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
|
private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
|
||||||
|
private SyncBindingSource syncBindingSource;
|
||||||
|
private System.Windows.Forms.DataGridViewCheckBoxColumn removeGVColumn;
|
||||||
private LiberateDataGridViewImageButtonColumn liberateGVColumn;
|
private LiberateDataGridViewImageButtonColumn liberateGVColumn;
|
||||||
private System.Windows.Forms.DataGridViewImageColumn coverGVColumn;
|
private System.Windows.Forms.DataGridViewImageColumn coverGVColumn;
|
||||||
private System.Windows.Forms.DataGridViewTextBoxColumn titleGVColumn;
|
private System.Windows.Forms.DataGridViewTextBoxColumn titleGVColumn;
|
||||||
@ -249,6 +267,5 @@
|
|||||||
private System.Windows.Forms.DataGridViewTextBoxColumn myRatingGVColumn;
|
private System.Windows.Forms.DataGridViewTextBoxColumn myRatingGVColumn;
|
||||||
private System.Windows.Forms.DataGridViewTextBoxColumn miscGVColumn;
|
private System.Windows.Forms.DataGridViewTextBoxColumn miscGVColumn;
|
||||||
private EditTagsDataGridViewImageButtonColumn tagAndDetailsGVColumn;
|
private EditTagsDataGridViewImageButtonColumn tagAndDetailsGVColumn;
|
||||||
private SyncBindingSource syncBindingSource;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,12 +23,15 @@ namespace LibationWinForms.GridView
|
|||||||
public event LibraryBookEntryClickedEventHandler DetailsClicked;
|
public event LibraryBookEntryClickedEventHandler DetailsClicked;
|
||||||
public event GridEntryRectangleClickedEventHandler DescriptionClicked;
|
public event GridEntryRectangleClickedEventHandler DescriptionClicked;
|
||||||
public new event EventHandler<ScrollEventArgs> Scroll;
|
public new event EventHandler<ScrollEventArgs> Scroll;
|
||||||
|
public event GridEntryClickedEventHandler RemovableCountChanged;
|
||||||
|
|
||||||
private GridEntryBindingList bindingList;
|
private GridEntryBindingList bindingList;
|
||||||
internal IEnumerable<LibraryBook> GetVisibleBooks()
|
internal IEnumerable<LibraryBook> GetVisibleBooks()
|
||||||
=> bindingList
|
=> bindingList
|
||||||
.BookEntries()
|
.BookEntries()
|
||||||
.Select(lbe => lbe.LibraryBook);
|
.Select(lbe => lbe.LibraryBook);
|
||||||
|
internal IEnumerable<LibraryBookEntry> GetAllBookEntries()
|
||||||
|
=> bindingList.AllItems().BookEntries();
|
||||||
|
|
||||||
public ProductsGrid()
|
public ProductsGrid()
|
||||||
{
|
{
|
||||||
@ -81,6 +84,12 @@ namespace LibationWinForms.GridView
|
|||||||
else if (e.ColumnIndex == coverGVColumn.Index)
|
else if (e.ColumnIndex == coverGVColumn.Index)
|
||||||
CoverClicked?.Invoke(sEntry);
|
CoverClicked?.Invoke(sEntry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (e.ColumnIndex == removeGVColumn.Index)
|
||||||
|
{
|
||||||
|
gridEntryDataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
|
||||||
|
RemovableCountChanged?.Invoke(entry);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private GridEntry getGridEntry(int rowIndex) => gridEntryDataGridView.GetBoundItem<GridEntry>(rowIndex);
|
private GridEntry getGridEntry(int rowIndex) => gridEntryDataGridView.GetBoundItem<GridEntry>(rowIndex);
|
||||||
@ -89,6 +98,20 @@ namespace LibationWinForms.GridView
|
|||||||
|
|
||||||
#region UI display functions
|
#region UI display functions
|
||||||
|
|
||||||
|
internal bool RemoveColumnVisible
|
||||||
|
{
|
||||||
|
get => removeGVColumn.Visible;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value)
|
||||||
|
{
|
||||||
|
foreach (var book in bindingList.AllItems())
|
||||||
|
book.Remove = RemoveStatus.NotRemoved;
|
||||||
|
}
|
||||||
|
removeGVColumn.Visible = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
internal void BindToGrid(List<LibraryBook> dbBooks)
|
internal void BindToGrid(List<LibraryBook> dbBooks)
|
||||||
{
|
{
|
||||||
var geList = dbBooks.Where(lb => lb.Book.IsProduct()).Select(b => new LibraryBookEntry(b)).Cast<GridEntry>().ToList();
|
var geList = dbBooks.Where(lb => lb.Book.IsProduct()).Select(b => new LibraryBookEntry(b)).Cast<GridEntry>().ToList();
|
||||||
@ -153,6 +176,11 @@ namespace LibationWinForms.GridView
|
|||||||
.BookEntries()
|
.BookEntries()
|
||||||
.ExceptBy(dbBooks.Select(lb => lb.Book.AudibleProductId), ge => ge.AudibleProductId);
|
.ExceptBy(dbBooks.Select(lb => lb.Book.AudibleProductId), ge => ge.AudibleProductId);
|
||||||
|
|
||||||
|
RemoveBooks(removedBooks);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveBooks(IEnumerable<LibraryBookEntry> removedBooks)
|
||||||
|
{
|
||||||
//Remove books in series from their parents' Children list
|
//Remove books in series from their parents' Children list
|
||||||
foreach (var removed in removedBooks.Where(b => b.Parent is not null))
|
foreach (var removed in removedBooks.Where(b => b.Parent is not null))
|
||||||
{
|
{
|
||||||
@ -312,6 +340,14 @@ namespace LibationWinForms.GridView
|
|||||||
|
|
||||||
column.DisplayIndex = displayIndices.GetValueOrDefault(itemName, column.Index);
|
column.DisplayIndex = displayIndices.GetValueOrDefault(itemName, column.Index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Remove column is always first;
|
||||||
|
removeGVColumn.DisplayIndex = 0;
|
||||||
|
removeGVColumn.Visible = false;
|
||||||
|
removeGVColumn.ValueType = typeof(RemoveStatus);
|
||||||
|
removeGVColumn.FalseValue = RemoveStatus.NotRemoved;
|
||||||
|
removeGVColumn.TrueValue = RemoveStatus.Removed;
|
||||||
|
removeGVColumn.IndeterminateValue = RemoveStatus.SomeRemoved;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HideMenuItem_Click(object sender, EventArgs e)
|
private void HideMenuItem_Click(object sender, EventArgs e)
|
||||||
|
|||||||
@ -57,16 +57,13 @@
|
|||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
|
<metadata name="removeGVColumn.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>True</value>
|
||||||
|
</metadata>
|
||||||
<metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
<metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
<value>171, 17</value>
|
<value>171, 17</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
<metadata name="syncBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
<metadata name="syncBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
<value>17, 17</value>
|
<value>17, 17</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
<metadata name="bindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
|
||||||
<value>326, 17</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="bindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
|
||||||
<value>326, 17</value>
|
|
||||||
</metadata>
|
|
||||||
</root>
|
</root>
|
||||||
@ -13,7 +13,43 @@ namespace LibationWinForms.GridView
|
|||||||
[Browsable(false)] public List<LibraryBookEntry> Children { get; }
|
[Browsable(false)] public List<LibraryBookEntry> Children { get; }
|
||||||
[Browsable(false)] public override DateTime DateAdded => Children.Max(c => c.DateAdded);
|
[Browsable(false)] public override DateTime DateAdded => Children.Max(c => c.DateAdded);
|
||||||
|
|
||||||
|
private bool suspendCounting = false;
|
||||||
|
public void ChildRemoveUpdate()
|
||||||
|
{
|
||||||
|
if (suspendCounting) return;
|
||||||
|
|
||||||
|
var removeCount = Children.Count(c => c.Remove is RemoveStatus.Removed);
|
||||||
|
|
||||||
|
if (removeCount == 0)
|
||||||
|
_remove = RemoveStatus.NotRemoved;
|
||||||
|
else if (removeCount == Children.Count)
|
||||||
|
_remove = RemoveStatus.Removed;
|
||||||
|
else
|
||||||
|
_remove = RemoveStatus.SomeRemoved;
|
||||||
|
NotifyPropertyChanged(nameof(Remove));
|
||||||
|
}
|
||||||
|
|
||||||
#region Model properties exposed to the view
|
#region Model properties exposed to the view
|
||||||
|
public override RemoveStatus Remove
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _remove;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_remove = value is RemoveStatus.SomeRemoved ? RemoveStatus.NotRemoved : value;
|
||||||
|
|
||||||
|
suspendCounting = true;
|
||||||
|
|
||||||
|
foreach (var item in Children)
|
||||||
|
item.Remove = value;
|
||||||
|
|
||||||
|
suspendCounting = false;
|
||||||
|
|
||||||
|
NotifyPropertyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override LiberateButtonStatus Liberate { get; }
|
public override LiberateButtonStatus Liberate { get; }
|
||||||
public override string DisplayTags { get; } = string.Empty;
|
public override string DisplayTags { get; } = string.Empty;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user