in snipinsights/windows/SnipInsight/AppManager.cs [917:1080]
public async Task DeleteAsync(IEnumerable<SnipInsightLink> items, bool showConfirmation, bool raiseOutcomeTrigger)
{
ProgressControl progressMessage = null;
// Filter out items that are already in the process of deleting!
items = items.Where(i => i.DeletionPending == false).ToArray();
int itemCount = items.Count();
int failedCount = 0;
if (itemCount == 0)
{
// There is nothing to do
return;
}
try
{
// Mark all items as pending deletion
foreach (var item in items)
{
item.DeletionPending = true;
}
// Confirmation
bool hasMixIds = items.Any(i => i.MixId != null);
if (showConfirmation)
{
bool deleteConfirmed = ShowDeleteConfirmation(itemCount, hasMixIds);
if (!deleteConfirmed) // No was clicked.
{
// Restore pending items
foreach (var item in items)
{
item.DeletionPending = false;
}
if (raiseOutcomeTrigger)
{
ViewModel.StateMachine.Fire(SnipInsightTrigger.DeletionCancelled);
}
return;
}
}
//
// Do the actual delete
//
if (itemCount > 5 || hasMixIds)
{
// Only bother with the Progress Bar if we think it might be slow...
// A large number or we need to call the server...
progressMessage = new ProgressControl();
progressMessage.ShowInMainWindow();
}
// If the Selected Package was deleted, we'll keep track of it's location
int deletedSelectedPackageIndex = -1;
int processedCount = 0;
foreach (var item in items)
{
var deletedIndex = GetCurrentContentIndexInLibrary(item);
var success = DeleteCore(item);
processedCount++;
if (progressMessage != null)
{
progressMessage.SetProgress(processedCount / itemCount);
}
if (success == true)
{
if (ViewModel.SelectedPackage != null && ViewModel.SelectedPackage.Url == item.Url)
{
// We just deleted the Selected Package! Remember this so we can choose a replacement
deletedSelectedPackageIndex = deletedIndex;
ViewModel.SelectedPackage = null;
}
}
else
{
failedCount++;
// Restore the item so the user can try again
item.DeletionPending = false;
}
}
if (progressMessage != null)
{
progressMessage.Dismiss();
progressMessage = null;
}
//
// Restore Selected Package
//
if (deletedSelectedPackageIndex != -1)
{
// We deleted the SelectedPackage, so we need to restore it to something...
SelectPackageAfterDelete(deletedSelectedPackageIndex, raiseOutcomeTrigger);
}
else
{
if (raiseOutcomeTrigger)
{
// We don't currently have a state for DeletionCompleted, but Cancelled should
// leave us in the same place
ViewModel.StateMachine.Fire(SnipInsightTrigger.DeletionCancelled);
}
}
//
// Report any failures
//
if (failedCount > 0)
{
Diagnostics.LogTrace(string.Format("Deletion failed for {0} item(s).", failedCount));
ToastControl toast = new ToastControl(string.Format(Resources.Delete_Failed_List, failedCount));
toast.ShowInMainWindow();
if (raiseOutcomeTrigger)
{
ViewModel.StateMachine.Fire(SnipInsightTrigger.DeletionFailed);
}
}
}
catch (Exception ex)
{
if (progressMessage != null)
{
progressMessage.Dismiss();
progressMessage = null;
}
Diagnostics.ReportException(ex);
ToastControl toast = new ToastControl(Resources.Delete_Failed);
toast.ShowInMainWindow();
ViewModel.StateMachine.Fire(SnipInsightTrigger.DeletionFailed);
}
finally
{
//
// Restore all items.
// This is okay because those that were deleted should already be out of the list by now.
//
foreach (var item in items)
{
item.DeletionPending = false;
}
}
}