Skip to content

Commit b0db841

Browse files
authored
Merge pull request #198 from Nfactor26/notification
Added notifications for feedback to users on errors or important events
2 parents a1b7b45 + 52f1073 commit b0db841

File tree

37 files changed

+906
-480
lines changed

37 files changed

+906
-480
lines changed

src/Pixel.Automation.AppExplorer.ViewModels/Application/ApplicationExplorerViewModel.cs

Lines changed: 52 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
using Caliburn.Micro;
22
using Dawn;
3+
using Notifications.Wpf.Core;
34
using Pixel.Automation.AppExplorer.ViewModels.Contracts;
45
using Pixel.Automation.Core.Interfaces;
56
using Pixel.Automation.Core.Models;
67
using Pixel.Automation.Editor.Core;
8+
using Pixel.Automation.Editor.Core.Helpers;
79
using Pixel.Persistence.Services.Client;
810
using Serilog;
911
using System.ComponentModel;
@@ -26,6 +28,7 @@ public class ApplicationExplorerViewModel : AnchorableHost
2628
private readonly ITypeProvider typeProvider;
2729
private readonly IApplicationDataManager applicationDataManager;
2830
private readonly IWindowManager windowManager;
31+
private readonly INotificationManager notificationManager;
2932

3033
/// <summary>
3134
/// Child views that are dependent on the selected application such as control explorer and prefab explorer
@@ -90,13 +93,14 @@ public ApplicationDescriptionViewModel SelectedApplication
9093
/// <param name="typeProvider"></param>
9194
/// <param name="childView"></param>
9295
public ApplicationExplorerViewModel(IEventAggregator eventAggregator, IApplicationDataManager applicationDataManager,
93-
ITypeProvider typeProvider, IEnumerable<IApplicationAware> childView, IWindowManager windowManager)
96+
ITypeProvider typeProvider, IEnumerable<IApplicationAware> childView, IWindowManager windowManager, INotificationManager notificationManager)
9497
{
9598
this.DisplayName = "Application Repository";
96-
this.eventAggregator = Guard.Argument(eventAggregator).NotNull().Value; ;
97-
this.typeProvider = Guard.Argument(typeProvider).NotNull().Value; ;
98-
this.applicationDataManager = Guard.Argument(applicationDataManager).NotNull().Value;
99-
this.windowManager = Guard.Argument(windowManager).NotNull().Value;
99+
this.eventAggregator = Guard.Argument(eventAggregator, nameof(eventAggregator)).NotNull().Value; ;
100+
this.typeProvider = Guard.Argument(typeProvider, nameof(typeProvider)).NotNull().Value; ;
101+
this.applicationDataManager = Guard.Argument(applicationDataManager, nameof(applicationDataManager)).NotNull().Value;
102+
this.windowManager = Guard.Argument(windowManager, nameof(windowManager)).NotNull().Value;
103+
this.notificationManager = Guard.Argument(notificationManager, nameof(notificationManager)).NotNull().Value;
100104
this.ChildViews.AddRange(childView);
101105
this.SelectedView = this.ChildViews[0];
102106

@@ -155,7 +159,7 @@ private void CreateCollectionView()
155159

156160
public void OpenApplication(ApplicationDescriptionViewModel applicationDescriptionViewModel)
157161
{
158-
Guard.Argument(applicationDescriptionViewModel).NotNull();
162+
Guard.Argument(applicationDescriptionViewModel, nameof(applicationDescriptionViewModel)).NotNull();
159163

160164
IsApplicationOpen = true;
161165
foreach (var childView in ChildViews)
@@ -186,33 +190,49 @@ public void GoBack()
186190

187191
public async Task AddApplication(KnownApplication knownApplication)
188192
{
189-
Guard.Argument(knownApplication).NotNull();
193+
try
194+
{
195+
Guard.Argument(knownApplication).NotNull();
190196

191-
IApplication application = (IApplication)Activator.CreateInstance(knownApplication.UnderlyingApplicationType);
197+
IApplication application = (IApplication)Activator.CreateInstance(knownApplication.UnderlyingApplicationType);
192198

193-
ApplicationDescription newApplication = new ApplicationDescription(application);
194-
var applicationDescriptionViewModel = new ApplicationDescriptionViewModel(newApplication);
195-
applicationDescriptionViewModel.AddScreen("Home");
196-
applicationDescriptionViewModel.ScreenCollection.SetActiveScreen("Home");
197-
if (string.IsNullOrEmpty(applicationDescriptionViewModel.ApplicationName))
199+
ApplicationDescription newApplication = new ApplicationDescription(application);
200+
var applicationDescriptionViewModel = new ApplicationDescriptionViewModel(newApplication);
201+
applicationDescriptionViewModel.AddScreen("Home");
202+
applicationDescriptionViewModel.ScreenCollection.SetActiveScreen("Home");
203+
if (string.IsNullOrEmpty(applicationDescriptionViewModel.ApplicationName))
204+
{
205+
applicationDescriptionViewModel.ApplicationName = $"{this.Applications.Count() + 1}";
206+
applicationDescriptionViewModel.ApplicationType = knownApplication.UnderlyingApplicationType.Name;
207+
}
208+
209+
this.Applications.Add(applicationDescriptionViewModel);
210+
this.SelectedApplication = applicationDescriptionViewModel;
211+
await SaveApplicationAsync(applicationDescriptionViewModel);
212+
await EditApplicationAsync(applicationDescriptionViewModel);
213+
NotifyOfPropertyChange(() => Applications);
214+
logger.Information("New application of type {0} has been added to the application repository", application.ToString());
215+
}
216+
catch (Exception ex)
198217
{
199-
applicationDescriptionViewModel.ApplicationName = $"{this.Applications.Count() + 1}";
200-
applicationDescriptionViewModel.ApplicationType = knownApplication.UnderlyingApplicationType.Name;
218+
logger.Error(ex, "There was an error while trying to add a '{0}' application", knownApplication.ToString());
219+
await notificationManager.ShowErrorNotificationAsync(ex);
201220
}
202-
203-
this.Applications.Add(applicationDescriptionViewModel);
204-
this.SelectedApplication = applicationDescriptionViewModel;
205-
await SaveApplicationAsync(applicationDescriptionViewModel);
206-
await EditApplicationAsync(applicationDescriptionViewModel);
207-
NotifyOfPropertyChange(() => Applications);
208-
logger.Information("New application of type {0} has been added to the application repository", application.ToString());
209221
}
210222

211223
public async Task EditApplicationAsync(ApplicationDescriptionViewModel applicationDescriptionViewModel)
212224
{
213225
await this.eventAggregator.PublishOnUIThreadAsync(new PropertyGridObjectEventArgs(applicationDescriptionViewModel.ApplicationDetails,
214226
async () => {
215-
await SaveApplicationAsync(applicationDescriptionViewModel);
227+
try
228+
{
229+
await SaveApplicationAsync(applicationDescriptionViewModel);
230+
}
231+
catch (Exception ex)
232+
{
233+
logger.Error(ex, "There was an error while trying to save application : '{0}' after edit", applicationDescriptionViewModel?.ApplicationName);
234+
await notificationManager.ShowErrorNotificationAsync(ex);
235+
}
216236
},
217237
() => {
218238
return true;
@@ -221,7 +241,7 @@ await this.eventAggregator.PublishOnUIThreadAsync(new PropertyGridObjectEventArg
221241

222242
public async Task SaveApplicationAsync(ApplicationDescriptionViewModel applicationDescriptionViewModel)
223243
{
224-
Guard.Argument(applicationDescriptionViewModel).NotNull();
244+
Guard.Argument(applicationDescriptionViewModel, nameof(applicationDescriptionViewModel)).NotNull();
225245
await this.applicationDataManager.AddOrUpdateApplicationAsync(applicationDescriptionViewModel.Model);
226246
logger.Information($"Saved application data for : {applicationDescriptionViewModel.ApplicationName}");
227247
await this.eventAggregator.PublishOnUIThreadAsync(new ApplicationUpdatedEventArgs(applicationDescriptionViewModel.ApplicationId));
@@ -236,9 +256,9 @@ public async Task SaveApplicationAsync(ApplicationDescriptionViewModel applicati
236256
/// <returns></returns>
237257
public async Task DeleteApplicationAsync(ApplicationDescriptionViewModel applicationDescriptionViewModel)
238258
{
239-
Guard.Argument(applicationDescriptionViewModel, nameof(applicationDescriptionViewModel)).NotNull();
240259
try
241260
{
261+
Guard.Argument(applicationDescriptionViewModel, nameof(applicationDescriptionViewModel)).NotNull();
242262
MessageBoxResult result = MessageBox.Show("Are you sure you want to delete this application?", "Confirm Delete", MessageBoxButton.OKCancel);
243263
if (result == MessageBoxResult.OK)
244264
{
@@ -248,7 +268,8 @@ public async Task DeleteApplicationAsync(ApplicationDescriptionViewModel applica
248268
}
249269
catch (Exception ex)
250270
{
251-
logger.Error(ex, ex.Message);
271+
logger.Error(ex, "There was an error while trying to delete application : '{0}'", applicationDescriptionViewModel?.ApplicationName);
272+
await notificationManager.ShowErrorNotificationAsync(ex);
252273
}
253274
}
254275

@@ -272,6 +293,7 @@ public async Task CreateScreen(ApplicationDescriptionViewModel applicationDescri
272293
catch (Exception ex)
273294
{
274295
logger.Error(ex, "There was an error while creating new screen");
296+
await notificationManager.ShowErrorNotificationAsync(ex);
275297
}
276298
}
277299

@@ -297,6 +319,7 @@ public async Task RenameScreen(ApplicationDescriptionViewModel applicationDescri
297319
catch (Exception ex)
298320
{
299321
logger.Error(ex, "There was an error while renaming the screen");
322+
await notificationManager.ShowErrorNotificationAsync(ex);
300323
}
301324
}
302325

@@ -351,6 +374,7 @@ public async Task RenameApplication(ActionExecutionContext context, ApplicationD
351374
if (this.Applications.Any(a => a.ApplicationName.Equals(newName)))
352375
{
353376
logger.Warning($"An application already exists with name {newName}.");
377+
await notificationManager.ShowErrorNotificationAsync($"An application already exists with name {newName}");
354378
return;
355379
}
356380
if (newName != applicationDescriptionViewModel.ApplicationName)
@@ -366,8 +390,9 @@ public async Task RenameApplication(ActionExecutionContext context, ApplicationD
366390
}
367391
catch (Exception ex)
368392
{
369-
logger.Error(ex, ex.Message);
393+
logger.Error(ex, "There was an error while trying to rename application : '{0}'", applicationDescriptionViewModel.ApplicationName);
370394
CanEdit = false;
395+
await notificationManager.ShowErrorNotificationAsync(ex);
371396
}
372397
}
373398

0 commit comments

Comments
 (0)