Remove unnecessary base form
This commit is contained in:
parent
29a50bb640
commit
6d7f234497
@ -1,164 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
using DataLayer;
|
|
||||||
using Dinah.Core.Net.Http;
|
|
||||||
using Dinah.Core.Threading;
|
|
||||||
using FileLiberator;
|
|
||||||
|
|
||||||
namespace LibationWinForms.BookLiberation.BaseForms
|
|
||||||
{
|
|
||||||
public class LiberationBaseForm : Form
|
|
||||||
{
|
|
||||||
protected Streamable Streamable { get; private set; }
|
|
||||||
protected LogMe LogMe { get; private set; }
|
|
||||||
private SynchronizeInvoker Invoker { get; init; }
|
|
||||||
|
|
||||||
public LiberationBaseForm()
|
|
||||||
{
|
|
||||||
//SynchronizationContext.Current will be null until the process contains a Form.
|
|
||||||
//If this is the first form created, it will not exist until after execution
|
|
||||||
//reaches inside the constructor (after base class has been initialized).
|
|
||||||
Invoker = new SynchronizeInvoker();
|
|
||||||
this.SetLibationIcon();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RegisterFileLiberator(Streamable streamable, LogMe logMe = null)
|
|
||||||
{
|
|
||||||
if (streamable is null) return;
|
|
||||||
|
|
||||||
Streamable = streamable;
|
|
||||||
LogMe = logMe;
|
|
||||||
|
|
||||||
Subscribe(streamable);
|
|
||||||
|
|
||||||
if (Streamable is Processable processable)
|
|
||||||
Subscribe(processable);
|
|
||||||
if (Streamable is AudioDecodable audioDecodable)
|
|
||||||
Subscribe(audioDecodable);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Event Subscribers and Unsubscribers
|
|
||||||
private void Subscribe(Streamable streamable)
|
|
||||||
{
|
|
||||||
UnsubscribeStreamable(this, EventArgs.Empty);
|
|
||||||
|
|
||||||
streamable.StreamingBegin += OnStreamingBeginShow;
|
|
||||||
streamable.StreamingBegin += Streamable_StreamingBegin;
|
|
||||||
streamable.StreamingProgressChanged += Streamable_StreamingProgressChanged;
|
|
||||||
streamable.StreamingTimeRemaining += Streamable_StreamingTimeRemaining;
|
|
||||||
streamable.StreamingCompleted += Streamable_StreamingCompleted;
|
|
||||||
streamable.StreamingCompleted += OnStreamingCompletedClose;
|
|
||||||
|
|
||||||
Disposed += UnsubscribeStreamable;
|
|
||||||
}
|
|
||||||
private void Subscribe(Processable processable)
|
|
||||||
{
|
|
||||||
UnsubscribeProcessable(this, null);
|
|
||||||
|
|
||||||
processable.Begin += Processable_Begin;
|
|
||||||
processable.StatusUpdate += Processable_StatusUpdate;
|
|
||||||
processable.Completed += Processable_Completed;
|
|
||||||
|
|
||||||
//The form is created on Processable.Begin and we
|
|
||||||
//dispose of it on Processable.Completed
|
|
||||||
processable.Completed += OnCompletedDispose;
|
|
||||||
|
|
||||||
//Don't unsubscribe from Dispose because it fires when
|
|
||||||
//Streamable.StreamingCompleted closes the form, and
|
|
||||||
//the Processable events need to live past that event.
|
|
||||||
processable.Completed += UnsubscribeProcessable;
|
|
||||||
}
|
|
||||||
private void Subscribe(AudioDecodable audioDecodable)
|
|
||||||
{
|
|
||||||
UnsubscribeAudioDecodable(this, EventArgs.Empty);
|
|
||||||
|
|
||||||
audioDecodable.RequestCoverArt += AudioDecodable_RequestCoverArt;
|
|
||||||
audioDecodable.TitleDiscovered += AudioDecodable_TitleDiscovered;
|
|
||||||
audioDecodable.AuthorsDiscovered += AudioDecodable_AuthorsDiscovered;
|
|
||||||
audioDecodable.NarratorsDiscovered += AudioDecodable_NarratorsDiscovered;
|
|
||||||
audioDecodable.CoverImageDiscovered += AudioDecodable_CoverImageDiscovered;
|
|
||||||
|
|
||||||
Disposed += UnsubscribeAudioDecodable;
|
|
||||||
}
|
|
||||||
private void UnsubscribeStreamable(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
Disposed -= UnsubscribeStreamable;
|
|
||||||
|
|
||||||
Streamable.StreamingBegin -= OnStreamingBeginShow;
|
|
||||||
Streamable.StreamingBegin -= Streamable_StreamingBegin;
|
|
||||||
Streamable.StreamingProgressChanged -= Streamable_StreamingProgressChanged;
|
|
||||||
Streamable.StreamingTimeRemaining -= Streamable_StreamingTimeRemaining;
|
|
||||||
Streamable.StreamingCompleted -= Streamable_StreamingCompleted;
|
|
||||||
Streamable.StreamingCompleted -= OnStreamingCompletedClose;
|
|
||||||
}
|
|
||||||
private void UnsubscribeProcessable(object sender, LibraryBook e)
|
|
||||||
{
|
|
||||||
if (Streamable is not Processable processable)
|
|
||||||
return;
|
|
||||||
|
|
||||||
processable.Completed -= UnsubscribeProcessable;
|
|
||||||
processable.Completed -= OnCompletedDispose;
|
|
||||||
processable.Completed -= Processable_Completed;
|
|
||||||
processable.StatusUpdate -= Processable_StatusUpdate;
|
|
||||||
processable.Begin -= Processable_Begin;
|
|
||||||
}
|
|
||||||
private void UnsubscribeAudioDecodable(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
if (Streamable is not AudioDecodable audioDecodable)
|
|
||||||
return;
|
|
||||||
|
|
||||||
Disposed -= UnsubscribeAudioDecodable;
|
|
||||||
audioDecodable.RequestCoverArt -= AudioDecodable_RequestCoverArt;
|
|
||||||
audioDecodable.TitleDiscovered -= AudioDecodable_TitleDiscovered;
|
|
||||||
audioDecodable.AuthorsDiscovered -= AudioDecodable_AuthorsDiscovered;
|
|
||||||
audioDecodable.NarratorsDiscovered -= AudioDecodable_NarratorsDiscovered;
|
|
||||||
audioDecodable.CoverImageDiscovered -= AudioDecodable_CoverImageDiscovered;
|
|
||||||
|
|
||||||
audioDecodable.Cancel();
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Form creation and disposal handling
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// If the form was shown using Show (not ShowDialog), Form.Close calls Form.Dispose
|
|
||||||
/// </summary>
|
|
||||||
private void OnStreamingCompletedClose(object sender, string completedString) => this.UIThreadAsync(Close);
|
|
||||||
private void OnCompletedDispose(object sender, LibraryBook e) => this.UIThreadAsync(Dispose);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// If StreamingBegin is fired from a worker thread, the window will be created on that
|
|
||||||
/// worker thread. We need to make certain that we show the window on the UI thread (same
|
|
||||||
/// thread that created form), otherwise the renderer will be on a worker thread which
|
|
||||||
/// could cause it to freeze. Form.BeginInvoke won't work until the form is created
|
|
||||||
/// (ie. shown) because Control doesn't get a window handle until it is Shown.
|
|
||||||
/// </summary>
|
|
||||||
private void OnStreamingBeginShow(object sender, string beginString) => Invoker.UIThreadAsync(Show);
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Streamable event handlers
|
|
||||||
public virtual void Streamable_StreamingBegin(object sender, string beginString) { }
|
|
||||||
public virtual void Streamable_StreamingProgressChanged(object sender, DownloadProgress downloadProgress) { }
|
|
||||||
public virtual void Streamable_StreamingTimeRemaining(object sender, TimeSpan timeRemaining) { }
|
|
||||||
public virtual void Streamable_StreamingCompleted(object sender, string completedString) { }
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Processable event handlers
|
|
||||||
public virtual void Processable_Begin(object sender, LibraryBook libraryBook) { }
|
|
||||||
public virtual void Processable_StatusUpdate(object sender, string statusUpdate) { }
|
|
||||||
public virtual void Processable_Completed(object sender, LibraryBook libraryBook) { }
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region AudioDecodable event handlers
|
|
||||||
public virtual void AudioDecodable_TitleDiscovered(object sender, string title) { }
|
|
||||||
public virtual void AudioDecodable_AuthorsDiscovered(object sender, string authors) { }
|
|
||||||
public virtual void AudioDecodable_NarratorsDiscovered(object sender, string narrators) { }
|
|
||||||
|
|
||||||
public virtual void AudioDecodable_CoverImageDiscovered(object sender, byte[] coverArt) { }
|
|
||||||
public virtual void AudioDecodable_RequestCoverArt(object sender, Action<byte[]> setCoverArtDelegate) { }
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -2,30 +2,48 @@
|
|||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using Dinah.Core.Net.Http;
|
using Dinah.Core.Net.Http;
|
||||||
using Dinah.Core.Threading;
|
using Dinah.Core.Threading;
|
||||||
using LibationWinForms.BookLiberation.BaseForms;
|
using FileLiberator;
|
||||||
|
|
||||||
namespace LibationWinForms.BookLiberation
|
namespace LibationWinForms.BookLiberation
|
||||||
{
|
{
|
||||||
public partial class DownloadForm : LiberationBaseForm
|
public partial class DownloadForm : Form
|
||||||
{
|
{
|
||||||
|
protected Streamable Streamable { get; private set; }
|
||||||
|
protected LogMe LogMe { get; private set; }
|
||||||
|
private SynchronizeInvoker Invoker { get; init; }
|
||||||
|
|
||||||
public DownloadForm()
|
public DownloadForm()
|
||||||
{
|
{
|
||||||
|
//SynchronizationContext.Current will be null until the process contains a Form.
|
||||||
|
//If this is the first form created, it will not exist until after execution
|
||||||
|
//reaches inside the constructor (after base class has been initialized).
|
||||||
|
Invoker = new SynchronizeInvoker();
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
|
this.SetLibationIcon();
|
||||||
progressLbl.Text = "";
|
progressLbl.Text = "";
|
||||||
filenameLbl.Text = "";
|
filenameLbl.Text = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void RegisterFileLiberator(Streamable streamable, LogMe logMe = null)
|
||||||
|
{
|
||||||
|
if (streamable is null) return;
|
||||||
|
streamable.StreamingBegin += Streamable_StreamingBegin;
|
||||||
|
streamable.StreamingProgressChanged += Streamable_StreamingProgressChanged;
|
||||||
|
streamable.StreamingCompleted += (_, _) => this.UIThreadAsync(Close);
|
||||||
|
Streamable = streamable;
|
||||||
|
LogMe = logMe;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#region Streamable event handler overrides
|
#region Streamable event handler overrides
|
||||||
public override void Streamable_StreamingBegin(object sender, string beginString)
|
public void Streamable_StreamingBegin(object sender, string beginString)
|
||||||
{
|
{
|
||||||
base.Streamable_StreamingBegin(sender, beginString);
|
Invoker.UIThreadAsync(Show);
|
||||||
filenameLbl.UIThreadAsync(() => filenameLbl.Text = beginString);
|
filenameLbl.UIThreadAsync(() => filenameLbl.Text = beginString);
|
||||||
}
|
}
|
||||||
public override void Streamable_StreamingProgressChanged(object sender, DownloadProgress downloadProgress)
|
public void Streamable_StreamingProgressChanged(object sender, DownloadProgress downloadProgress)
|
||||||
{
|
{
|
||||||
base.Streamable_StreamingProgressChanged(sender, downloadProgress);
|
|
||||||
// this won't happen with download file. it will happen with download string
|
// this won't happen with download file. it will happen with download string
|
||||||
if (!downloadProgress.TotalBytesToReceive.HasValue || downloadProgress.TotalBytesToReceive.Value <= 0)
|
if (!downloadProgress.TotalBytesToReceive.HasValue || downloadProgress.TotalBytesToReceive.Value <= 0)
|
||||||
return;
|
return;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user