Add search and quick filters to walkthrough
This commit is contained in:
parent
00cf7693d5
commit
2afb5365dd
8 changed files with 308 additions and 61 deletions
|
|
@ -1,9 +1,10 @@
|
|||
using AudibleUtilities;
|
||||
using ApplicationServices;
|
||||
using AudibleUtilities;
|
||||
using Dinah.Core.StepRunner;
|
||||
using Dinah.Core.WindowsDesktop.Processes;
|
||||
using LibationWinForms.Dialogs;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
|
@ -27,21 +28,25 @@ namespace LibationWinForms
|
|||
MainForm = form1;
|
||||
sequence[nameof(ShowAccountDialog)] = ShowAccountDialog;
|
||||
sequence[nameof(ShowSettingsDialog)] = ShowSettingsDialog;
|
||||
sequence[nameof(ScanAccounts)] = ScanAccounts;
|
||||
sequence[nameof(ShowAccountScanning)] = ShowAccountScanning;
|
||||
sequence[nameof(ShowSearching)] = ShowSearching;
|
||||
sequence[nameof(ShowQuickFilters)] = ShowQuickFilters;
|
||||
}
|
||||
|
||||
public async Task RunAsync() => await sequence.RunAsync();
|
||||
|
||||
private async Task<bool> ShowAccountDialog()
|
||||
{
|
||||
var result = MainForm.Invoke(() => MessageBox.Show(MainForm, "First, add you Audible account(s).", "Add Accounts", MessageBoxButtons.OKCancel));
|
||||
if (result is DialogResult.Cancel) return false;
|
||||
if (OkCancelMessageBox("First, add you Audible account(s).", "Add Accounts") is not DialogResult.OK) return false;
|
||||
|
||||
await Task.Delay(750);
|
||||
await flashControlAsync(MainForm.settingsToolStripMenuItem);
|
||||
MainForm.Invoke(MainForm.settingsToolStripMenuItem.ShowDropDown);
|
||||
await Task.Delay(500);
|
||||
|
||||
await flashControlAsync(MainForm.accountsToolStripMenuItem);
|
||||
MainForm.Invoke(MainForm.accountsToolStripMenuItem.Select);
|
||||
await Task.Delay(1000);
|
||||
await Task.Delay(500);
|
||||
|
||||
using var accountSettings = MainForm.Invoke(() => new AccountsDialog());
|
||||
accountSettings.StartPosition = FormStartPosition.CenterParent;
|
||||
|
|
@ -52,14 +57,16 @@ namespace LibationWinForms
|
|||
|
||||
private async Task<bool> ShowSettingsDialog()
|
||||
{
|
||||
var result = MainForm.Invoke(() => MessageBox.Show(MainForm, "Next, adjust Libation's settings", "Change Settings", MessageBoxButtons.OKCancel));
|
||||
if (result is DialogResult.Cancel) return false;
|
||||
if (OkCancelMessageBox("Next, adjust Libation's settings", "Change Settings") is not DialogResult.OK) return false;
|
||||
|
||||
await Task.Delay(750);
|
||||
await flashControlAsync(MainForm.settingsToolStripMenuItem);
|
||||
MainForm.Invoke(MainForm.settingsToolStripMenuItem.ShowDropDown);
|
||||
|
||||
await Task.Delay(500);
|
||||
await flashControlAsync(MainForm.basicSettingsToolStripMenuItem);
|
||||
MainForm.Invoke(MainForm.basicSettingsToolStripMenuItem.Select);
|
||||
await Task.Delay(1000);
|
||||
await Task.Delay(500);
|
||||
|
||||
using var settingsDialog = MainForm.Invoke(() => new SettingsDialog());
|
||||
|
||||
|
|
@ -100,7 +107,7 @@ namespace LibationWinForms
|
|||
}
|
||||
}
|
||||
|
||||
private async Task<bool> ScanAccounts()
|
||||
private async Task<bool> ShowAccountScanning()
|
||||
{
|
||||
using var persister = AudibleApiStorage.GetAccountsSettingsPersister();
|
||||
var count = persister.AccountsSettings.Accounts.Count;
|
||||
|
|
@ -113,16 +120,134 @@ namespace LibationWinForms
|
|||
|
||||
var accounts = count > 1 ? "accounts" :"account";
|
||||
var library = count > 1 ? "libraries" : "library";
|
||||
var result = MainForm.Invoke(() => MessageBox.Show(MainForm, $"Finally, scan your Audible {accounts} to sync your {library} with Libation", $"Scan {accounts}", MessageBoxButtons.OKCancel));
|
||||
if (result is DialogResult.Cancel) return false;
|
||||
if (OkCancelMessageBox($"Finally, scan your Audible {accounts} to sync your {library} with Libation", $"Scan {accounts}") is not DialogResult.OK) return false;
|
||||
|
||||
var scanItem = count > 1 ? MainForm.scanLibraryOfAllAccountsToolStripMenuItem : MainForm.scanLibraryToolStripMenuItem;
|
||||
|
||||
await Task.Delay(750);
|
||||
await flashControlAsync(MainForm.importToolStripMenuItem);
|
||||
MainForm.Invoke(MainForm.importToolStripMenuItem.ShowDropDown);
|
||||
await Task.Delay(500);
|
||||
MainForm.Invoke(() => (count > 1 ? MainForm.scanLibraryOfAllAccountsToolStripMenuItem : MainForm.scanLibraryToolStripMenuItem).Select());
|
||||
await flashControlAsync(scanItem);
|
||||
MainForm.Invoke(scanItem.Select);
|
||||
await Task.Delay(500);
|
||||
MainForm.Invoke(scanItem.PerformClick);
|
||||
|
||||
var tcs = new TaskCompletionSource();
|
||||
LibraryCommands.ScanEnd += LibraryCommands_ScanEnd;
|
||||
await tcs.Task;
|
||||
LibraryCommands.ScanEnd -= LibraryCommands_ScanEnd;
|
||||
MainForm.productsDisplay.VisibleCountChanged -= productsDisplay_VisibleCountChanged;
|
||||
|
||||
return true;
|
||||
|
||||
void LibraryCommands_ScanEnd(object sender, int newCount)
|
||||
{
|
||||
//if we imported new books, wait for the grid to update before proceeding.
|
||||
if (newCount > 0)
|
||||
MainForm.productsDisplay.VisibleCountChanged += productsDisplay_VisibleCountChanged;
|
||||
else
|
||||
tcs.SetResult();
|
||||
}
|
||||
void productsDisplay_VisibleCountChanged(object sender, int e) => tcs.SetResult();
|
||||
}
|
||||
|
||||
private async Task<bool> ShowSearching()
|
||||
{
|
||||
var books = DbContexts.GetLibrary_Flat_NoTracking();
|
||||
if (books.Count == 0) return true;
|
||||
|
||||
var firstAuthor = getFirstAuthor();
|
||||
if (firstAuthor == null) return true;
|
||||
|
||||
if (OkCancelMessageBox("You can filter the grid entries by searching", "Searching") is not DialogResult.OK) return false;
|
||||
|
||||
MainForm.Invoke(MainForm.filterSearchTb.Focus);
|
||||
await flashControlAsync(MainForm.filterSearchTb);
|
||||
|
||||
MainForm.Invoke(() => MainForm.filterSearchTb.Text = string.Empty);
|
||||
foreach (var c in firstAuthor)
|
||||
{
|
||||
MainForm.Invoke(() => MainForm.filterSearchTb.Text += c);
|
||||
await Task.Delay(200);
|
||||
}
|
||||
|
||||
await flashControlAsync(MainForm.filterBtn);
|
||||
MainForm.Invoke(MainForm.filterBtn.Select);
|
||||
await Task.Delay(500);
|
||||
MainForm.Invoke(MainForm.filterBtn.PerformClick);
|
||||
await Task.Delay(1000);
|
||||
MainForm.Invoke(() => (count > 1 ? MainForm.scanLibraryOfAllAccountsToolStripMenuItem : MainForm.scanLibraryToolStripMenuItem).PerformClick());
|
||||
|
||||
MessageBox.Show(MainForm, "Libation provides a built-in cheat sheet for its query language", "Search Cheat Sheet");
|
||||
|
||||
await flashControlAsync(MainForm.filterHelpBtn);
|
||||
using var filterHelp = MainForm.Invoke(() => new SearchSyntaxDialog());
|
||||
MainForm.Invoke(filterHelp.ShowDialog);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private async Task<bool> ShowQuickFilters()
|
||||
{
|
||||
var firstAuthor = getFirstAuthor();
|
||||
|
||||
if (firstAuthor == null) return true;
|
||||
|
||||
if (OkCancelMessageBox("Queries that you perform regularly can be added to 'Quick Filters'", "Quick Filters") is not DialogResult.OK) return false;
|
||||
|
||||
MainForm.Invoke(() => MainForm.filterSearchTb.Text = firstAuthor);
|
||||
await Task.Delay(750);
|
||||
await flashControlAsync(MainForm.addQuickFilterBtn);
|
||||
await Task.Delay(750);
|
||||
|
||||
MainForm.Invoke(MainForm.addQuickFilterBtn.PerformClick);
|
||||
|
||||
await flashControlAsync(MainForm.quickFiltersToolStripMenuItem);
|
||||
MainForm.Invoke(MainForm.quickFiltersToolStripMenuItem.ShowDropDown);
|
||||
await Task.Delay(500);
|
||||
|
||||
MainForm.Invoke(MainForm.editQuickFiltersToolStripMenuItem.Select);
|
||||
await flashControlAsync(MainForm.editQuickFiltersToolStripMenuItem);
|
||||
await Task.Delay(500);
|
||||
|
||||
var editQuickFilters = MainForm.Invoke(() => new EditQuickFilters());
|
||||
editQuickFilters.Shown += (_, _) => MessageBox.Show(editQuickFilters, "From here you can edit, delete, and change the order of Quick Filters", "Editing Quick Filters");
|
||||
|
||||
MainForm.Invoke(editQuickFilters.ShowDialog);
|
||||
return true;
|
||||
}
|
||||
|
||||
private string getFirstAuthor()
|
||||
{
|
||||
var books = DbContexts.GetLibrary_Flat_NoTracking();
|
||||
return books.SelectMany(lb => lb.Book.Authors).FirstOrDefault(a => !string.IsNullOrWhiteSpace(a.Name))?.Name;
|
||||
}
|
||||
|
||||
private async Task flashControlAsync(Control control, int flashCount = 3)
|
||||
{
|
||||
var backColor = MainForm.Invoke(() => control.BackColor);
|
||||
for (int i = 0; i < flashCount; i++)
|
||||
{
|
||||
MainForm.Invoke(() => control.BackColor = Color.Firebrick);
|
||||
await Task.Delay(200);
|
||||
MainForm.Invoke(() => control.BackColor = backColor);
|
||||
await Task.Delay(200);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task flashControlAsync(ToolStripItem control, int flashCount = 3)
|
||||
{
|
||||
var backColor = MainForm.Invoke(() => control.BackColor);
|
||||
for (int i = 0; i < flashCount; i++)
|
||||
{
|
||||
MainForm.Invoke(() => control.BackColor = Color.Firebrick);
|
||||
await Task.Delay(200);
|
||||
MainForm.Invoke(() => control.BackColor = backColor);
|
||||
await Task.Delay(200);
|
||||
}
|
||||
}
|
||||
|
||||
private DialogResult OkCancelMessageBox(string message, string caption)
|
||||
=> MainForm.Invoke(() => MessageBox.Show(MainForm, message, caption, MessageBoxButtons.OKCancel));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue