Formattable UI labels

This commit is contained in:
Robert McRackan 2022-05-16 13:34:49 -04:00
parent 0a106e64d8
commit b60a854de0
6 changed files with 195 additions and 73 deletions

View File

@ -6,14 +6,12 @@ namespace LibationWinForms
{ {
public partial class Form1 public partial class Form1
{ {
private string beginBookBackupsToolStripMenuItem_format;
private string beginPdfBackupsToolStripMenuItem_format;
protected void Configure_BackupCounts() protected void Configure_BackupCounts()
{ {
// back up string formats // init formattable
beginBookBackupsToolStripMenuItem_format = beginBookBackupsToolStripMenuItem.Text; beginBookBackupsToolStripMenuItem.Format(0);
beginPdfBackupsToolStripMenuItem_format = beginPdfBackupsToolStripMenuItem.Text; beginPdfBackupsToolStripMenuItem.Format(0);
pdfsCountsLbl.Text = "| [Calculating backed up PDFs]";
Load += setBackupCounts; Load += setBackupCounts;
LibraryCommands.LibrarySizeChanged += setBackupCounts; LibraryCommands.LibrarySizeChanged += setBackupCounts;
@ -56,54 +54,72 @@ namespace LibationWinForms
setPdfBackupCounts(libraryStats); setPdfBackupCounts(libraryStats);
} }
// this cannot be cleanly be FormattableToolStripMenuItem because of the optional "Errors" text
private const string backupsCountsLbl_Format = "BACKUPS: No progress: {0} In process: {1} Fully backed up: {2}";
private void setBookBackupCounts(LibraryCommands.LibraryStats libraryStats) private void setBookBackupCounts(LibraryCommands.LibraryStats libraryStats)
{ {
var backupsCountsLbl_Format = "BACKUPS: No progress: {0} In process: {1} Fully backed up: {2}"; var pending = libraryStats.booksNoProgress + libraryStats.booksDownloadedOnly;
var hasResults = 0 < (libraryStats.booksFullyBackedUp + libraryStats.booksDownloadedOnly + libraryStats.booksNoProgress + libraryStats.booksError);
// enable/disable export // enable/disable export
var hasResults = 0 < (libraryStats.booksFullyBackedUp + libraryStats.booksDownloadedOnly + libraryStats.booksNoProgress + libraryStats.booksError); {
exportLibraryToolStripMenuItem.Enabled = hasResults; exportLibraryToolStripMenuItem.Enabled = hasResults;
}
// update bottom numbers // update bottom numbers
var pending = libraryStats.booksNoProgress + libraryStats.booksDownloadedOnly; {
var statusStripText var formatString
= !hasResults ? "No books. Begin by importing your library" = !hasResults ? "No books. Begin by importing your library"
: libraryStats.booksError > 0 ? string.Format(backupsCountsLbl_Format + " Errors: {3}", libraryStats.booksNoProgress, libraryStats.booksDownloadedOnly, libraryStats.booksFullyBackedUp, libraryStats.booksError) : libraryStats.booksError > 0 ? backupsCountsLbl_Format + " Errors: {3}"
: pending > 0 ? string.Format(backupsCountsLbl_Format, libraryStats.booksNoProgress, libraryStats.booksDownloadedOnly, libraryStats.booksFullyBackedUp) : pending > 0 ? backupsCountsLbl_Format
: $"All {"book".PluralizeWithCount(libraryStats.booksFullyBackedUp)} backed up"; : $"All {"book".PluralizeWithCount(libraryStats.booksFullyBackedUp)} backed up";
var statusStripText = string.Format(formatString,
libraryStats.booksNoProgress,
libraryStats.booksDownloadedOnly,
libraryStats.booksFullyBackedUp,
libraryStats.booksError);
statusStrip1.UIThreadAsync(() => backupsCountsLbl.Text = statusStripText);
}
// update menu item // update 'begin book backups' menu item
{
var menuItemText var menuItemText
= pending > 0 = pending > 0
? $"{pending} remaining" ? $"{pending} remaining"
: "All books have been liberated"; : "All books have been liberated";
menuStrip1.UIThreadAsync(() =>
// update UI {
statusStrip1.UIThreadAsync(() => backupsCountsLbl.Text = statusStripText); beginBookBackupsToolStripMenuItem.Format(menuItemText);
menuStrip1.UIThreadAsync(() => beginBookBackupsToolStripMenuItem.Enabled = pending > 0); beginBookBackupsToolStripMenuItem.Enabled = pending > 0;
menuStrip1.UIThreadAsync(() => beginBookBackupsToolStripMenuItem.Text = string.Format(beginBookBackupsToolStripMenuItem_format, menuItemText)); });
}
} }
private void setPdfBackupCounts(LibraryCommands.LibraryStats libraryStats) private void setPdfBackupCounts(LibraryCommands.LibraryStats libraryStats)
{ {
var pdfsCountsLbl_Format = "| PDFs: NOT d/l\'ed: {0} Downloaded: {1}";
// update bottom numbers // update bottom numbers
{
var hasResults = 0 < (libraryStats.pdfsNotDownloaded + libraryStats.pdfsDownloaded); var hasResults = 0 < (libraryStats.pdfsNotDownloaded + libraryStats.pdfsDownloaded);
// don't need to assign the output of Format(). It just makes this logic cleaner
var statusStripText var statusStripText
= !hasResults ? "" = !hasResults ? ""
: libraryStats.pdfsNotDownloaded > 0 ? string.Format(pdfsCountsLbl_Format, libraryStats.pdfsNotDownloaded, libraryStats.pdfsDownloaded) : libraryStats.pdfsNotDownloaded > 0 ? pdfsCountsLbl.Format(libraryStats.pdfsNotDownloaded, libraryStats.pdfsDownloaded)
: $"| All {libraryStats.pdfsDownloaded} PDFs downloaded"; : $"| All {libraryStats.pdfsDownloaded} PDFs downloaded";
statusStrip1.UIThreadAsync(() => pdfsCountsLbl.Text = statusStripText);
}
// update menu item // update 'begin pdf only backups' menu item
{
var menuItemText var menuItemText
= libraryStats.pdfsNotDownloaded > 0 = libraryStats.pdfsNotDownloaded > 0
? $"{libraryStats.pdfsNotDownloaded} remaining" ? $"{libraryStats.pdfsNotDownloaded} remaining"
: "All PDFs have been downloaded"; : "All PDFs have been downloaded";
menuStrip1.UIThreadAsync(() =>
// update UI {
statusStrip1.UIThreadAsync(() => pdfsCountsLbl.Text = statusStripText); beginPdfBackupsToolStripMenuItem.Format(menuItemText);
menuStrip1.UIThreadAsync(() => beginPdfBackupsToolStripMenuItem.Enabled = libraryStats.pdfsNotDownloaded > 0); beginPdfBackupsToolStripMenuItem.Enabled = libraryStats.pdfsNotDownloaded > 0;
menuStrip1.UIThreadAsync(() => beginPdfBackupsToolStripMenuItem.Text = string.Format(beginPdfBackupsToolStripMenuItem_format, menuItemText)); });
}
} }
} }
} }

View File

@ -44,10 +44,10 @@
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.liberateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.liberateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.beginBookBackupsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.beginBookBackupsToolStripMenuItem = new LibationWinForms.FormattableToolStripMenuItem();
this.beginPdfBackupsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.beginPdfBackupsToolStripMenuItem = new LibationWinForms.FormattableToolStripMenuItem();
this.convertAllM4bToMp3ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.convertAllM4bToMp3ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.liberateVisible2ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.liberateVisible2ToolStripMenuItem = new LibationWinForms.FormattableToolStripMenuItem();
this.exportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.exportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.exportLibraryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.exportLibraryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.quickFiltersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.quickFiltersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@ -55,8 +55,8 @@
this.editQuickFiltersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.editQuickFiltersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.scanningToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.scanningToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.visibleBooksToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.visibleBooksToolStripMenuItem = new LibationWinForms.FormattableToolStripMenuItem();
this.liberateVisibleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.liberateVisibleToolStripMenuItem = new LibationWinForms.FormattableToolStripMenuItem();
this.replaceTagsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.replaceTagsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.setDownloadedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.setDownloadedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.removeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.removeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@ -66,10 +66,10 @@
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.statusStrip1 = new System.Windows.Forms.StatusStrip(); this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.visibleCountLbl = new System.Windows.Forms.ToolStripStatusLabel(); this.visibleCountLbl = new LibationWinForms.FormattableToolStripStatusLabel();
this.springLbl = new System.Windows.Forms.ToolStripStatusLabel(); this.springLbl = new System.Windows.Forms.ToolStripStatusLabel();
this.backupsCountsLbl = new System.Windows.Forms.ToolStripStatusLabel(); this.backupsCountsLbl = new System.Windows.Forms.ToolStripStatusLabel();
this.pdfsCountsLbl = new System.Windows.Forms.ToolStripStatusLabel(); this.pdfsCountsLbl = new LibationWinForms.FormattableToolStripStatusLabel();
this.addQuickFilterBtn = new System.Windows.Forms.Button(); this.addQuickFilterBtn = new System.Windows.Forms.Button();
this.splitContainer1 = new System.Windows.Forms.SplitContainer(); this.splitContainer1 = new System.Windows.Forms.SplitContainer();
this.panel1 = new System.Windows.Forms.Panel(); this.panel1 = new System.Windows.Forms.Panel();
@ -407,7 +407,7 @@
// //
this.visibleCountLbl.Name = "visibleCountLbl"; this.visibleCountLbl.Name = "visibleCountLbl";
this.visibleCountLbl.Size = new System.Drawing.Size(68, 20); this.visibleCountLbl.Size = new System.Drawing.Size(68, 20);
this.visibleCountLbl.Text = "Visible: 0"; this.visibleCountLbl.Text = "Visible: {0}";
// //
// springLbl // springLbl
// //
@ -425,7 +425,7 @@
// //
this.pdfsCountsLbl.Name = "pdfsCountsLbl"; this.pdfsCountsLbl.Name = "pdfsCountsLbl";
this.pdfsCountsLbl.Size = new System.Drawing.Size(214, 20); this.pdfsCountsLbl.Size = new System.Drawing.Size(214, 20);
this.pdfsCountsLbl.Text = "| [Calculating backed up PDFs]"; this.pdfsCountsLbl.Text = "| PDFs: NOT d/l\'ed: {0} Downloaded: {1}";
// //
// addQuickFilterBtn // addQuickFilterBtn
// //
@ -531,12 +531,12 @@
private System.Windows.Forms.ToolStripMenuItem importToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem importToolStripMenuItem;
private System.Windows.Forms.StatusStrip statusStrip1; private System.Windows.Forms.StatusStrip statusStrip1;
private System.Windows.Forms.ToolStripStatusLabel springLbl; private System.Windows.Forms.ToolStripStatusLabel springLbl;
private System.Windows.Forms.ToolStripStatusLabel visibleCountLbl; private LibationWinForms.FormattableToolStripStatusLabel visibleCountLbl;
private System.Windows.Forms.ToolStripMenuItem liberateToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem liberateToolStripMenuItem;
private System.Windows.Forms.ToolStripStatusLabel backupsCountsLbl; private System.Windows.Forms.ToolStripStatusLabel backupsCountsLbl;
private System.Windows.Forms.ToolStripMenuItem beginBookBackupsToolStripMenuItem; private LibationWinForms.FormattableToolStripMenuItem beginBookBackupsToolStripMenuItem;
private System.Windows.Forms.ToolStripStatusLabel pdfsCountsLbl; private LibationWinForms.FormattableToolStripStatusLabel pdfsCountsLbl;
private System.Windows.Forms.ToolStripMenuItem beginPdfBackupsToolStripMenuItem; private LibationWinForms.FormattableToolStripMenuItem beginPdfBackupsToolStripMenuItem;
private System.Windows.Forms.TextBox filterSearchTb; private System.Windows.Forms.TextBox filterSearchTb;
private System.Windows.Forms.Button filterBtn; private System.Windows.Forms.Button filterBtn;
private System.Windows.Forms.Button filterHelpBtn; private System.Windows.Forms.Button filterHelpBtn;
@ -562,12 +562,12 @@
private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem scanningToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem scanningToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem autoScanLibraryToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem autoScanLibraryToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem visibleBooksToolStripMenuItem; private LibationWinForms.FormattableToolStripMenuItem visibleBooksToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem liberateVisibleToolStripMenuItem; private LibationWinForms.FormattableToolStripMenuItem liberateVisibleToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem replaceTagsToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem replaceTagsToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem setDownloadedToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem setDownloadedToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem removeToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem removeToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem liberateVisible2ToolStripMenuItem; private LibationWinForms.FormattableToolStripMenuItem liberateVisible2ToolStripMenuItem;
private System.Windows.Forms.SplitContainer splitContainer1; private System.Windows.Forms.SplitContainer splitContainer1;
private LibationWinForms.ProcessQueue.ProcessQueueControl processBookQueue1; private LibationWinForms.ProcessQueue.ProcessQueueControl processBookQueue1;
private System.Windows.Forms.Panel panel1; private System.Windows.Forms.Panel panel1;

View File

@ -10,22 +10,20 @@ namespace LibationWinForms
{ {
public partial class Form1 public partial class Form1
{ {
private string visibleBooksToolStripMenuItem_format;
private string liberateVisibleToolStripMenuItem_format;
private string liberateVisible2ToolStripMenuItem_format;
protected void Configure_VisibleBooks() protected void Configure_VisibleBooks()
{ {
// init formattable
visibleCountLbl.Format(0);
liberateVisibleToolStripMenuItem.Format(0);
liberateVisible2ToolStripMenuItem.Format(0);
// bottom-left visible count // bottom-left visible count
productsGrid.VisibleCountChanged += (_, qty) => visibleCountLbl.Text = string.Format("Visible: {0}", qty); productsGrid.VisibleCountChanged += (_, qty) => visibleCountLbl.Format(qty);
// back up string formats
visibleBooksToolStripMenuItem_format = visibleBooksToolStripMenuItem.Text;
liberateVisibleToolStripMenuItem_format = liberateVisibleToolStripMenuItem.Text;
liberateVisible2ToolStripMenuItem_format = liberateVisible2ToolStripMenuItem.Text;
// top menu strip
visibleBooksToolStripMenuItem.Format(0);
productsGrid.VisibleCountChanged += (_, qty) => { productsGrid.VisibleCountChanged += (_, qty) => {
visibleBooksToolStripMenuItem.Text = string.Format(visibleBooksToolStripMenuItem_format, qty); visibleBooksToolStripMenuItem.Format(qty);
visibleBooksToolStripMenuItem.Enabled = qty > 0; visibleBooksToolStripMenuItem.Enabled = qty > 0;
var notLiberatedCount = productsGrid.GetVisible().Count(lb => lb.Book.UserDefinedItem.BookStatus == DataLayer.LiberatedStatus.NotLiberated); var notLiberatedCount = productsGrid.GetVisible().Count(lb => lb.Book.UserDefinedItem.BookStatus == DataLayer.LiberatedStatus.NotLiberated);
@ -45,10 +43,10 @@ namespace LibationWinForms
{ {
if (notLiberated > 0) if (notLiberated > 0)
{ {
liberateVisibleToolStripMenuItem.Text = string.Format(liberateVisibleToolStripMenuItem_format, notLiberated); liberateVisibleToolStripMenuItem.Format(notLiberated);
liberateVisibleToolStripMenuItem.Enabled = true; liberateVisibleToolStripMenuItem.Enabled = true;
liberateVisible2ToolStripMenuItem.Text = string.Format(liberateVisible2ToolStripMenuItem_format, notLiberated); liberateVisible2ToolStripMenuItem.Format(notLiberated);
liberateVisible2ToolStripMenuItem.Enabled = true; liberateVisible2ToolStripMenuItem.Enabled = true;
} }
else else

View File

@ -0,0 +1,32 @@
using System;
using System.Drawing;
using System.Windows.Forms;
namespace LibationWinForms
{
public class FormattableLabel : Label
{
public string FormatText { get; set; }
/// <summary>Text set: first non-null, non-whitespace <see cref="Text"/> set is also saved as <see cref="FormatText"/></summary>
public override string Text
{
get => base.Text;
set
{
if (string.IsNullOrWhiteSpace(FormatText))
FormatText = value;
base.Text = value;
}
}
#region ctor.s
public FormattableLabel() : base() { }
#endregion
/// <summary>Replaces the format item in a specified string with the string representation of a corresponding object in a specified array. Returns <see cref="Text"/> for convenience.</summary>
/// <param name="args">An object array that contains zero or more objects to format.</param>
public string Format(params object[] args) => Text = string.Format(FormatText, args);
}
}

View File

@ -0,0 +1,39 @@
using System;
using System.Drawing;
using System.Windows.Forms;
namespace LibationWinForms
{
public class FormattableToolStripMenuItem : ToolStripMenuItem
{
public string FormatText { get; set; }
/// <summary>Text set: first non-null, non-whitespace <see cref="Text"/> set is also saved as <see cref="FormatText"/></summary>
public override string Text
{
get => base.Text;
set
{
if (string.IsNullOrWhiteSpace(FormatText))
FormatText = value;
base.Text = value;
}
}
#region ctor.s
public FormattableToolStripMenuItem() : base() { }
public FormattableToolStripMenuItem(string text) : base(text) => FormatText = text;
public FormattableToolStripMenuItem(Image image) : base(image) { }
public FormattableToolStripMenuItem(string text, Image image) : base(text, image) => FormatText = text;
public FormattableToolStripMenuItem(string text, Image image, EventHandler onClick) : base(text, image, onClick) => FormatText = text;
public FormattableToolStripMenuItem(string text, Image image, params ToolStripItem[] dropDownItems) : base(text, image, dropDownItems) => FormatText = text;
public FormattableToolStripMenuItem(string text, Image image, EventHandler onClick, Keys shortcutKeys) : base(text, image, onClick, shortcutKeys) => FormatText = text;
public FormattableToolStripMenuItem(string text, Image image, EventHandler onClick, string name) : base(text, image, onClick, name) => FormatText = text;
#endregion
/// <summary>Replaces the format item in a specified string with the string representation of a corresponding object in a specified array. Returns <see cref="Text"/> for convenience.</summary>
/// <param name="args">An object array that contains zero or more objects to format.</param>
public string Format(params object[] args) => Text = string.Format(FormatText, args);
}
}

View File

@ -0,0 +1,37 @@
using System;
using System.Drawing;
using System.Windows.Forms;
namespace LibationWinForms
{
public class FormattableToolStripStatusLabel : ToolStripStatusLabel
{
public string FormatText { get; set; }
/// <summary>Text set: first non-null, non-whitespace <see cref="Text"/> set is also saved as <see cref="FormatText"/></summary>
public override string Text
{
get => base.Text;
set
{
if (string.IsNullOrWhiteSpace(FormatText))
FormatText = value;
base.Text = value;
}
}
#region ctor.s
public FormattableToolStripStatusLabel() : base() { }
public FormattableToolStripStatusLabel(string text) : base(text) => FormatText = text;
public FormattableToolStripStatusLabel(Image image) : base(image) { }
public FormattableToolStripStatusLabel(string text, Image image) : base(text, image) => FormatText = text;
public FormattableToolStripStatusLabel(string text, Image image, EventHandler onClick) : base(text, image, onClick) => FormatText = text;
public FormattableToolStripStatusLabel(string text, Image image, EventHandler onClick, string name) : base(text, image, onClick, name) => FormatText = text;
#endregion
/// <summary>Replaces the format item in a specified string with the string representation of a corresponding object in a specified array. Returns <see cref="Text"/> for convenience.</summary>
/// <param name="args">An object array that contains zero or more objects to format.</param>
public string Format(params object[] args) => Text = string.Format(FormatText, args);
}
}