using ApplicationServices;
using System;
using System.Threading.Tasks;
using DataLayer;
using Avalonia.Threading;
using LibationAvalonia.Dialogs;
using ReactiveUI;
namespace LibationAvalonia.ViewModels
{
partial class MainVM
{
private int _visibleNotLiberated = 0;
private int _visibleCount = 0;
/// The Bottom-right visible book count status text
public string VisibleCountText => $"Visible: {_visibleCount}";
/// The Visible Books menu item header text
public string VisibleCountMenuItemText => menufyText($"Visible Books {_visibleCount}");
/// Indicates if any of the books visible in the Products Display haven't been liberated
public bool AnyVisibleNotLiberated => _visibleNotLiberated > 0;
/// The "Liberate Visible Books" menu item header text (submenu item of the "Liberate Menu" menu item)
public string LiberateVisibleToolStripText { get; private set; } = "Liberate _Visible Books: 0";
/// The "Liberate" menu item header text (submenu item of the "Visible Books" menu item)
public string LiberateVisibleToolStripText_2 { get; private set; } = menufyText("Liberate: 0");
private void Configure_VisibleBooks()
{
LibraryCommands.BookUserDefinedItemCommitted += setLiberatedVisibleMenuItemAsync;
ProductsDisplay.VisibleCountChanged += ProductsDisplay_VisibleCountChanged;
}
private void setVisibleCount(int visibleCount)
{
_visibleCount = visibleCount;
this.RaisePropertyChanged(nameof(VisibleCountText));
this.RaisePropertyChanged(nameof(VisibleCountMenuItemText));
}
private void setVisibleNotLiberatedCount(int visibleNotLiberated)
{
_visibleNotLiberated = visibleNotLiberated;
LiberateVisibleToolStripText
= AnyVisibleNotLiberated
? "Liberate " + menufyText($"Visible Books: {visibleNotLiberated}")
: "All visible books are liberated";
LiberateVisibleToolStripText_2
= AnyVisibleNotLiberated
? menufyText($"Liberate: {visibleNotLiberated}")
: "All visible books are liberated";
this.RaisePropertyChanged(nameof(AnyVisibleNotLiberated));
this.RaisePropertyChanged(nameof(LiberateVisibleToolStripText));
this.RaisePropertyChanged(nameof(LiberateVisibleToolStripText_2));
}
public async void ProductsDisplay_VisibleCountChanged(object sender, int qty)
{
setVisibleCount(qty);
await Dispatcher.UIThread.InvokeAsync(setLiberatedVisibleMenuItem);
}
private async void setLiberatedVisibleMenuItemAsync(object _, object __)
=> await Dispatcher.UIThread.InvokeAsync(setLiberatedVisibleMenuItem);
public void LiberateVisible()
{
try
{
setQueueCollapseState(false);
Serilog.Log.Logger.Information("Begin backing up visible library books");
ProcessQueue.AddDownloadDecrypt(
ProductsDisplay
.GetVisibleBookEntries()
.UnLiberated()
);
}
catch (Exception ex)
{
Serilog.Log.Logger.Error(ex, "An error occurred while backing up visible library books");
}
}
public async Task ReplaceTagsAsync()
{
var dialog = new TagsBatchDialog();
var result = await dialog.ShowDialog(MainWindow);
if (result != DialogResult.OK)
return;
var visibleLibraryBooks = ProductsDisplay.GetVisibleBookEntries();
var confirmationResult = await MessageBox.ShowConfirmationDialog(
MainWindow,
visibleLibraryBooks,
// do not use `$` string interpolation. See impl.
"Are you sure you want to replace tags in {0}?",
"Replace tags?");
if (confirmationResult != DialogResult.Yes)
return;
visibleLibraryBooks.UpdateTags(dialog.NewTags);
}
public async Task SetBookDownloadedAsync()
{
var dialog = new LiberatedStatusBatchManualDialog();
var result = await dialog.ShowDialog(MainWindow);
if (result != DialogResult.OK)
return;
var visibleLibraryBooks = ProductsDisplay.GetVisibleBookEntries();
var confirmationResult = await MessageBox.ShowConfirmationDialog(
MainWindow,
visibleLibraryBooks,
// do not use `$` string interpolation. See impl.
"Are you sure you want to replace book downloaded status in {0}?",
"Replace downloaded status?");
if (confirmationResult != DialogResult.Yes)
return;
visibleLibraryBooks.UpdateBookStatus(dialog.BookLiberatedStatus);
}
public async Task SetPdfDownloadedAsync()
{
var dialog = new LiberatedStatusBatchManualDialog(isPdf: true);
var result = await dialog.ShowDialog(MainWindow);
if (result != DialogResult.OK)
return;
var visibleLibraryBooks = ProductsDisplay.GetVisibleBookEntries();
var confirmationResult = await MessageBox.ShowConfirmationDialog(
MainWindow,
visibleLibraryBooks,
// do not use `$` string interpolation. See impl.
"Are you sure you want to replace PDF downloaded status in {0}?",
"Replace downloaded status?");
if (confirmationResult != DialogResult.Yes)
return;
visibleLibraryBooks.UpdatePdfStatus(dialog.BookLiberatedStatus);
}
public async Task SetDownloadedAutoAsync()
{
var dialog = new LiberatedStatusBatchAutoDialog();
var result = await dialog.ShowDialog(MainWindow);
if (result != DialogResult.OK)
return;
var bulkSetStatus = new BulkSetDownloadStatus(ProductsDisplay.GetVisibleBookEntries(), dialog.SetDownloaded, dialog.SetNotDownloaded);
var count = await Task.Run(bulkSetStatus.Discover);
if (count == 0)
return;
var confirmationResult = await MessageBox.Show(
bulkSetStatus.AggregateMessage,
"Replace downloaded status?",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question,
MessageBoxDefaultButton.Button1);
if (confirmationResult != DialogResult.Yes)
return;
bulkSetStatus.Execute();
}
public async Task RemoveVisibleAsync()
{
var visibleLibraryBooks = ProductsDisplay.GetVisibleBookEntries();
var confirmationResult = await MessageBox.ShowConfirmationDialog(
MainWindow,
visibleLibraryBooks,
// do not use `$` string interpolation. See impl.
"Are you sure you want to remove {0} from Libation's library?",
"Remove books from Libation?",
MessageBoxDefaultButton.Button2);
if (confirmationResult is DialogResult.Yes)
await visibleLibraryBooks.RemoveBooksAsync();
}
private void setLiberatedVisibleMenuItem()
{
var libraryStats = LibraryCommands.GetCounts(ProductsDisplay.GetVisibleBookEntries());
setVisibleNotLiberatedCount(libraryStats.PendingBooks);
}
}
}