Skip to content

Commit 13943f4

Browse files
author
RebeccaAnne
authored
Toggle input in c++/winrt! (#6303)
* Toggle input in c++/winrt! * PR Feedback * Fix return value
1 parent ce47f49 commit 13943f4

File tree

13 files changed

+325
-32027
lines changed

13 files changed

+325
-32027
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
3+
"type": "AdaptiveCard",
4+
"version": "1.0",
5+
"body": [
6+
{
7+
"type": "Input.Toggle",
8+
"id": "acceptTerms",
9+
"title": "I accept the terms and agreements",
10+
"value": "true",
11+
"valueOn": "true",
12+
"valueOff": "false",
13+
"label": "Please check the box below to accept the terms and agreements:",
14+
"isRequired": true,
15+
"errorMessage": "You must accept the terms to continue."
16+
}
17+
],
18+
"actions": [
19+
{
20+
"type": "Action.Submit",
21+
"title": "OK"
22+
}
23+
]
24+
}

source/uwp/AdaptiveCardsObjectModel/AdaptiveCards.ObjectModel.Uwp.h

Lines changed: 0 additions & 31879 deletions
This file was deleted.

source/uwp/Renderer/idl/AdaptiveCards.Rendering.Uwp.idl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ namespace AdaptiveCards
429429

430430
runtimeclass AdaptiveElementRendererRegistration
431431
{
432-
void Set(String type, IAdaptiveElementRenderer parser);
432+
void Set(String type, IAdaptiveElementRenderer renderer);
433433
IAdaptiveElementRenderer Get(String type);
434434
void Remove(String type);
435435
};
@@ -438,7 +438,7 @@ namespace AdaptiveCards
438438
{
439439
AdaptiveActionRendererRegistration();
440440

441-
void Set(String type, IAdaptiveActionRenderer parser);
441+
void Set(String type, IAdaptiveActionRenderer renderer);
442442
IAdaptiveActionRenderer Get(String type);
443443
void Remove(String type);
444444
};

source/uwp/Renderer/lib/AdaptiveToggleInputRenderer.cpp

Lines changed: 38 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -4,92 +4,57 @@
44

55
#include "AdaptiveToggleInputRenderer.h"
66

7-
using namespace Microsoft::WRL;
8-
using namespace Microsoft::WRL::Wrappers;
9-
using namespace ABI::AdaptiveCards::Rendering::Uwp;
10-
using namespace ABI::AdaptiveCards::ObjectModel::Uwp;
11-
using namespace ABI::Windows::Foundation;
12-
using namespace ABI::Windows::Foundation::Collections;
13-
using namespace ABI::Windows::UI::Xaml;
14-
using namespace ABI::Windows::UI::Xaml::Controls;
15-
using namespace ABI::Windows::UI::Xaml::Controls::Primitives;
7+
namespace Xaml
8+
{
9+
using namespace winrt::Windows::UI::Xaml;
10+
}
1611

17-
namespace AdaptiveCards::Rendering::Uwp
12+
namespace XamlHelpers
1813
{
19-
HRESULT AdaptiveToggleInputRenderer::RuntimeClassInitialize() noexcept
20-
try
21-
{
22-
return S_OK;
23-
}
24-
CATCH_RETURN;
14+
using namespace AdaptiveCards::Rendering::Uwp::XamlHelpers;
15+
}
16+
17+
using namespace winrt::AdaptiveCards::ObjectModel::Uwp;
18+
using namespace winrt::AdaptiveCards::Rendering::Uwp;
2519

26-
HRESULT AdaptiveToggleInputRenderer::Render(_In_ IAdaptiveCardElement* adaptiveCardElement,
27-
_In_ IAdaptiveRenderContext* renderContext,
28-
_In_ IAdaptiveRenderArgs* renderArgs,
29-
_COM_Outptr_ IUIElement** toggleInputControl) noexcept
30-
try
20+
namespace winrt::AdaptiveCards::Rendering::Uwp::implementation
21+
{
22+
Xaml::UIElement AdaptiveToggleInputRenderer::Render(IAdaptiveCardElement cardElement,
23+
AdaptiveRenderContext renderContext,
24+
AdaptiveRenderArgs renderArgs)
3125
{
32-
ComPtr<IAdaptiveHostConfig> hostConfig;
33-
RETURN_IF_FAILED(renderContext->get_HostConfig(&hostConfig));
34-
if (!XamlHelpers::SupportsInteractivity(hostConfig.Get()))
26+
if (!renderContext.HostConfig().SupportsInteractivity())
3527
{
36-
renderContext->AddWarning(
37-
ABI::AdaptiveCards::ObjectModel::Uwp::WarningStatusCode::InteractivityNotSupported,
38-
HStringReference(L"Toggle Input was stripped from card because interactivity is not supported").Get());
39-
return S_OK;
40-
}
28+
renderContext.AddWarning(winrt::AdaptiveCards::ObjectModel::Uwp::WarningStatusCode::InteractivityNotSupported,
29+
L"Toggle Input was stripped from card because interactivity is not supported");
4130

42-
ComPtr<IAdaptiveCardElement> cardElement(adaptiveCardElement);
43-
ComPtr<IAdaptiveToggleInput> adaptiveToggleInput;
44-
RETURN_IF_FAILED(cardElement.As(&adaptiveToggleInput));
45-
46-
ComPtr<ICheckBox> checkBox =
47-
XamlHelpers::CreateABIClass<ICheckBox>(HStringReference(RuntimeClass_Windows_UI_Xaml_Controls_CheckBox));
48-
49-
HString title;
50-
RETURN_IF_FAILED(adaptiveToggleInput->get_Title(title.GetAddressOf()));
51-
52-
boolean wrap;
53-
adaptiveToggleInput->get_Wrap(&wrap);
54-
55-
XamlHelpers::SetContent(checkBox.Get(), title.Get(), wrap);
56-
57-
HString value;
58-
RETURN_IF_FAILED(adaptiveToggleInput->get_Value(value.GetAddressOf()));
59-
60-
HString valueOn;
61-
RETURN_IF_FAILED(adaptiveToggleInput->get_ValueOn(valueOn.GetAddressOf()));
62-
63-
INT32 compareValueOn;
64-
RETURN_IF_FAILED(WindowsCompareStringOrdinal(value.Get(), valueOn.Get(), &compareValueOn));
31+
return nullptr;
32+
}
6533

66-
XamlHelpers::SetToggleValue(checkBox.Get(), (compareValueOn == 0));
34+
AdaptiveToggleInput toggleInput = cardElement.as<AdaptiveToggleInput>();
6735

68-
ComPtr<IUIElement> checkboxAsUIElement;
69-
RETURN_IF_FAILED(checkBox.As(&checkboxAsUIElement));
70-
RETURN_IF_FAILED(XamlHelpers::AddHandledTappedEvent(checkboxAsUIElement.Get()));
36+
Xaml::Controls::CheckBox checkBox{};
37+
XamlHelpers::SetContent(checkBox, toggleInput.Title(), toggleInput.Wrap());
7138

72-
ComPtr<IFrameworkElement> frameworkElement;
73-
RETURN_IF_FAILED(checkBox.As(&frameworkElement));
74-
RETURN_IF_FAILED(frameworkElement->put_VerticalAlignment(ABI::Windows::UI::Xaml::VerticalAlignment_Top));
75-
RETURN_IF_FAILED(
76-
XamlHelpers::SetStyleFromResourceDictionary(renderContext, L"Adaptive.Input.Toggle", frameworkElement.Get()));
39+
checkBox.IsChecked(toggleInput.ValueOn() == toggleInput.Value());
40+
checkBox.VerticalAlignment(Xaml::VerticalAlignment::Top);
7741

78-
ComPtr<IAdaptiveInputElement> adapitveToggleInputAsAdaptiveInput;
79-
RETURN_IF_FAILED(adaptiveToggleInput.As(&adapitveToggleInputAsAdaptiveInput));
42+
// Add Tap handler that sets the event as handled so that it doesn't propagate to the parent containers.
43+
checkBox.Tapped([](IInspectable const& /* sender */, Xaml::Input::TappedRoutedEventArgs const& args)
44+
{ return args.Handled(true); });
8045

81-
ComPtr<IUIElement> inputLayout;
82-
ComPtr<IUIElement> validationError;
83-
RETURN_IF_FAILED(XamlHelpers::HandleInputLayoutAndValidation(
84-
adapitveToggleInputAsAdaptiveInput.Get(), checkboxAsUIElement.Get(), false, renderContext, &inputLayout, nullptr));
46+
XamlHelpers::SetStyleFromResourceDictionary(renderContext, L"Adaptive.Input.Toggle", checkBox);
47+
Xaml::UIElement inputLayout = XamlHelpers::HandleInputLayoutAndValidation(toggleInput, checkBox, false, renderContext);
8548

86-
ComPtr<ToggleInputValue> input;
87-
RETURN_IF_FAILED(MakeAndInitialize<ToggleInputValue>(&input, adaptiveToggleInput.Get(), checkBox.Get(), nullptr));
88-
RETURN_IF_FAILED(renderContext->AddInputValue(input.Get(), renderArgs));
49+
winrt::com_ptr<::AdaptiveCards::Rendering::Uwp::ToggleInputValue> inputValue;
50+
THROW_IF_FAILED(Microsoft::WRL::MakeAndInitialize<::AdaptiveCards::Rendering::Uwp::ToggleInputValue>(
51+
inputValue.put(),
52+
toggleInput.as<ABI::AdaptiveCards::ObjectModel::Uwp::IAdaptiveToggleInput>().get(),
53+
checkBox.as<ABI::Windows::UI::Xaml::Controls::ICheckBox>().get(),
54+
nullptr));
8955

90-
RETURN_IF_FAILED(inputLayout.CopyTo(toggleInputControl));
56+
renderContext.AddInputValue(inputValue.as<IAdaptiveInputValue>(), renderArgs);
9157

92-
return S_OK;
58+
return inputLayout;
9359
}
94-
CATCH_RETURN;
9560
}
Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,24 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT License.
33
#pragma once
4+
#include "AdaptiveToggleInputRenderer.g.h"
45

5-
#include "ToggleInput.h"
6-
7-
namespace AdaptiveCards::Rendering::Uwp
6+
namespace winrt::AdaptiveCards::Rendering::Uwp::implementation
87
{
9-
class AdaptiveToggleInputRenderer
10-
: public Microsoft::WRL::RuntimeClass<Microsoft::WRL::RuntimeClassFlags<Microsoft::WRL::RuntimeClassType::WinRtClassicComMix>,
11-
ABI::AdaptiveCards::Rendering::Uwp::IAdaptiveElementRenderer>
8+
struct AdaptiveToggleInputRenderer : AdaptiveToggleInputRendererT<AdaptiveToggleInputRenderer>
129
{
13-
AdaptiveRuntime(AdaptiveToggleInputRenderer);
14-
15-
public:
16-
HRESULT RuntimeClassInitialize() noexcept;
10+
AdaptiveToggleInputRenderer() = default;
1711

18-
IFACEMETHODIMP Render(_In_ ABI::AdaptiveCards::ObjectModel::Uwp::IAdaptiveCardElement* cardElement,
19-
_In_ ABI::AdaptiveCards::Rendering::Uwp::IAdaptiveRenderContext* renderContext,
20-
_In_ ABI::AdaptiveCards::Rendering::Uwp::IAdaptiveRenderArgs* renderArgs,
21-
_COM_Outptr_ ABI::Windows::UI::Xaml::IUIElement** result) noexcept override;
12+
winrt::Windows::UI::Xaml::UIElement Render(winrt::AdaptiveCards::ObjectModel::Uwp::IAdaptiveCardElement,
13+
winrt::AdaptiveCards::Rendering::Uwp::AdaptiveRenderContext,
14+
winrt::AdaptiveCards::Rendering::Uwp::AdaptiveRenderArgs);
2215
};
16+
}
2317

24-
ActivatableClass(AdaptiveToggleInputRenderer);
18+
namespace winrt::AdaptiveCards::Rendering::Uwp::factory_implementation
19+
{
20+
struct AdaptiveToggleInputRenderer
21+
: AdaptiveToggleInputRendererT<AdaptiveToggleInputRenderer, implementation::AdaptiveToggleInputRenderer>
22+
{
23+
};
2524
}

source/uwp/Renderer/lib/Util.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,8 +295,6 @@ namespace AdaptiveCards::Rendering::Uwp
295295
Make<AdaptiveCards::Rendering::Uwp::AdaptiveTextInputRenderer>().Get()));
296296
RETURN_IF_FAILED(registration->Set(HStringReference(L"Input.Time").Get(),
297297
Make<AdaptiveCards::Rendering::Uwp::AdaptiveTimeInputRenderer>().Get()));
298-
RETURN_IF_FAILED(registration->Set(HStringReference(L"Input.Toggle").Get(),
299-
Make<AdaptiveCards::Rendering::Uwp::AdaptiveToggleInputRenderer>().Get()));
300298
RETURN_IF_FAILED(registration->Set(HStringReference(L"Media").Get(),
301299
Make<AdaptiveCards::Rendering::Uwp::AdaptiveMediaRenderer>().Get()));
302300
RETURN_IF_FAILED(registration->Set(HStringReference(L"RichTextBlock").Get(),
@@ -306,6 +304,16 @@ namespace AdaptiveCards::Rendering::Uwp
306304
RETURN_IF_FAILED(registration->Set(HStringReference(L"TextBlock").Get(),
307305
Make<AdaptiveCards::Rendering::Uwp::AdaptiveTextBlockRenderer>().Get()));
308306

307+
winrt::AdaptiveCards::Rendering::Uwp::IAdaptiveElementRenderer toggleRenderer =
308+
winrt::make<winrt::AdaptiveCards::Rendering::Uwp::implementation::AdaptiveToggleInputRenderer>();
309+
310+
winrt::com_ptr<ABI::AdaptiveCards::Rendering::Uwp::IAdaptiveElementRenderer> abiToggleRenderer
311+
{
312+
toggleRenderer.as<ABI::AdaptiveCards::Rendering::Uwp::IAdaptiveElementRenderer>()
313+
};
314+
315+
registration->Set(HStringReference(L"Input.Toggle").Get(), abiToggleRenderer.get());
316+
309317
return S_OK;
310318
}
311319

0 commit comments

Comments
 (0)