194 lines
5.6 KiB
C#
194 lines
5.6 KiB
C#
using AudibleApi.Common;
|
|
using DataLayer;
|
|
using Dinah.Core;
|
|
using System.ComponentModel;
|
|
using System.Windows.Forms;
|
|
using System;
|
|
using Dinah.Core.WindowsDesktop.Forms;
|
|
using LibationWinForms.GridView;
|
|
using LibationFileManager;
|
|
using LibationUiBase.SeriesView;
|
|
using System.Drawing;
|
|
|
|
namespace LibationWinForms.SeriesView
|
|
{
|
|
public partial class SeriesViewDialog : Form
|
|
{
|
|
private readonly LibraryBook LibraryBook;
|
|
|
|
public SeriesViewDialog()
|
|
{
|
|
InitializeComponent();
|
|
this.RestoreSizeAndLocation(Configuration.Instance);
|
|
this.SetLibationIcon();
|
|
|
|
Load += SeriesViewDialog_Load;
|
|
FormClosing += (_, _) => this.SaveSizeAndLocation(Configuration.Instance);
|
|
}
|
|
|
|
public SeriesViewDialog(LibraryBook libraryBook) : this()
|
|
{
|
|
LibraryBook = ArgumentValidator.EnsureNotNull(libraryBook, "libraryBook");
|
|
}
|
|
|
|
private async void SeriesViewDialog_Load(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
var seriesEntries = await SeriesItem.GetAllSeriesItemsAsync(LibraryBook);
|
|
|
|
//Create a DataGridView for each series and add all children of that series to it.
|
|
foreach (var series in seriesEntries.Keys)
|
|
{
|
|
var dgv = createNewSeriesGrid();
|
|
dgv.CellContentClick += Dgv_CellContentClick;
|
|
dgv.DataSource = new SeriesEntryBindingList(seriesEntries[series]);
|
|
dgv.BindingContextChanged += (_, _) => dgv.Sort(dgv.Columns["Order"], ListSortDirection.Ascending);
|
|
|
|
var tab = new TabPage { Text = series.Title };
|
|
tab.Controls.Add(dgv);
|
|
tab.VisibleChanged += (_, _) => dgv.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
|
|
tabControl1.Controls.Add(tab);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Serilog.Log.Logger.Error(ex, "Error loading searies info");
|
|
|
|
var tab = new TabPage { Text = "ERROR" };
|
|
tab.Controls.Add(new Label { Text = "ERROR LOADING SERIES INFO\r\n\r\n" + ex.Message, ForeColor = Color.Red, Dock = DockStyle.Fill });
|
|
tabControl1.Controls.Add(tab);
|
|
}
|
|
}
|
|
|
|
private ImageDisplay imageDisplay;
|
|
|
|
private async void Dgv_CellContentClick(object sender, DataGridViewCellEventArgs e)
|
|
{
|
|
if (e.RowIndex < 0) return;
|
|
|
|
var dgv = (DataGridView)sender;
|
|
var sentry = dgv.GetBoundItem<SeriesItem>(e.RowIndex);
|
|
|
|
if (dgv.Columns[e.ColumnIndex].DataPropertyName == nameof(SeriesItem.Cover))
|
|
{
|
|
coverClicked(sentry.Item);
|
|
return;
|
|
}
|
|
else if (dgv.Columns[e.ColumnIndex].DataPropertyName == nameof(SeriesItem.Title))
|
|
{
|
|
sentry.ViewOnAudible(LibraryBook.Book.Locale);
|
|
return;
|
|
}
|
|
else if (dgv.Columns[e.ColumnIndex].DataPropertyName == nameof(SeriesItem.Button) && sentry.Button.HasButtonAction)
|
|
{
|
|
await sentry.Button.PerformClickAsync(LibraryBook);
|
|
}
|
|
}
|
|
|
|
private void coverClicked(Item libraryBook)
|
|
{
|
|
var picDef = new PictureDefinition(libraryBook.PictureLarge ?? libraryBook.PictureId, PictureSize.Native);
|
|
|
|
void PictureCached(object sender, PictureCachedEventArgs e)
|
|
{
|
|
if (e.Definition.PictureId == picDef.PictureId)
|
|
imageDisplay.SetCoverArt(e.Picture);
|
|
|
|
PictureStorage.PictureCached -= PictureCached;
|
|
}
|
|
|
|
PictureStorage.PictureCached += PictureCached;
|
|
(bool isDefault, byte[] initialImageBts) = PictureStorage.GetPicture(picDef);
|
|
|
|
var windowTitle = $"{libraryBook.Title} - Cover";
|
|
|
|
if (imageDisplay is null || imageDisplay.IsDisposed || !imageDisplay.Visible)
|
|
{
|
|
imageDisplay = new ImageDisplay();
|
|
imageDisplay.RestoreSizeAndLocation(Configuration.Instance);
|
|
imageDisplay.FormClosed += (_, _) => imageDisplay.SaveSizeAndLocation(Configuration.Instance);
|
|
}
|
|
|
|
imageDisplay.Text = windowTitle;
|
|
imageDisplay.SetCoverArt(initialImageBts);
|
|
if (!isDefault)
|
|
PictureStorage.PictureCached -= PictureCached;
|
|
|
|
if (!imageDisplay.Visible)
|
|
imageDisplay.Show();
|
|
}
|
|
|
|
private static DataGridView createNewSeriesGrid()
|
|
{
|
|
var dgv = new DataGridView
|
|
{
|
|
Dock = DockStyle.Fill,
|
|
RowHeadersVisible = false,
|
|
ReadOnly = false,
|
|
ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize,
|
|
AllowUserToAddRows = false,
|
|
AllowUserToDeleteRows = false,
|
|
AllowUserToResizeRows = false,
|
|
AutoGenerateColumns = false
|
|
};
|
|
|
|
dgv.RowTemplate.Height = 80;
|
|
|
|
dgv.Columns.Add(new DataGridViewImageColumn
|
|
{
|
|
DataPropertyName = nameof(SeriesItem.Cover),
|
|
HeaderText = "Cover",
|
|
Name = "Cover",
|
|
ReadOnly = true,
|
|
Resizable = DataGridViewTriState.False,
|
|
Width = 80
|
|
});
|
|
dgv.Columns.Add(new DataGridViewTextBoxColumn
|
|
{
|
|
DataPropertyName = nameof(SeriesItem.Order),
|
|
HeaderText = "Series\r\nOrder",
|
|
Name = "Order",
|
|
ReadOnly = true,
|
|
SortMode = DataGridViewColumnSortMode.Automatic,
|
|
Width = 50
|
|
});
|
|
dgv.Columns.Add(new DownloadButtonColumn
|
|
{
|
|
DataPropertyName = nameof(SeriesItem.Button),
|
|
HeaderText = "Availability",
|
|
Name = "DownloadButton",
|
|
ReadOnly = true,
|
|
SortMode = DataGridViewColumnSortMode.Automatic,
|
|
Width = 50
|
|
});
|
|
dgv.Columns.Add(new DataGridViewLinkColumn
|
|
{
|
|
DataPropertyName = nameof(SeriesItem.Title),
|
|
HeaderText = "Title",
|
|
Name = "Title",
|
|
ReadOnly = true,
|
|
TrackVisitedState = true,
|
|
SortMode = DataGridViewColumnSortMode.Automatic,
|
|
Width = 200,
|
|
});
|
|
|
|
dgv.CellToolTipTextNeeded += Dgv_CellToolTipTextNeeded;
|
|
|
|
return dgv;
|
|
}
|
|
|
|
private static void Dgv_CellToolTipTextNeeded(object sender, DataGridViewCellToolTipTextNeededEventArgs e)
|
|
{
|
|
if (sender is not DataGridView dgv || e.ColumnIndex < 0) return;
|
|
|
|
e.ToolTipText = dgv.Columns[e.ColumnIndex].DataPropertyName switch
|
|
{
|
|
nameof(SeriesItem.Cover) => "Click to see full size",
|
|
nameof(SeriesItem.Title) => "Open Audible product page",
|
|
_ => string.Empty
|
|
};
|
|
}
|
|
}
|
|
}
|