Skip to content

Commit

Permalink
#512 Switch conductors to new close strategry
Browse files Browse the repository at this point in the history
  • Loading branch information
Nigel Sampson committed Jun 26, 2018
1 parent aa5e70b commit 578b2b8
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 62 deletions.
33 changes: 19 additions & 14 deletions src/Caliburn.Micro.Core/Conductor.cs
Expand Up @@ -23,39 +23,44 @@ public override async Task ActivateItemAsync(T item, CancellationToken cancellat
return;
}

CloseStrategy.Execute(new[] {ActiveItem}, (canClose, items) =>
var closeResult = await CloseStrategy.ExecuteAsync(new[] { ActiveItem }, cancellationToken);

if (closeResult.CloseCanOccur)
{
await ChangeActiveItemAsync(item, true, cancellationToken);
}
else
{
if (canClose)
ChangeActiveItemAsync(item, true, cancellationToken); // Temporary lack of await till we migration ICloseStrategy
else
OnActivationProcessed(item, false);
});
OnActivationProcessed(item, false);
}
}

/// <summary>
/// Deactivates the specified item.
/// </summary>
/// <param name="item">The item to close.</param>
/// <param name="close">Indicates whether or not to close the item after deactivating it.</param>
public override void DeactivateItem(T item, bool close)
public override async void DeactivateItem(T item, bool close)
{
if (item == null || !item.Equals(ActiveItem))
return;

CloseStrategy.Execute(new[] {ActiveItem}, (canClose, items) =>
var closeResult = await CloseStrategy.ExecuteAsync(new[] { ActiveItem }, CancellationToken.None);

if (closeResult.CloseCanOccur)
{
if (canClose)
ChangeActiveItemAsync(default(T), close); // Temporary lack of await till we migration ICloseStrategy
});
await ChangeActiveItemAsync(default(T), close);
}
}

/// <summary>
/// Called to check whether or not this instance can close.
/// </summary>
/// <param name="callback">The implementor calls this action with the result of the close check.</param>
public override void CanClose(Action<bool> callback)
public override async Task<bool> CanCloseAsync(CancellationToken cancellationToken)
{
CloseStrategy.Execute(new[] {ActiveItem}, (canClose, items) => callback(canClose));
var closeResult = await CloseStrategy.ExecuteAsync(new[] { ActiveItem }, cancellationToken);

return closeResult.CloseCanOccur;
}

/// <summary>
Expand Down
30 changes: 15 additions & 15 deletions src/Caliburn.Micro.Core/ConductorWithCollectionAllActive.cs
Expand Up @@ -87,18 +87,17 @@ protected override void OnDeactivate(bool close)
/// Called to check whether or not this instance can close.
/// </summary>
/// <param name="callback">The implementor calls this action with the result of the close check.</param>
public override void CanClose(Action<bool> callback)
public override async Task<bool> CanCloseAsync(CancellationToken cancellationToken)
{
CloseStrategy.Execute(_items.ToList(), (canClose, closable) =>
var closeResult = await CloseStrategy.ExecuteAsync(_items.ToList(), cancellationToken);

if (!closeResult.CloseCanOccur && closeResult.Children.Any())
{
if (!canClose && closable.Any())
{
closable.OfType<IDeactivate>().Apply(x => x.Deactivate(true));
_items.RemoveRange(closable);
}
closeResult.Children.OfType<IDeactivate>().Apply(x => x.Deactivate(true));
_items.RemoveRange(closeResult.Children);
}

callback(canClose);
});
return closeResult.CloseCanOccur;
}

/// <summary>
Expand Down Expand Up @@ -137,17 +136,18 @@ public override async Task ActivateItemAsync(T item, CancellationToken cancellat
/// </summary>
/// <param name="item">The item to close.</param>
/// <param name="close">Indicates whether or not to close the item after deactivating it.</param>
public override void DeactivateItem(T item, bool close)
public override async void DeactivateItem(T item, bool close)
{
if (item == null)
return;

if (close)
CloseStrategy.Execute(new[] {item}, (canClose, closable) =>
{
if (canClose)
CloseItemCore(item);
});
{
var closeResult = await CloseStrategy.ExecuteAsync(new[] { item }, CancellationToken.None);

if (closeResult.CloseCanOccur)
CloseItemCore(item);
}
else
ScreenExtensions.TryDeactivate(item, false);
}
Expand Down
67 changes: 34 additions & 33 deletions src/Caliburn.Micro.Core/ConductorWithCollectionOneActive.cs
Expand Up @@ -84,19 +84,20 @@ public override async Task ActivateItemAsync(T item, CancellationToken cancellat
/// </summary>
/// <param name="item">The item to close.</param>
/// <param name="close">Indicates whether or not to close the item after deactivating it.</param>
public override void DeactivateItem(T item, bool close)
public override async void DeactivateItem(T item, bool close)
{
if (item == null)
return;

if (!close)
ScreenExtensions.TryDeactivate(item, false);
else
CloseStrategy.Execute(new[] {item}, (canClose, closable) =>
{
if (canClose)
CloseItemCore(item);
});
{
var closeResult = await CloseStrategy.ExecuteAsync(new[] { item }, CancellationToken.None);

if (closeResult.CloseCanOccur)
CloseItemCore(item);
}
}

private void CloseItemCore(T item)
Expand Down Expand Up @@ -139,39 +140,39 @@ protected virtual T DetermineNextItemToActivate(IList<T> list, int lastIndex)
/// <summary>
/// Called to check whether or not this instance can close.
/// </summary>
/// <param name="callback">The implementor calls this action with the result of the close check.</param>
public override void CanClose(Action<bool> callback)
public override async Task<bool> CanCloseAsync(CancellationToken cancellationToken)
{
CloseStrategy.Execute(_items.ToList(), (canClose, closable) =>
var closeResult = await CloseStrategy.ExecuteAsync(_items.ToList(), cancellationToken);

if (!closeResult.CloseCanOccur && closeResult.Children.Any())
{
if (!canClose && closable.Any())
var closable = closeResult.Children;

if (closable.Contains(ActiveItem))
{
if (closable.Contains(ActiveItem))
var list = _items.ToList();
var next = ActiveItem;
do
{
var list = _items.ToList();
var next = ActiveItem;
do
{
var previous = next;
next = DetermineNextItemToActivate(list, list.IndexOf(previous));
list.Remove(previous);
} while (closable.Contains(next));
var previousActive = ActiveItem;
ChangeActiveItemAsync(next, true); // Temporary lack of await till we migration ICloseStrategy
_items.Remove(previousActive);
var stillToClose = closable.ToList();
stillToClose.Remove(previousActive);
closable = stillToClose;
}
closable.OfType<IDeactivate>().Apply(x => x.Deactivate(true));
_items.RemoveRange(closable);
var previous = next;
next = DetermineNextItemToActivate(list, list.IndexOf(previous));
list.Remove(previous);
} while (closable.Contains(next));

var previousActive = ActiveItem;
await ChangeActiveItemAsync(next, true);
_items.Remove(previousActive);

var stillToClose = closable.ToList();
stillToClose.Remove(previousActive);
closable = stillToClose;
}

callback(canClose);
});
closable.OfType<IDeactivate>().Apply(x => x.Deactivate(true));
_items.RemoveRange(closable);
}

return closeResult.CloseCanOccur;
}

/// <summary>
Expand Down

0 comments on commit 578b2b8

Please sign in to comment.