Add context menu to Series grid entries (#536)
This commit is contained in:
parent
99687e968e
commit
784ab73a36
@ -1,7 +1,9 @@
|
|||||||
using DataLayer;
|
using DataLayer;
|
||||||
using Dinah.Core;
|
using Dinah.Core;
|
||||||
using LibationFileManager;
|
using LibationFileManager;
|
||||||
|
using LibationUiBase.GridView;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
namespace LibationAvalonia.Views
|
namespace LibationAvalonia.Views
|
||||||
@ -48,6 +50,22 @@ namespace LibationAvalonia.Views
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void ProductsDisplay_LiberateSeriesClicked(object sender, ISeriesEntry series)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
SetQueueCollapseState(false);
|
||||||
|
|
||||||
|
Serilog.Log.Logger.Information("Begin backing up all {series} episodes", series.LibraryBook);
|
||||||
|
|
||||||
|
_viewModel.ProcessQueue.AddDownloadDecrypt(series.Children.Select(c => c.LibraryBook).UnLiberated());
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Serilog.Log.Logger.Error(ex, "An error occurred while backing up {series} episodes", series.LibraryBook);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void ProductsDisplay_ConvertToMp3Clicked(object sender, LibraryBook libraryBook)
|
public void ProductsDisplay_ConvertToMp3Clicked(object sender, LibraryBook libraryBook)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|||||||
@ -195,6 +195,7 @@
|
|||||||
Name="productsDisplay"
|
Name="productsDisplay"
|
||||||
DataContext="{Binding ProductsDisplay}"
|
DataContext="{Binding ProductsDisplay}"
|
||||||
LiberateClicked="ProductsDisplay_LiberateClicked"
|
LiberateClicked="ProductsDisplay_LiberateClicked"
|
||||||
|
LiberateSeriesClicked="ProductsDisplay_LiberateSeriesClicked"
|
||||||
ConvertToMp3Clicked="ProductsDisplay_ConvertToMp3Clicked" />
|
ConvertToMp3Clicked="ProductsDisplay_ConvertToMp3Clicked" />
|
||||||
</SplitView>
|
</SplitView>
|
||||||
</Border>
|
</Border>
|
||||||
|
|||||||
@ -20,6 +20,7 @@ namespace LibationAvalonia.Views
|
|||||||
public partial class ProductsDisplay : UserControl
|
public partial class ProductsDisplay : UserControl
|
||||||
{
|
{
|
||||||
public event EventHandler<LibraryBook> LiberateClicked;
|
public event EventHandler<LibraryBook> LiberateClicked;
|
||||||
|
public event EventHandler<ISeriesEntry> LiberateSeriesClicked;
|
||||||
public event EventHandler<LibraryBook> ConvertToMp3Clicked;
|
public event EventHandler<LibraryBook> ConvertToMp3Clicked;
|
||||||
|
|
||||||
private ProductsDisplayViewModel _viewModel => DataContext as ProductsDisplayViewModel;
|
private ProductsDisplayViewModel _viewModel => DataContext as ProductsDisplayViewModel;
|
||||||
@ -90,27 +91,74 @@ namespace LibationAvalonia.Views
|
|||||||
{
|
{
|
||||||
var entry = args.GridEntry;
|
var entry = args.GridEntry;
|
||||||
|
|
||||||
|
#region Liberate all Episodes
|
||||||
|
|
||||||
if (entry.Liberate.IsSeries)
|
if (entry.Liberate.IsSeries)
|
||||||
return;
|
{
|
||||||
|
var liberateEpisodesMenuItem = new MenuItem()
|
||||||
|
{
|
||||||
|
Header = "_Liberate All Episodes",
|
||||||
|
IsEnabled = ((ISeriesEntry)entry).Children.Any(c => c.Liberate.BookStatus is LiberatedStatus.NotLiberated or LiberatedStatus.PartialDownload)
|
||||||
|
};
|
||||||
|
|
||||||
|
args.ContextMenuItems.Add(liberateEpisodesMenuItem);
|
||||||
|
|
||||||
|
liberateEpisodesMenuItem.Click += (_, _) => LiberateSeriesClicked?.Invoke(this, ((ISeriesEntry)entry));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
#region Set Download status to Downloaded
|
||||||
|
|
||||||
var setDownloadMenuItem = new MenuItem()
|
var setDownloadMenuItem = new MenuItem()
|
||||||
{
|
{
|
||||||
Header = "Set Download status to '_Downloaded'",
|
Header = "Set Download status to '_Downloaded'",
|
||||||
IsEnabled = entry.Book.UserDefinedItem.BookStatus != LiberatedStatus.Liberated
|
IsEnabled = entry.Book.UserDefinedItem.BookStatus != LiberatedStatus.Liberated || entry.Liberate.IsSeries
|
||||||
};
|
};
|
||||||
|
|
||||||
|
args.ContextMenuItems.Add(setDownloadMenuItem);
|
||||||
|
|
||||||
|
if (entry.Liberate.IsSeries)
|
||||||
|
setDownloadMenuItem.Click += (_, __) => ((ISeriesEntry)entry).Children.Select(c => c.LibraryBook).UpdateBookStatus(LiberatedStatus.Liberated);
|
||||||
|
else
|
||||||
setDownloadMenuItem.Click += (_, __) => entry.Book.UpdateBookStatus(LiberatedStatus.Liberated);
|
setDownloadMenuItem.Click += (_, __) => entry.Book.UpdateBookStatus(LiberatedStatus.Liberated);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
#region Set Download status to Not Downloaded
|
||||||
|
|
||||||
var setNotDownloadMenuItem = new MenuItem()
|
var setNotDownloadMenuItem = new MenuItem()
|
||||||
{
|
{
|
||||||
Header = "Set Download status to '_Not Downloaded'",
|
Header = "Set Download status to '_Not Downloaded'",
|
||||||
IsEnabled = entry.Book.UserDefinedItem.BookStatus != LiberatedStatus.NotLiberated
|
IsEnabled = entry.Book.UserDefinedItem.BookStatus != LiberatedStatus.NotLiberated || entry.Liberate.IsSeries
|
||||||
};
|
};
|
||||||
|
|
||||||
|
args.ContextMenuItems.Add(setNotDownloadMenuItem);
|
||||||
|
|
||||||
|
if (entry.Liberate.IsSeries)
|
||||||
|
setNotDownloadMenuItem.Click += (_, __) => ((ISeriesEntry)entry).Children.Select(c => c.LibraryBook).UpdateBookStatus(LiberatedStatus.NotLiberated);
|
||||||
|
else
|
||||||
setNotDownloadMenuItem.Click += (_, __) => entry.Book.UpdateBookStatus(LiberatedStatus.NotLiberated);
|
setNotDownloadMenuItem.Click += (_, __) => entry.Book.UpdateBookStatus(LiberatedStatus.NotLiberated);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
#region Remove from library
|
||||||
|
|
||||||
var removeMenuItem = new MenuItem() { Header = "_Remove from library" };
|
var removeMenuItem = new MenuItem() { Header = "_Remove from library" };
|
||||||
|
|
||||||
|
args.ContextMenuItems.Add(removeMenuItem);
|
||||||
|
|
||||||
|
if (entry.Liberate.IsSeries)
|
||||||
|
removeMenuItem.Click += async (_, __) => await ((ISeriesEntry)entry).Children.Select(c => c.LibraryBook).RemoveBooksAsync();
|
||||||
|
else
|
||||||
removeMenuItem.Click += async (_, __) => await Task.Run(entry.LibraryBook.RemoveBook);
|
removeMenuItem.Click += async (_, __) => await Task.Run(entry.LibraryBook.RemoveBook);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
if (!entry.Liberate.IsSeries)
|
||||||
|
{
|
||||||
|
#region Locate file
|
||||||
var locateFileMenuItem = new MenuItem() { Header = "_Locate file..." };
|
var locateFileMenuItem = new MenuItem() { Header = "_Locate file..." };
|
||||||
|
|
||||||
|
args.ContextMenuItems.Add(locateFileMenuItem);
|
||||||
|
|
||||||
locateFileMenuItem.Click += async (_, __) =>
|
locateFileMenuItem.Click += async (_, __) =>
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@ -138,26 +186,36 @@ namespace LibationAvalonia.Views
|
|||||||
await MessageBox.ShowAdminAlert(null, msg, msg, ex);
|
await MessageBox.ShowAdminAlert(null, msg, msg, ex);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
#region Convert to Mp3
|
||||||
var convertToMp3MenuItem = new MenuItem
|
var convertToMp3MenuItem = new MenuItem
|
||||||
{
|
{
|
||||||
Header = "_Convert to Mp3",
|
Header = "_Convert to Mp3",
|
||||||
IsEnabled = entry.Book.UserDefinedItem.BookStatus is LiberatedStatus.Liberated
|
IsEnabled = entry.Book.UserDefinedItem.BookStatus is LiberatedStatus.Liberated
|
||||||
};
|
};
|
||||||
|
args.ContextMenuItems.Add(convertToMp3MenuItem);
|
||||||
|
|
||||||
convertToMp3MenuItem.Click += (_, _) => ConvertToMp3Clicked?.Invoke(this, entry.LibraryBook);
|
convertToMp3MenuItem.Click += (_, _) => ConvertToMp3Clicked?.Invoke(this, entry.LibraryBook);
|
||||||
|
|
||||||
var bookRecordMenuItem = new MenuItem { Header = "View _Bookmarks/Clips" };
|
#endregion
|
||||||
bookRecordMenuItem.Click += async (_, _) => await new BookRecordsDialog(entry.LibraryBook).ShowDialog(VisualRoot as Window);
|
}
|
||||||
|
|
||||||
args.ContextMenuItems.AddRange(new Control[]
|
args.ContextMenuItems.Add(new Separator());
|
||||||
|
|
||||||
|
#region View Bookmarks/Clips
|
||||||
|
|
||||||
|
if (!entry.Liberate.IsSeries)
|
||||||
{
|
{
|
||||||
setDownloadMenuItem,
|
|
||||||
setNotDownloadMenuItem,
|
var bookRecordMenuItem = new MenuItem { Header = "View _Bookmarks/Clips" };
|
||||||
removeMenuItem,
|
|
||||||
locateFileMenuItem,
|
args.ContextMenuItems.Add(bookRecordMenuItem);
|
||||||
convertToMp3MenuItem,
|
|
||||||
new Separator(),
|
bookRecordMenuItem.Click += async (_, _) => await new BookRecordsDialog(entry.LibraryBook).ShowDialog(VisualRoot as Window);
|
||||||
bookRecordMenuItem
|
}
|
||||||
});
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@ -62,7 +62,7 @@ namespace LibationUiBase.GridView
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected override string GetBookTags() => null;
|
protected override string GetBookTags() => null;
|
||||||
protected override int GetLengthInMinutes() => Children.Sum(c => c.LibraryBook.Book.LengthInMinutes);
|
protected override int GetLengthInMinutes() => Children.Count == 0 ? 0 : Children.Sum(c => c.LibraryBook.Book.LengthInMinutes);
|
||||||
protected override DateTime GetPurchaseDate() => Children.Min(c => c.LibraryBook.DateAdded);
|
protected override DateTime GetPurchaseDate() => Children.Count == 0 ? default : Children.Min(c => c.LibraryBook.DateAdded);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
1
Source/LibationWinForms/Form1.Designer.cs
generated
1
Source/LibationWinForms/Form1.Designer.cs
generated
@ -528,6 +528,7 @@
|
|||||||
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.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.LiberateSeriesClicked += new System.EventHandler<LibationUiBase.GridView.ISeriesEntry>(this.ProductsDisplay_LiberateSeriesClicked);
|
||||||
this.productsDisplay.ConvertToMp3Clicked += new System.EventHandler<DataLayer.LibraryBook>(this.ProductsDisplay_ConvertToMp3Clicked);
|
this.productsDisplay.ConvertToMp3Clicked += new System.EventHandler<DataLayer.LibraryBook>(this.ProductsDisplay_ConvertToMp3Clicked);
|
||||||
this.productsDisplay.InitialLoaded += new System.EventHandler(this.productsDisplay_InitialLoaded);
|
this.productsDisplay.InitialLoaded += new System.EventHandler(this.productsDisplay_InitialLoaded);
|
||||||
//
|
//
|
||||||
|
|||||||
@ -1,8 +1,10 @@
|
|||||||
using DataLayer;
|
using DataLayer;
|
||||||
using Dinah.Core;
|
using Dinah.Core;
|
||||||
using LibationFileManager;
|
using LibationFileManager;
|
||||||
|
using LibationUiBase.GridView;
|
||||||
using LibationWinForms.ProcessQueue;
|
using LibationWinForms.ProcessQueue;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
@ -56,6 +58,22 @@ namespace LibationWinForms
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ProductsDisplay_LiberateSeriesClicked(object sender, ISeriesEntry series)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
SetQueueCollapseState(false);
|
||||||
|
|
||||||
|
Serilog.Log.Logger.Information("Begin backing up all {series} episodes", series.LibraryBook);
|
||||||
|
|
||||||
|
processBookQueue1.AddDownloadDecrypt(series.Children.Select(c => c.LibraryBook).UnLiberated());
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Serilog.Log.Logger.Error(ex, "An error occurred while backing up {series} episodes", series.LibraryBook);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void ProductsDisplay_ConvertToMp3Clicked(object sender, LibraryBook libraryBook)
|
private void ProductsDisplay_ConvertToMp3Clicked(object sender, LibraryBook libraryBook)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|||||||
@ -28,35 +28,35 @@
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent()
|
private void InitializeComponent()
|
||||||
{
|
{
|
||||||
this.productsGrid = new LibationWinForms.GridView.ProductsGrid();
|
productsGrid = new ProductsGrid();
|
||||||
this.SuspendLayout();
|
SuspendLayout();
|
||||||
//
|
//
|
||||||
// productsGrid
|
// productsGrid
|
||||||
//
|
//
|
||||||
this.productsGrid.AutoScroll = true;
|
productsGrid.AutoScroll = true;
|
||||||
this.productsGrid.Dock = System.Windows.Forms.DockStyle.Fill;
|
productsGrid.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
this.productsGrid.Location = new System.Drawing.Point(0, 0);
|
productsGrid.Location = new System.Drawing.Point(0, 0);
|
||||||
this.productsGrid.Name = "productsGrid";
|
productsGrid.Name = "productsGrid";
|
||||||
this.productsGrid.Size = new System.Drawing.Size(1510, 380);
|
productsGrid.Size = new System.Drawing.Size(1510, 380);
|
||||||
this.productsGrid.TabIndex = 0;
|
productsGrid.TabIndex = 0;
|
||||||
this.productsGrid.VisibleCountChanged += new System.EventHandler<int>(this.productsGrid_VisibleCountChanged);
|
productsGrid.VisibleCountChanged += productsGrid_VisibleCountChanged;
|
||||||
this.productsGrid.LiberateClicked += new LibationWinForms.GridView.LibraryBookEntryClickedEventHandler(this.productsGrid_LiberateClicked);
|
productsGrid.LiberateClicked += productsGrid_LiberateClicked;
|
||||||
this.productsGrid.ConvertToMp3Clicked += new LibationWinForms.GridView.LibraryBookEntryClickedEventHandler(this.productsGrid_ConvertToMp3Clicked);
|
productsGrid.ConvertToMp3Clicked += productsGrid_ConvertToMp3Clicked;
|
||||||
this.productsGrid.CoverClicked += new LibationWinForms.GridView.GridEntryClickedEventHandler(this.productsGrid_CoverClicked);
|
productsGrid.CoverClicked += productsGrid_CoverClicked;
|
||||||
this.productsGrid.DetailsClicked += new LibationWinForms.GridView.LibraryBookEntryClickedEventHandler(this.productsGrid_DetailsClicked);
|
productsGrid.DetailsClicked += productsGrid_DetailsClicked;
|
||||||
this.productsGrid.DescriptionClicked += new LibationWinForms.GridView.GridEntryRectangleClickedEventHandler(this.productsGrid_DescriptionClicked);
|
productsGrid.DescriptionClicked += productsGrid_DescriptionClicked;
|
||||||
this.productsGrid.RemovableCountChanged += new System.EventHandler(this.productsGrid_RemovableCountChanged);
|
productsGrid.RemovableCountChanged += productsGrid_RemovableCountChanged;
|
||||||
|
productsGrid.LiberateContextMenuStripNeeded += productsGrid_CellContextMenuStripNeeded;
|
||||||
//
|
//
|
||||||
// ProductsDisplay
|
// ProductsDisplay
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
|
AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.Controls.Add(this.productsGrid);
|
Controls.Add(productsGrid);
|
||||||
this.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
|
Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
|
||||||
this.Name = "ProductsDisplay";
|
Name = "ProductsDisplay";
|
||||||
this.Size = new System.Drawing.Size(1510, 380);
|
Size = new System.Drawing.Size(1510, 380);
|
||||||
this.ResumeLayout(false);
|
ResumeLayout(false);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
@ -20,6 +20,7 @@ namespace LibationWinForms.GridView
|
|||||||
public event EventHandler<int> VisibleCountChanged;
|
public event EventHandler<int> VisibleCountChanged;
|
||||||
public event EventHandler<int> RemovableCountChanged;
|
public event EventHandler<int> RemovableCountChanged;
|
||||||
public event EventHandler<LibraryBook> LiberateClicked;
|
public event EventHandler<LibraryBook> LiberateClicked;
|
||||||
|
public event EventHandler<ISeriesEntry> LiberateSeriesClicked;
|
||||||
public event EventHandler<LibraryBook> ConvertToMp3Clicked;
|
public event EventHandler<LibraryBook> ConvertToMp3Clicked;
|
||||||
public event EventHandler InitialLoaded;
|
public event EventHandler InitialLoaded;
|
||||||
|
|
||||||
@ -96,6 +97,132 @@ namespace LibationWinForms.GridView
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region Cell Context Menu
|
||||||
|
|
||||||
|
private void productsGrid_CellContextMenuStripNeeded(IGridEntry entry, ContextMenuStrip ctxMenu)
|
||||||
|
{
|
||||||
|
#region Liberate all Episodes
|
||||||
|
|
||||||
|
if (entry.Liberate.IsSeries)
|
||||||
|
{
|
||||||
|
var liberateEpisodesMenuItem = new ToolStripMenuItem()
|
||||||
|
{
|
||||||
|
Text = "&Liberate All Episodes",
|
||||||
|
Enabled = ((ISeriesEntry)entry).Children.Any(c => c.Liberate.BookStatus is LiberatedStatus.NotLiberated or LiberatedStatus.PartialDownload)
|
||||||
|
};
|
||||||
|
|
||||||
|
ctxMenu.Items.Add(liberateEpisodesMenuItem);
|
||||||
|
|
||||||
|
liberateEpisodesMenuItem.Click += (_, _) => LiberateSeriesClicked?.Invoke(this, (ISeriesEntry)entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
#region Set Download status to Downloaded
|
||||||
|
|
||||||
|
var setDownloadMenuItem = new ToolStripMenuItem()
|
||||||
|
{
|
||||||
|
Text = "Set Download status to '&Downloaded'",
|
||||||
|
Enabled = entry.Book.UserDefinedItem.BookStatus != LiberatedStatus.Liberated || entry.Liberate.IsSeries
|
||||||
|
};
|
||||||
|
|
||||||
|
ctxMenu.Items.Add(setDownloadMenuItem);
|
||||||
|
|
||||||
|
if (entry.Liberate.IsSeries)
|
||||||
|
setDownloadMenuItem.Click += (_, _) => ((ISeriesEntry)entry).Children.Select(c => c.LibraryBook).UpdateBookStatus(LiberatedStatus.Liberated);
|
||||||
|
else
|
||||||
|
setDownloadMenuItem.Click += (_, _) => entry.Book.UpdateBookStatus(LiberatedStatus.Liberated);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
#region Set Download status to Not Downloaded
|
||||||
|
|
||||||
|
var setNotDownloadMenuItem = new ToolStripMenuItem()
|
||||||
|
{
|
||||||
|
Text = "Set Download status to '&Not Downloaded'",
|
||||||
|
Enabled = entry.Book.UserDefinedItem.BookStatus != LiberatedStatus.NotLiberated || entry.Liberate.IsSeries
|
||||||
|
};
|
||||||
|
|
||||||
|
ctxMenu.Items.Add(setNotDownloadMenuItem);
|
||||||
|
|
||||||
|
if (entry.Liberate.IsSeries)
|
||||||
|
setNotDownloadMenuItem.Click += (_, _) => ((ISeriesEntry)entry).Children.Select(c => c.LibraryBook).UpdateBookStatus(LiberatedStatus.NotLiberated);
|
||||||
|
else
|
||||||
|
setNotDownloadMenuItem.Click += (_, _) => entry.Book.UpdateBookStatus(LiberatedStatus.NotLiberated);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
#region Remove from library
|
||||||
|
|
||||||
|
var removeMenuItem = new ToolStripMenuItem() { Text = "&Remove from library" };
|
||||||
|
|
||||||
|
ctxMenu.Items.Add(removeMenuItem);
|
||||||
|
|
||||||
|
if (entry.Liberate.IsSeries)
|
||||||
|
removeMenuItem.Click += async (_, _) => await ((ISeriesEntry)entry).Children.Select(c => c.LibraryBook).RemoveBooksAsync();
|
||||||
|
else
|
||||||
|
removeMenuItem.Click += async (_, _) => await Task.Run(entry.LibraryBook.RemoveBook);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
if (!entry.Liberate.IsSeries)
|
||||||
|
{
|
||||||
|
#region Locate file
|
||||||
|
var locateFileMenuItem = new ToolStripMenuItem() { Text = "&Locate file..." };
|
||||||
|
|
||||||
|
ctxMenu.Items.Add(locateFileMenuItem);
|
||||||
|
|
||||||
|
locateFileMenuItem.Click += (_, _) =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var openFileDialog = new OpenFileDialog
|
||||||
|
{
|
||||||
|
Title = $"Locate the audio file for '{entry.Book.Title}'",
|
||||||
|
Filter = "All files (*.*)|*.*",
|
||||||
|
FilterIndex = 1
|
||||||
|
};
|
||||||
|
if (openFileDialog.ShowDialog() == DialogResult.OK)
|
||||||
|
FilePathCache.Insert(entry.AudibleProductId, openFileDialog.FileName);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
var msg = "Error saving book's location";
|
||||||
|
MessageBoxLib.ShowAdminAlert(this, msg, msg, ex);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
#region Convert to Mp3
|
||||||
|
|
||||||
|
var convertToMp3MenuItem = new ToolStripMenuItem
|
||||||
|
{
|
||||||
|
Text = "&Convert to Mp3",
|
||||||
|
Enabled = entry.Book.UserDefinedItem.BookStatus is LiberatedStatus.Liberated
|
||||||
|
};
|
||||||
|
|
||||||
|
ctxMenu.Items.Add(convertToMp3MenuItem);
|
||||||
|
|
||||||
|
convertToMp3MenuItem.Click += (_, e) => ConvertToMp3Clicked?.Invoke(this, entry.LibraryBook);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
|
||||||
|
ctxMenu.Items.Add(new ToolStripSeparator());
|
||||||
|
|
||||||
|
#region View Bookmarks/Clips
|
||||||
|
|
||||||
|
if (!entry.Liberate.IsSeries)
|
||||||
|
{
|
||||||
|
var bookRecordMenuItem = new ToolStripMenuItem { Text = "View &Bookmarks/Clips" };
|
||||||
|
|
||||||
|
ctxMenu.Items.Add(bookRecordMenuItem);
|
||||||
|
|
||||||
|
bookRecordMenuItem.Click += (_, _) => new BookRecordsDialog(entry.LibraryBook).ShowDialog(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region Scan and Remove Books
|
#region Scan and Remove Books
|
||||||
|
|
||||||
public void CloseRemoveBooksColumn()
|
public void CloseRemoveBooksColumn()
|
||||||
|
|||||||
@ -99,7 +99,6 @@ namespace LibationWinForms.GridView
|
|||||||
this.gridEntryDataGridView.Size = new System.Drawing.Size(1570, 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.CellContextMenuStripNeeded += new System.Windows.Forms.DataGridViewCellContextMenuStripNeededEventHandler(this.gridEntryDataGridView_CellContextMenuStripNeeded);
|
|
||||||
this.gridEntryDataGridView.CellToolTipTextNeeded += new System.Windows.Forms.DataGridViewCellToolTipTextNeededEventHandler(this.gridEntryDataGridView_CellToolTipTextNeeded);
|
this.gridEntryDataGridView.CellToolTipTextNeeded += new System.Windows.Forms.DataGridViewCellToolTipTextNeededEventHandler(this.gridEntryDataGridView_CellToolTipTextNeeded);
|
||||||
//
|
//
|
||||||
// removeGVColumn
|
// removeGVColumn
|
||||||
|
|||||||
@ -1,15 +1,12 @@
|
|||||||
using ApplicationServices;
|
using DataLayer;
|
||||||
using DataLayer;
|
|
||||||
using Dinah.Core.WindowsDesktop.Forms;
|
using Dinah.Core.WindowsDesktop.Forms;
|
||||||
using LibationFileManager;
|
using LibationFileManager;
|
||||||
using LibationUiBase.GridView;
|
using LibationUiBase.GridView;
|
||||||
using LibationWinForms.Dialogs;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
namespace LibationWinForms.GridView
|
namespace LibationWinForms.GridView
|
||||||
@ -17,6 +14,7 @@ namespace LibationWinForms.GridView
|
|||||||
public delegate void GridEntryClickedEventHandler(IGridEntry liveGridEntry);
|
public delegate void GridEntryClickedEventHandler(IGridEntry liveGridEntry);
|
||||||
public delegate void LibraryBookEntryClickedEventHandler(ILibraryBookEntry liveGridEntry);
|
public delegate void LibraryBookEntryClickedEventHandler(ILibraryBookEntry liveGridEntry);
|
||||||
public delegate void GridEntryRectangleClickedEventHandler(IGridEntry liveGridEntry, Rectangle cellRectangle);
|
public delegate void GridEntryRectangleClickedEventHandler(IGridEntry liveGridEntry, Rectangle cellRectangle);
|
||||||
|
public delegate void ProductsGridCellContextMenuStripNeededEventHandler(IGridEntry liveGridEntry, ContextMenuStrip ctxMenu);
|
||||||
|
|
||||||
public partial class ProductsGrid : UserControl
|
public partial class ProductsGrid : UserControl
|
||||||
{
|
{
|
||||||
@ -29,6 +27,7 @@ namespace LibationWinForms.GridView
|
|||||||
public event GridEntryRectangleClickedEventHandler DescriptionClicked;
|
public event GridEntryRectangleClickedEventHandler DescriptionClicked;
|
||||||
public new event EventHandler<ScrollEventArgs> Scroll;
|
public new event EventHandler<ScrollEventArgs> Scroll;
|
||||||
public event EventHandler RemovableCountChanged;
|
public event EventHandler RemovableCountChanged;
|
||||||
|
public event ProductsGridCellContextMenuStripNeededEventHandler LiberateContextMenuStripNeeded;
|
||||||
|
|
||||||
private GridEntryBindingList bindingList;
|
private GridEntryBindingList bindingList;
|
||||||
internal IEnumerable<LibraryBook> GetVisibleBooks()
|
internal IEnumerable<LibraryBook> GetVisibleBooks()
|
||||||
@ -43,9 +42,43 @@ namespace LibationWinForms.GridView
|
|||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
EnableDoubleBuffering();
|
EnableDoubleBuffering();
|
||||||
gridEntryDataGridView.Scroll += (_, s) => Scroll?.Invoke(this, s);
|
gridEntryDataGridView.Scroll += (_, s) => Scroll?.Invoke(this, s);
|
||||||
|
gridEntryDataGridView.CellContextMenuStripNeeded += GridEntryDataGridView_CellContextMenuStripNeeded;
|
||||||
removeGVColumn.Frozen = false;
|
removeGVColumn.Frozen = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void GridEntryDataGridView_CellContextMenuStripNeeded(object sender, DataGridViewCellContextMenuStripNeededEventArgs e)
|
||||||
|
{
|
||||||
|
// header
|
||||||
|
if (e.RowIndex < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// cover
|
||||||
|
else if (e.ColumnIndex == coverGVColumn.Index)
|
||||||
|
return;
|
||||||
|
|
||||||
|
e.ContextMenuStrip = new ContextMenuStrip();
|
||||||
|
// any non-stop light
|
||||||
|
if (e.ColumnIndex != liberateGVColumn.Index)
|
||||||
|
{
|
||||||
|
e.ContextMenuStrip.Items.Add("Copy", null, (_, __) =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var dgv = (DataGridView)sender;
|
||||||
|
var text = dgv[e.ColumnIndex, e.RowIndex].FormattedValue.ToString();
|
||||||
|
Clipboard.SetDataObject(text, false, 5, 150);
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var entry = getGridEntry(e.RowIndex);
|
||||||
|
var name = gridEntryDataGridView.Columns[e.ColumnIndex].DataPropertyName;
|
||||||
|
LiberateContextMenuStripNeeded?.Invoke(entry, e.ContextMenuStrip);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void EnableDoubleBuffering()
|
private void EnableDoubleBuffering()
|
||||||
{
|
{
|
||||||
var propertyInfo = gridEntryDataGridView.GetType().GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
|
var propertyInfo = gridEntryDataGridView.GetType().GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
|
||||||
@ -103,101 +136,6 @@ namespace LibationWinForms.GridView
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void gridEntryDataGridView_CellContextMenuStripNeeded(object sender, DataGridViewCellContextMenuStripNeededEventArgs e)
|
|
||||||
{
|
|
||||||
// header
|
|
||||||
if (e.RowIndex < 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// cover
|
|
||||||
if (e.ColumnIndex == coverGVColumn.Index)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// any non-stop light
|
|
||||||
if (e.ColumnIndex != liberateGVColumn.Index)
|
|
||||||
{
|
|
||||||
var copyContextMenu = new ContextMenuStrip();
|
|
||||||
copyContextMenu.Items.Add("Copy", null, (_, __) =>
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var dgv = (DataGridView)sender;
|
|
||||||
var text = dgv[e.ColumnIndex, e.RowIndex].FormattedValue.ToString();
|
|
||||||
Clipboard.SetDataObject(text, false, 5, 150);
|
|
||||||
}
|
|
||||||
catch { }
|
|
||||||
});
|
|
||||||
|
|
||||||
e.ContextMenuStrip = copyContextMenu;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// else: stop light
|
|
||||||
|
|
||||||
var entry = getGridEntry(e.RowIndex);
|
|
||||||
if (entry.Liberate.IsSeries)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var setDownloadMenuItem = new ToolStripMenuItem()
|
|
||||||
{
|
|
||||||
Text = "Set Download status to '&Downloaded'",
|
|
||||||
Enabled = entry.Book.UserDefinedItem.BookStatus != LiberatedStatus.Liberated
|
|
||||||
};
|
|
||||||
setDownloadMenuItem.Click += (_, __) => entry.Book.UpdateBookStatus(LiberatedStatus.Liberated);
|
|
||||||
|
|
||||||
var setNotDownloadMenuItem = new ToolStripMenuItem()
|
|
||||||
{
|
|
||||||
Text = "Set Download status to '&Not Downloaded'",
|
|
||||||
Enabled = entry.Book.UserDefinedItem.BookStatus != LiberatedStatus.NotLiberated
|
|
||||||
};
|
|
||||||
setNotDownloadMenuItem.Click += (_, __) => entry.Book.UpdateBookStatus(LiberatedStatus.NotLiberated);
|
|
||||||
|
|
||||||
var removeMenuItem = new ToolStripMenuItem() { Text = "&Remove from library" };
|
|
||||||
removeMenuItem.Click += async (_, __) => await Task.Run(entry.LibraryBook.RemoveBook);
|
|
||||||
|
|
||||||
var locateFileMenuItem = new ToolStripMenuItem() { Text = "&Locate file..." };
|
|
||||||
locateFileMenuItem.Click += (_, __) =>
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var openFileDialog = new OpenFileDialog
|
|
||||||
{
|
|
||||||
Title = $"Locate the audio file for '{entry.Book.Title}'",
|
|
||||||
Filter = "All files (*.*)|*.*",
|
|
||||||
FilterIndex = 1
|
|
||||||
};
|
|
||||||
if (openFileDialog.ShowDialog() == DialogResult.OK)
|
|
||||||
FilePathCache.Insert(entry.AudibleProductId, openFileDialog.FileName);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
var msg = "Error saving book's location";
|
|
||||||
MessageBoxLib.ShowAdminAlert(this, msg, msg, ex);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
var convertToMp3MenuItem = new ToolStripMenuItem
|
|
||||||
{
|
|
||||||
Text = "&Convert to Mp3",
|
|
||||||
Enabled = entry.Book.UserDefinedItem.BookStatus is LiberatedStatus.Liberated
|
|
||||||
};
|
|
||||||
convertToMp3MenuItem.Click += (_, e) => ConvertToMp3Clicked?.Invoke(entry as ILibraryBookEntry);
|
|
||||||
|
|
||||||
var bookRecordMenuItem = new ToolStripMenuItem { Text = "View &Bookmarks/Clips" };
|
|
||||||
bookRecordMenuItem.Click += (_, _) => new BookRecordsDialog(entry.LibraryBook).ShowDialog(this);
|
|
||||||
|
|
||||||
var stopLightContextMenu = new ContextMenuStrip();
|
|
||||||
stopLightContextMenu.Items.Add(setDownloadMenuItem);
|
|
||||||
stopLightContextMenu.Items.Add(setNotDownloadMenuItem);
|
|
||||||
stopLightContextMenu.Items.Add(removeMenuItem);
|
|
||||||
stopLightContextMenu.Items.Add(locateFileMenuItem);
|
|
||||||
stopLightContextMenu.Items.Add(convertToMp3MenuItem);
|
|
||||||
stopLightContextMenu.Items.Add(new ToolStripSeparator());
|
|
||||||
stopLightContextMenu.Items.Add(bookRecordMenuItem);
|
|
||||||
|
|
||||||
e.ContextMenuStrip = stopLightContextMenu;
|
|
||||||
}
|
|
||||||
|
|
||||||
private IGridEntry getGridEntry(int rowIndex) => gridEntryDataGridView.GetBoundItem<IGridEntry>(rowIndex);
|
private IGridEntry getGridEntry(int rowIndex) => gridEntryDataGridView.GetBoundItem<IGridEntry>(rowIndex);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user