Thumbnail List Update notifications moved to MediatR

This commit is contained in:
Anton Kasyanov
2018-02-19 21:27:09 +02:00
parent 42be487d31
commit b97fe58782
15 changed files with 94 additions and 129 deletions

View File

@@ -17,6 +17,11 @@ namespace EveOPreview
public void SetupExceptionHandlers() public void SetupExceptionHandlers()
{ {
if (System.Diagnostics.Debugger.IsAttached)
{
return;
}
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.ThreadException += delegate (Object sender, ThreadExceptionEventArgs e) Application.ThreadException += delegate (Object sender, ThreadExceptionEventArgs e)
{ {

View File

@@ -58,7 +58,7 @@ namespace EveOPreview
public void Register<TService, TImplementation>() public void Register<TService, TImplementation>()
where TImplementation : TService where TImplementation : TService
{ {
this._container.Register<TService, TImplementation>(new PerContainerLifetime()); this._container.Register<TService, TImplementation>();
} }
public void Register<TService>(Expression<Func<TService>> factory) public void Register<TService>(Expression<Func<TService>> factory)

View File

@@ -1,5 +1,4 @@
using System; using System.Threading;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using EveOPreview.Mediator.Messages; using EveOPreview.Mediator.Messages;
using EveOPreview.Presenters; using EveOPreview.Presenters;
@@ -20,7 +19,17 @@ namespace EveOPreview.Mediator.Handlers.Thumbnails
public Task Handle(ThumbnailListUpdated notification, CancellationToken cancellationToken) public Task Handle(ThumbnailListUpdated notification, CancellationToken cancellationToken)
{ {
throw new NotImplementedException(); if (notification.Added.Count > 0)
{
this._presenter.AddThumbnails(notification.Added);
}
if (notification.Removed.Count > 0)
{
this._presenter.RemoveThumbnails(notification.Removed);
}
return Task.CompletedTask;
} }
} }
} }

View File

@@ -1,22 +1,17 @@
using System.Collections.Generic; using System.Collections.Generic;
using MediatR;
namespace EveOPreview.Mediator.Messages namespace EveOPreview.Mediator.Messages
{ {
sealed class ThumbnailListUpdated : NotificationBase<IList<string>> sealed class ThumbnailListUpdated : INotification
{ {
public ThumbnailListUpdated(UpdateKind updateKind, IList<string> list) public ThumbnailListUpdated(IList<string> addedThumbnails, IList<string> removedThumbnails)
: base(list)
{ {
this.Kind = updateKind; this.Added = addedThumbnails;
this.Removed = removedThumbnails;
} }
public UpdateKind Kind { get; } public IList<string> Added { get; }
public IList<string> Removed { get; }
public enum UpdateKind
{
Add,
Update,
Remove
}
} }
} }

View File

@@ -5,7 +5,6 @@ using System.Drawing;
using EveOPreview.Configuration; using EveOPreview.Configuration;
using EveOPreview.Mediator.Messages; using EveOPreview.Mediator.Messages;
using EveOPreview.Services; using EveOPreview.Services;
using EveOPreview.UI;
using EveOPreview.View; using EveOPreview.View;
using MediatR; using MediatR;
@@ -23,6 +22,8 @@ namespace EveOPreview.Presenters
private readonly IConfigurationStorage _configurationStorage; private readonly IConfigurationStorage _configurationStorage;
private readonly IThumbnailManager _thumbnailManager; private readonly IThumbnailManager _thumbnailManager;
private readonly IDictionary<string, IThumbnailDescription> _descriptionsCache;
private bool _exitApplication; private bool _exitApplication;
#endregion #endregion
@@ -33,9 +34,10 @@ namespace EveOPreview.Presenters
this._mediator = mediator; this._mediator = mediator;
this._configuration = configuration; this._configuration = configuration;
this._configurationStorage = configurationStorage; this._configurationStorage = configurationStorage;
this._thumbnailManager = thumbnailManager; this._thumbnailManager = thumbnailManager;
this._descriptionsCache = new Dictionary<string, IThumbnailDescription>();
this._exitApplication = false; this._exitApplication = false;
this.View.FormActivated = this.Activate; this.View.FormActivated = this.Activate;
@@ -150,70 +152,65 @@ namespace EveOPreview.Presenters
this._thumbnailManager.SetupThumbnailFrames(); this._thumbnailManager.SetupThumbnailFrames();
} }
private void ThumbnailsAdded(IList<IThumbnailView> thumbnails)
public void AddThumbnails(IList<string> thumbnailTitles)
{ {
//this.View.AddThumbnails(this.GetThumbnailViews(thumbnails, false)); IList<IThumbnailDescription> descriptions = new List<IThumbnailDescription>(thumbnailTitles.Count);
lock (this._descriptionsCache)
{
foreach (string title in thumbnailTitles)
{
IThumbnailDescription description = this.CreateThumbnailDescription(title);
this._descriptionsCache[title] = description;
descriptions.Add(description);
}
}
this.View.AddThumbnails(descriptions);
} }
private void ThumbnailsUpdated(IList<IThumbnailView> thumbnails) public void RemoveThumbnails(IList<string> thumbnailTitles)
{ {
//this.View.UpdateThumbnails(this.GetThumbnailViews(thumbnails, false)); IList<IThumbnailDescription> descriptions = new List<IThumbnailDescription>(thumbnailTitles.Count);
lock (this._descriptionsCache)
{
foreach (string title in thumbnailTitles)
{
if (!this._descriptionsCache.TryGetValue(title, out IThumbnailDescription description))
{
continue;
}
this._descriptionsCache.Remove(title);
descriptions.Add(description);
}
}
this.View.RemoveThumbnails(descriptions);
} }
private void ThumbnailsRemoved(IList<IThumbnailView> thumbnails) private IThumbnailDescription CreateThumbnailDescription(string title)
{ {
//this.View.RemoveThumbnails(this.GetThumbnailViews(thumbnails, true)); // TODO Read here persisted value for the IsDisabled parameter
return new ThumbnailDescription(title, false);
} }
//private IList<IThumbnailDescriptionView> GetThumbnailViews(IList<IThumbnailView> thumbnails, bool removeFromCache)
//{
// IList<IThumbnailDescriptionView> thumbnailViews = new List<IThumbnailDescriptionView>(thumbnails.Count);
// // Time for some thread safety
// lock (this._thumbnailDescriptionViews)
// {
// foreach (IThumbnailView thumbnail in thumbnails)
// {
// IThumbnailDescriptionView thumbnailView;
// bool foundInCache = this._thumbnailDescriptionViews.TryGetValue(thumbnail.Id, out thumbnailView);
// if (!foundInCache)
// {
// if (removeFromCache)
// {
// // This item was not even cached
// continue;
// }
// thumbnailView = this._thumbnailDescriptionViewFactory.Create(thumbnail.Id, thumbnail.Title, !thumbnail.IsEnabled);
// this._thumbnailDescriptionViews.Add(thumbnail.Id, thumbnailView);
// }
// else
// {
// if (removeFromCache)
// {
// this._thumbnailDescriptionViews.Remove(thumbnail.Id);
// }
// else
// {
// thumbnailView.Title = thumbnail.Title;
// }
// }
// thumbnailViews.Add(thumbnailView);
// }
// }
// return thumbnailViews;
//}
private void UpdateThumbnailState(String title) private void UpdateThumbnailState(String title)
{ {
//this._thumbnailManager.SetThumbnailState(thumbnailId, this._thumbnailDescriptionViews[thumbnailId].IsDisabled); //this._thumbnailManager.SetThumbnailState(thumbnailId, this._thumbnailDescriptionViews[thumbnailId].IsDisabled);
} }
public void UpdateThumbnailSize(Size size)
{
this.View.ThumbnailSize = size;
}
private void OpenDocumentationLink() private void OpenDocumentationLink()
{ {
// TODO Move out
ProcessStartInfo processStartInfo = new ProcessStartInfo(new Uri(MainFormPresenter.ForumUrl).AbsoluteUri); ProcessStartInfo processStartInfo = new ProcessStartInfo(new Uri(MainFormPresenter.ForumUrl).AbsoluteUri);
Process.Start(processStartInfo); Process.Start(processStartInfo);
} }
@@ -229,10 +226,5 @@ namespace EveOPreview.Presenters
this._exitApplication = true; this._exitApplication = true;
this.View.Close(); this.View.Close();
} }
public void UpdateThumbnailSize(Size size)
{
this.View.ThumbnailSize = size;
}
} }
} }

View File

@@ -1,9 +1,13 @@
using System.Drawing; using System.Collections.Generic;
using System.Drawing;
namespace EveOPreview.Presenters namespace EveOPreview.Presenters
{ {
interface IMainFormPresenter interface IMainFormPresenter
{ {
void AddThumbnails(IList<string> thumbnailTitles);
void RemoveThumbnails(IList<string> thumbnailTitles);
void UpdateThumbnailSize(Size size); void UpdateThumbnailSize(Size size);
} }
} }

View File

@@ -4,7 +4,6 @@ using System.Drawing;
using System.Windows.Threading; using System.Windows.Threading;
using EveOPreview.Configuration; using EveOPreview.Configuration;
using EveOPreview.Mediator.Messages; using EveOPreview.Mediator.Messages;
using EveOPreview.Services;
using EveOPreview.View; using EveOPreview.View;
using MediatR; using MediatR;
@@ -71,8 +70,7 @@ namespace EveOPreview.Services
public void SetThumbnailState(IntPtr thumbnailId, bool hideAlways) public void SetThumbnailState(IntPtr thumbnailId, bool hideAlways)
{ {
IThumbnailView thumbnail; if (!this._thumbnailViews.TryGetValue(thumbnailId, out IThumbnailView thumbnail))
if (!this._thumbnailViews.TryGetValue(thumbnailId, out thumbnail))
{ {
return; return;
} }
@@ -191,7 +189,6 @@ namespace EveOPreview.Services
IntPtr foregroundWindowHandle = this._windowManager.GetForegroundWindowHandle(); IntPtr foregroundWindowHandle = this._windowManager.GetForegroundWindowHandle();
List<string> viewsAdded = new List<string>(); List<string> viewsAdded = new List<string>();
List<string> viewsUpdated = new List<string>();
List<string> viewsRemoved = new List<string>(); List<string> viewsRemoved = new List<string>();
foreach (IProcessInfo process in addedProcesses) foreach (IProcessInfo process in addedProcesses)
@@ -247,15 +244,13 @@ namespace EveOPreview.Services
if (process.Title != view.Title) // update thumbnail title if (process.Title != view.Title) // update thumbnail title
{ {
viewsRemoved.Add(view.Title);
view.Title = process.Title; view.Title = process.Title;
viewsAdded.Add(view.Title);
view.RegisterHotkey(this._configuration.GetClientHotkey(process.Title)); view.RegisterHotkey(this._configuration.GetClientHotkey(process.Title));
this.ApplyClientLayout(view.Id, view.Title); this.ApplyClientLayout(view.Id, view.Title);
if (view.Title != ThumbnailManager.DefaultClientTitle)
{
viewsUpdated.Add(view.Title);
}
} }
if (process.Handle == foregroundWindowHandle) if (process.Handle == foregroundWindowHandle)
@@ -270,6 +265,10 @@ namespace EveOPreview.Services
IThumbnailView view = this._thumbnailViews[process.Handle]; IThumbnailView view = this._thumbnailViews[process.Handle];
this._thumbnailViews.Remove(view.Id); this._thumbnailViews.Remove(view.Id);
if (view.Title != ThumbnailManager.DefaultClientTitle)
{
viewsRemoved.Add(view.Title);
}
view.UnregisterHotkey(); view.UnregisterHotkey();
@@ -280,26 +279,11 @@ namespace EveOPreview.Services
view.ThumbnailActivated = null; view.ThumbnailActivated = null;
view.Close(); view.Close();
if (view.Title != ThumbnailManager.DefaultClientTitle)
{
viewsRemoved.Add(view.Title);
}
} }
if (viewsAdded.Count > 0) if ((viewsAdded.Count > 0) || (viewsRemoved.Count > 0))
{ {
await this._mediator.Publish(new ThumbnailListUpdated(ThumbnailListUpdated.UpdateKind.Add, viewsAdded)); await this._mediator.Publish(new ThumbnailListUpdated(viewsAdded, viewsRemoved));
}
if (viewsUpdated.Count > 0)
{
await this._mediator.Publish(new ThumbnailListUpdated(ThumbnailListUpdated.UpdateKind.Update, viewsUpdated));
}
if (viewsRemoved.Count > 0)
{
await this._mediator.Publish(new ThumbnailListUpdated(ThumbnailListUpdated.UpdateKind.Remove, viewsRemoved));
} }
} }

View File

@@ -2,7 +2,6 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Windows.Forms; using System.Windows.Forms;
using EveOPreview.UI;
namespace EveOPreview.View namespace EveOPreview.View
{ {
@@ -208,11 +207,6 @@ namespace EveOPreview.View
public void AddThumbnails(IList<IThumbnailDescription> thumbnails) public void AddThumbnails(IList<IThumbnailDescription> thumbnails)
{ {
if (thumbnails.Count == 0)
{
return;
}
this.ThumbnailsList.BeginUpdate(); this.ThumbnailsList.BeginUpdate();
foreach (IThumbnailDescription view in thumbnails) foreach (IThumbnailDescription view in thumbnails)
@@ -223,22 +217,8 @@ namespace EveOPreview.View
this.ThumbnailsList.EndUpdate(); this.ThumbnailsList.EndUpdate();
} }
public void UpdateThumbnails(IList<IThumbnailDescription> thumbnails)
{
// Just trigger redraw
if (thumbnails.Count > 0)
{
this.ThumbnailsList.Invalidate();
}
}
public void RemoveThumbnails(IList<IThumbnailDescription> thumbnails) public void RemoveThumbnails(IList<IThumbnailDescription> thumbnails)
{ {
if (thumbnails.Count == 0)
{
return;
}
this.ThumbnailsList.BeginUpdate(); this.ThumbnailsList.BeginUpdate();
foreach (IThumbnailDescription view in thumbnails) foreach (IThumbnailDescription view in thumbnails)

View File

@@ -1,6 +1,6 @@
namespace EveOPreview.View namespace EveOPreview.View
{ {
sealed class ThumbnailDescription sealed class ThumbnailDescription : IThumbnailDescription
{ {
public ThumbnailDescription(string title, bool isDisabled) public ThumbnailDescription(string title, bool isDisabled)
{ {

View File

@@ -1,4 +1,4 @@
namespace EveOPreview.UI namespace EveOPreview.View
{ {
partial class ThumbnailOverlay partial class ThumbnailOverlay
{ {

View File

@@ -2,7 +2,7 @@
using System.Windows.Forms; using System.Windows.Forms;
using EveOPreview.Services; using EveOPreview.Services;
namespace EveOPreview.UI namespace EveOPreview.View
{ {
public partial class ThumbnailOverlay : Form public partial class ThumbnailOverlay : Form
{ {

View File

@@ -1,4 +1,4 @@
namespace EveOPreview.UI namespace EveOPreview.View
{ {
partial class ThumbnailView partial class ThumbnailView
{ {

View File

@@ -4,9 +4,8 @@ using System.Drawing;
using System.Windows.Forms; using System.Windows.Forms;
using EveOPreview.Services; using EveOPreview.Services;
using EveOPreview.UI.Hotkeys; using EveOPreview.UI.Hotkeys;
using EveOPreview.View;
namespace EveOPreview.UI namespace EveOPreview.View
{ {
public partial class ThumbnailView : Form, IThumbnailView public partial class ThumbnailView : Form, IThumbnailView
{ {

View File

@@ -40,7 +40,6 @@ namespace EveOPreview.View
void Minimize(); void Minimize();
void AddThumbnails(IList<IThumbnailDescription> thumbnails); void AddThumbnails(IList<IThumbnailDescription> thumbnails);
void UpdateThumbnails(IList<IThumbnailDescription> thumbnails);
void RemoveThumbnails(IList<IThumbnailDescription> thumbnails); void RemoveThumbnails(IList<IThumbnailDescription> thumbnails);
void RefreshZoomSettings(); void RefreshZoomSettings();

View File

@@ -1,6 +1,4 @@
using System; namespace EveOPreview.View
namespace EveOPreview.View
{ {
public interface IThumbnailDescription public interface IThumbnailDescription
{ {