Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pilfer TypedEventHandlerExtensions from WCT #404

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/IconBox.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using Microsoft.CmdPal.UI.Deferred;
using Microsoft.CmdPal.UI.ViewModels;
using Microsoft.UI.Dispatching;
using Microsoft.UI.Xaml;
Expand Down Expand Up @@ -90,14 +91,14 @@ private static void OnSourceKeyPropertyChanged(DependencyObject d, DependencyPro
{
// TODO GH #239 switch back when using the new MD text block
// _ = @this._queue.EnqueueAsync(() =>
@this._queue.TryEnqueue(new(() =>
@this._queue.TryEnqueue(new(async () =>
{
var requestedTheme = @this.ActualTheme;
var eventArgs = new SourceRequestedEventArgs(e.NewValue, requestedTheme);

if (@this.SourceRequested != null)
{
@this.SourceRequested.Invoke(@this, eventArgs);
await @this.SourceRequested.InvokeAsync(@this, eventArgs);

@this.Source = eventArgs.Value;

Expand Down Expand Up @@ -131,7 +132,7 @@ private static void OnSourceKeyPropertyChanged(DependencyObject d, DependencyPro
// The range of MDL2 Icons isn't explicitly defined, but
// we're using this based off the table on:
// https://docs.microsoft.com/en-us/windows/uwp/design/style/segoe-ui-symbol-font
var isMDL2Icon = ch >= '\uE700' && ch <= '\uF8FF';
var isMDL2Icon = ch is >= '\uE700' and <= '\uF8FF';
if (!isMDL2Icon)
{
@this.Padding = new Thickness(-4);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using CommunityToolkit.Common.Deferred;
using Windows.Foundation;

// Pilfered from CommunityToolkit.WinUI.Deferred
namespace Microsoft.CmdPal.UI.Deferred;

/// <summary>
/// Extensions to <see cref="TypedEventHandler{TSender, TResult}"/> for Deferred Events.

Check failure

Code scanning / check-spelling

Unrecognized Spelling

[TSender](#security-tab) is not a recognized word. \(unrecognized-spelling\)

Check failure

Code scanning / check-spelling

Unrecognized Spelling

[TResult](#security-tab) is not a recognized word. \(unrecognized-spelling\)
/// </summary>
public static class TypedEventHandlerExtensions
{
/// <summary>
/// Use to invoke an async <see cref="TypedEventHandler{TSender, TResult}"/> using <see cref="DeferredEventArgs"/>.

Check failure

Code scanning / check-spelling

Unrecognized Spelling

[TSender](#security-tab) is not a recognized word. \(unrecognized-spelling\)

Check failure

Code scanning / check-spelling

Unrecognized Spelling

[TResult](#security-tab) is not a recognized word. \(unrecognized-spelling\)
/// </summary>
/// <typeparam name="S">Type of sender.</typeparam>
/// <typeparam name="R"><see cref="EventArgs"/> type.</typeparam>
/// <param name="eventHandler"><see cref="TypedEventHandler{TSender, TResult}"/> to be invoked.</param>

Check failure

Code scanning / check-spelling

Unrecognized Spelling

[TSender](#security-tab) is not a recognized word. \(unrecognized-spelling\)

Check failure

Code scanning / check-spelling

Unrecognized Spelling

[TResult](#security-tab) is not a recognized word. \(unrecognized-spelling\)
/// <param name="sender">Sender of the event.</param>
/// <param name="eventArgs"><see cref="EventArgs"/> instance.</param>
/// <returns><see cref="Task"/> to wait on deferred event handler.</returns>
#pragma warning disable CA1715 // Identifiers should have correct prefix
#pragma warning disable SA1314 // Type parameter names should begin with T
public static Task InvokeAsync<S, R>(this TypedEventHandler<S, R> eventHandler, S sender, R eventArgs)
#pragma warning restore SA1314 // Type parameter names should begin with T
#pragma warning restore CA1715 // Identifiers should have correct prefix
where R : DeferredEventArgs => InvokeAsync(eventHandler, sender, eventArgs, CancellationToken.None);

/// <summary>
/// Use to invoke an async <see cref="TypedEventHandler{TSender, TResult}"/> using <see cref="DeferredEventArgs"/> with a <see cref="CancellationToken"/>.

Check failure

Code scanning / check-spelling

Unrecognized Spelling

[TSender](#security-tab) is not a recognized word. \(unrecognized-spelling\)

Check failure

Code scanning / check-spelling

Unrecognized Spelling

[TResult](#security-tab) is not a recognized word. \(unrecognized-spelling\)
/// </summary>
/// <typeparam name="S">Type of sender.</typeparam>
/// <typeparam name="R"><see cref="EventArgs"/> type.</typeparam>
/// <param name="eventHandler"><see cref="TypedEventHandler{TSender, TResult}"/> to be invoked.</param>

Check failure

Code scanning / check-spelling

Unrecognized Spelling

[TSender](#security-tab) is not a recognized word. \(unrecognized-spelling\)

Check failure

Code scanning / check-spelling

Unrecognized Spelling

[TResult](#security-tab) is not a recognized word. \(unrecognized-spelling\)
/// <param name="sender">Sender of the event.</param>
/// <param name="eventArgs"><see cref="EventArgs"/> instance.</param>
/// <param name="cancellationToken"><see cref="CancellationToken"/> option.</param>
/// <returns><see cref="Task"/> to wait on deferred event handler.</returns>
#pragma warning disable CA1715 // Identifiers should have correct prefix
#pragma warning disable SA1314 // Type parameter names should begin with T
public static Task InvokeAsync<S, R>(this TypedEventHandler<S, R> eventHandler, S sender, R eventArgs, CancellationToken cancellationToken)
#pragma warning restore SA1314 // Type parameter names should begin with T
#pragma warning restore CA1715 // Identifiers should have correct prefix
where R : DeferredEventArgs
{
if (eventHandler == null)
{
return Task.CompletedTask;
}

var tasks = eventHandler.GetInvocationList()
.OfType<TypedEventHandler<S, R>>()
.Select(invocationDelegate =>
{
cancellationToken.ThrowIfCancellationRequested();

invocationDelegate(sender, eventArgs);

#pragma warning disable CS0618 // Type or member is obsolete
var deferral = eventArgs.GetCurrentDeferralAndReset();

return deferral?.WaitForCompletion(cancellationToken) ?? Task.CompletedTask;
#pragma warning restore CS0618 // Type or member is obsolete
})
.ToArray();

return Task.WhenAll(tasks);
}
}
Loading