From 50c35ed5192d6fa20b3a324ac0699a8780c2c9eb Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Sat, 14 May 2022 13:52:54 -0600 Subject: [PATCH] Change log to gridview and new INotifyPropertyChanged event --- .../ProcessQueue/ProcessBookForm.Designer.cs | 2 +- .../ProcessQueueControl.Designer.cs | 84 ++++++++++++----- .../ProcessQueue/ProcessQueueControl.cs | 89 +++++++++++-------- .../ProcessQueue/ProcessQueueControl.resx | 6 ++ 4 files changed, 121 insertions(+), 60 deletions(-) diff --git a/Source/LibationWinForms/ProcessQueue/ProcessBookForm.Designer.cs b/Source/LibationWinForms/ProcessQueue/ProcessBookForm.Designer.cs index 036022fb..548f06d2 100644 --- a/Source/LibationWinForms/ProcessQueue/ProcessBookForm.Designer.cs +++ b/Source/LibationWinForms/ProcessQueue/ProcessBookForm.Designer.cs @@ -37,7 +37,7 @@ this.ClientSize = new System.Drawing.Size(522, 638); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow; this.Name = "ProcessBookForm"; - this.Text = "ProcessBookForm"; + this.Text = "Book Processing Queue"; this.ResumeLayout(false); } diff --git a/Source/LibationWinForms/ProcessQueue/ProcessQueueControl.Designer.cs b/Source/LibationWinForms/ProcessQueue/ProcessQueueControl.Designer.cs index 0b5b003b..3e99394f 100644 --- a/Source/LibationWinForms/ProcessQueue/ProcessQueueControl.Designer.cs +++ b/Source/LibationWinForms/ProcessQueue/ProcessQueueControl.Designer.cs @@ -30,6 +30,7 @@ { this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ProcessQueueControl)); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); this.statusStrip1 = new System.Windows.Forms.StatusStrip(); this.toolStripProgressBar1 = new System.Windows.Forms.ToolStripProgressBar(); this.queueNumberLbl = new System.Windows.Forms.ToolStripStatusLabel(); @@ -45,16 +46,20 @@ this.btnCleanFinished = new System.Windows.Forms.Button(); this.cancelAllBtn = new System.Windows.Forms.Button(); this.tabPage2 = new System.Windows.Forms.TabPage(); + this.logDGV = new System.Windows.Forms.DataGridView(); + this.timestampColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.logEntryColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.panel4 = new System.Windows.Forms.Panel(); this.panel2 = new System.Windows.Forms.Panel(); this.clearLogBtn = new System.Windows.Forms.Button(); - this.logMeTbox = new System.Windows.Forms.TextBox(); this.counterTimer = new System.Windows.Forms.Timer(this.components); + this.logCopyBtn = new System.Windows.Forms.Button(); this.statusStrip1.SuspendLayout(); this.tabControl1.SuspendLayout(); this.tabPage1.SuspendLayout(); this.panel1.SuspendLayout(); this.tabPage2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.logDGV)).BeginInit(); this.panel2.SuspendLayout(); this.SuspendLayout(); // @@ -193,9 +198,9 @@ // // tabPage2 // + this.tabPage2.Controls.Add(this.logDGV); this.tabPage2.Controls.Add(this.panel4); this.tabPage2.Controls.Add(this.panel2); - this.tabPage2.Controls.Add(this.logMeTbox); this.tabPage2.Location = new System.Drawing.Point(4, 24); this.tabPage2.Name = "tabPage2"; this.tabPage2.Padding = new System.Windows.Forms.Padding(3); @@ -204,6 +209,41 @@ this.tabPage2.Text = "Log"; this.tabPage2.UseVisualStyleBackColor = true; // + // logDGV + // + this.logDGV.AllowUserToAddRows = false; + this.logDGV.AllowUserToDeleteRows = false; + this.logDGV.AllowUserToOrderColumns = true; + this.logDGV.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells; + this.logDGV.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.logDGV.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.timestampColumn, + this.logEntryColumn}); + this.logDGV.Dock = System.Windows.Forms.DockStyle.Fill; + this.logDGV.Location = new System.Drawing.Point(3, 3); + this.logDGV.Name = "logDGV"; + this.logDGV.RowHeadersVisible = false; + this.logDGV.RowTemplate.Height = 40; + this.logDGV.Size = new System.Drawing.Size(390, 419); + this.logDGV.TabIndex = 3; + this.logDGV.Resize += new System.EventHandler(this.LogDGV_Resize); + // + // timestampColumn + // + this.timestampColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells; + this.timestampColumn.HeaderText = "Timestamp"; + this.timestampColumn.Name = "timestampColumn"; + this.timestampColumn.ReadOnly = true; + this.timestampColumn.Width = 91; + // + // logEntryColumn + // + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.logEntryColumn.DefaultCellStyle = dataGridViewCellStyle1; + this.logEntryColumn.HeaderText = "Log"; + this.logEntryColumn.Name = "logEntryColumn"; + this.logEntryColumn.ReadOnly = true; + // // panel4 // this.panel4.Dock = System.Windows.Forms.DockStyle.Bottom; @@ -216,6 +256,7 @@ // this.panel2.BackColor = System.Drawing.SystemColors.Control; this.panel2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panel2.Controls.Add(this.logCopyBtn); this.panel2.Controls.Add(this.clearLogBtn); this.panel2.Dock = System.Windows.Forms.DockStyle.Bottom; this.panel2.Location = new System.Drawing.Point(3, 427); @@ -228,38 +269,36 @@ this.clearLogBtn.Dock = System.Windows.Forms.DockStyle.Left; this.clearLogBtn.Location = new System.Drawing.Point(0, 0); this.clearLogBtn.Name = "clearLogBtn"; - this.clearLogBtn.Size = new System.Drawing.Size(75, 23); + this.clearLogBtn.Size = new System.Drawing.Size(60, 23); this.clearLogBtn.TabIndex = 0; - this.clearLogBtn.Text = "Clear Log"; + this.clearLogBtn.Text = "Clear"; this.clearLogBtn.UseVisualStyleBackColor = true; this.clearLogBtn.Click += new System.EventHandler(this.clearLogBtn_Click); // - // logMeTbox - // - this.logMeTbox.Dock = System.Windows.Forms.DockStyle.Fill; - this.logMeTbox.Location = new System.Drawing.Point(3, 3); - this.logMeTbox.Margin = new System.Windows.Forms.Padding(3, 3, 3, 0); - this.logMeTbox.MaxLength = 10000000; - this.logMeTbox.Multiline = true; - this.logMeTbox.Name = "logMeTbox"; - this.logMeTbox.ReadOnly = true; - this.logMeTbox.ScrollBars = System.Windows.Forms.ScrollBars.Both; - this.logMeTbox.Size = new System.Drawing.Size(390, 449); - this.logMeTbox.TabIndex = 0; - // // counterTimer // this.counterTimer.Interval = 950; this.counterTimer.Tick += new System.EventHandler(this.CounterTimer_Tick); // - // ProcessBookQueue + // logCopyBtn + // + this.logCopyBtn.Dock = System.Windows.Forms.DockStyle.Right; + this.logCopyBtn.Location = new System.Drawing.Point(331, 0); + this.logCopyBtn.Name = "logCopyBtn"; + this.logCopyBtn.Size = new System.Drawing.Size(57, 23); + this.logCopyBtn.TabIndex = 1; + this.logCopyBtn.Text = "Copy"; + this.logCopyBtn.UseVisualStyleBackColor = true; + this.logCopyBtn.Click += new System.EventHandler(this.LogCopyBtn_Click); + // + // ProcessQueueControl // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.Controls.Add(this.tabControl1); this.Controls.Add(this.statusStrip1); - this.Name = "ProcessBookQueue"; + this.Name = "ProcessQueueControl"; this.Size = new System.Drawing.Size(404, 508); this.statusStrip1.ResumeLayout(false); this.statusStrip1.PerformLayout(); @@ -267,7 +306,7 @@ this.tabPage1.ResumeLayout(false); this.panel1.ResumeLayout(false); this.tabPage2.ResumeLayout(false); - this.tabPage2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.logDGV)).EndInit(); this.panel2.ResumeLayout(false); this.ResumeLayout(false); this.PerformLayout(); @@ -281,7 +320,6 @@ private System.Windows.Forms.TabPage tabPage1; private System.Windows.Forms.Panel panel1; private System.Windows.Forms.TabPage tabPage2; - private System.Windows.Forms.TextBox logMeTbox; private System.Windows.Forms.Button btnCleanFinished; private System.Windows.Forms.Button cancelAllBtn; private System.Windows.Forms.Panel panel2; @@ -295,5 +333,9 @@ private System.Windows.Forms.Panel panel4; private System.Windows.Forms.ToolStripStatusLabel runningTimeLbl; private System.Windows.Forms.Timer counterTimer; + private System.Windows.Forms.DataGridView logDGV; + private System.Windows.Forms.DataGridViewTextBoxColumn timestampColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn logEntryColumn; + private System.Windows.Forms.Button logCopyBtn; } } diff --git a/Source/LibationWinForms/ProcessQueue/ProcessQueueControl.cs b/Source/LibationWinForms/ProcessQueue/ProcessQueueControl.cs index cfa89137..2df35ef8 100644 --- a/Source/LibationWinForms/ProcessQueue/ProcessQueueControl.cs +++ b/Source/LibationWinForms/ProcessQueue/ProcessQueueControl.cs @@ -1,7 +1,7 @@ -using Dinah.Core.Threading; -using LibationWinForms.BookLiberation; +using LibationWinForms.BookLiberation; using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; @@ -42,7 +42,6 @@ namespace LibationWinForms.ProcessQueue public Task QueueRunner { get; private set; } public bool Running => !QueueRunner?.IsCompleted ?? false; - public ToolStripButton popoutBtn = new(); public ProcessQueueControl() @@ -71,47 +70,43 @@ namespace LibationWinForms.ProcessQueue CompletedCount = 0; } - public void AddDownloadDecrypt(IEnumerable entries) + public void AddDownloadDecrypt(IEnumerable entries) { foreach (var entry in entries) AddDownloadDecrypt(entry); } - public void AddConvertMp3(IEnumerable entries) + public void AddConvertMp3(IEnumerable entries) { foreach (var entry in entries) AddConvertMp3(entry); } - public void AddDownloadDecrypt(GridEntry gridEntry) + public void AddDownloadDecrypt(DataLayer.LibraryBook libraryBook) { - if (Queue.Any(b => b?.LibraryBook?.Book?.AudibleProductId == gridEntry.AudibleProductId)) + if (Queue.Any(b => b?.LibraryBook?.Book?.AudibleProductId == libraryBook.Book.AudibleProductId)) return; - ProcessBook pbook = new(gridEntry.LibraryBook, gridEntry.Cover, Logger); - pbook.DataAvailable += Pbook_DataAvailable; - + ProcessBook pbook = new(libraryBook, Logger); + pbook.PropertyChanged += Pbook_DataAvailable; pbook.AddDownloadDecryptBook(); pbook.AddDownloadPdf(); - - Queue.Enqueue(pbook); - - if (!Running) - { - QueueRunner = QueueLoop(); - } + AddToQueue(pbook); } - public void AddConvertMp3(GridEntry gridEntry) + public void AddConvertMp3(DataLayer.LibraryBook libraryBook) { - if (Queue.Any(b => b?.LibraryBook?.Book?.AudibleProductId == gridEntry.AudibleProductId)) + if (Queue.Any(b => b?.LibraryBook?.Book?.AudibleProductId == libraryBook.Book.AudibleProductId)) return; - ProcessBook pbook = new(gridEntry.LibraryBook, gridEntry.Cover, Logger); - pbook.DataAvailable += Pbook_DataAvailable; - + ProcessBook pbook = new(libraryBook, Logger); + pbook.PropertyChanged += Pbook_DataAvailable; pbook.AddConvertToMp3(); + AddToQueue(pbook); + } + private void AddToQueue(ProcessBook pbook) + { Queue.Enqueue(pbook); if (!Running) @@ -144,8 +139,10 @@ namespace LibationWinForms.ProcessQueue public void WriteLine(string text) { - if (!IsDisposed) - logMeTbox.UIThreadAsync(() => logMeTbox.AppendText($"{DateTime.Now} {text}{Environment.NewLine}")); + if (IsDisposed) return; + + var timeStamp = DateTime.Now; + logDGV.Rows.Add(timeStamp, text.Trim()); } #region Control event handlers @@ -205,7 +202,18 @@ namespace LibationWinForms.ProcessQueue private void clearLogBtn_Click(object sender, EventArgs e) { - logMeTbox.Clear(); + logDGV.Rows.Clear(); + } + + private void LogCopyBtn_Click(object sender, EventArgs e) + { + string logText = string.Join("\r\n", logDGV.Rows.Cast().Select(r => $"{r.Cells[0].Value}\t{r.Cells[1].Value}")); + Clipboard.SetDataObject(logText, false, 5, 150); + } + + private void LogDGV_Resize(object sender, EventArgs e) + { + logDGV.Columns[1].Width = logDGV.Width - logDGV.Columns[0].Width; } #endregion @@ -229,7 +237,7 @@ namespace LibationWinForms.ProcessQueue /// Updates the display of a single at within /// /// index of the within the - private void UpdateControl(int queueIndex) + private void UpdateControl(int queueIndex, string propertyName = null) { int i = queueIndex - FirstVisible; @@ -240,8 +248,10 @@ namespace LibationWinForms.ProcessQueue Panels[i].Invoke(() => { Panels[i].SuspendLayout(); - Panels[i].SetCover(proc.Cover); - Panels[i].SetBookInfo(proc.BookText); + if (propertyName is null || propertyName == nameof(proc.Cover)) + Panels[i].SetCover(proc.Cover); + if (propertyName is null || propertyName == nameof(proc.BookText)) + Panels[i].SetBookInfo(proc.BookText); if (proc.Result != ProcessBookResult.None) { @@ -249,9 +259,12 @@ namespace LibationWinForms.ProcessQueue return; } - Panels[i].SetStatus(proc.Status); - Panels[i].SetProgrss(proc.Progress); - Panels[i].SetRemainingTime(proc.TimeRemaining); + if (propertyName is null || propertyName == nameof(proc.Status)) + Panels[i].SetStatus(proc.Status); + if (propertyName is null || propertyName == nameof(proc.Progress)) + Panels[i].SetProgrss(proc.Progress); + if (propertyName is null || propertyName == nameof(proc.TimeRemaining)) + Panels[i].SetRemainingTime(proc.TimeRemaining); Panels[i].ResumeLayout(); }); } @@ -273,31 +286,31 @@ namespace LibationWinForms.ProcessQueue private void VirtualFlowControl2_ButtonClicked(int queueIndex, string buttonName, ProcessBookControl panelClicked) { ProcessBook item = Queue[queueIndex]; - if (buttonName == "cancelBtn") + if (buttonName == nameof(panelClicked.cancelBtn)) { item.Cancel(); Queue.RemoveQueued(item); virtualFlowControl2.VirtualControlCount = Queue.Count; UpdateControl(queueIndex); } - else if (buttonName == "moveFirstBtn") + else if (buttonName == nameof(panelClicked.moveFirstBtn)) { Queue.MoveQueuePosition(item, QueuePosition.Fisrt); UpdateAllControls(); } - else if (buttonName == "moveUpBtn") + else if (buttonName == nameof(panelClicked.moveUpBtn)) { Queue.MoveQueuePosition(item, QueuePosition.OneUp); UpdateControl(queueIndex - 1); UpdateControl(queueIndex); } - else if (buttonName == "moveDownBtn") + else if (buttonName == nameof(panelClicked.moveDownBtn)) { Queue.MoveQueuePosition(item, QueuePosition.OneDown); UpdateControl(queueIndex + 1); UpdateControl(queueIndex); } - else if (buttonName == "moveLastBtn") + else if (buttonName == nameof(panelClicked.moveLastBtn)) { Queue.MoveQueuePosition(item, QueuePosition.Last); UpdateAllControls(); @@ -318,10 +331,10 @@ namespace LibationWinForms.ProcessQueue /// /// Model updates the view /// - private void Pbook_DataAvailable(object sender, EventArgs e) + private void Pbook_DataAvailable(object sender, PropertyChangedEventArgs e) { int index = Queue.IndexOf((ProcessBook)sender); - UpdateControl(index); + UpdateControl(index, e.PropertyName); } #endregion diff --git a/Source/LibationWinForms/ProcessQueue/ProcessQueueControl.resx b/Source/LibationWinForms/ProcessQueue/ProcessQueueControl.resx index 15c031bb..00da05c2 100644 --- a/Source/LibationWinForms/ProcessQueue/ProcessQueueControl.resx +++ b/Source/LibationWinForms/ProcessQueue/ProcessQueueControl.resx @@ -630,6 +630,12 @@ w1EmAAAAAElFTkSuQmCC + + True + + + True + 133, 17