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

Cherry-Pick fix for issue #3819 for 1.2.8 patch release #3887

Merged
merged 3 commits into from
Mar 30, 2020
Merged
Show file tree
Hide file tree
Changes from all 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
2 changes: 1 addition & 1 deletion custom.props
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<VersionMajor>1</VersionMajor>
<VersionMinor>2</VersionMinor>
<!-- The nuget package version should be incremented when we produce QFEs -->
<NuGetPackVersion>1.2.7</NuGetPackVersion>
<NuGetPackVersion>1.2.8</NuGetPackVersion>
<VersionInfoProductName>AdaptiveCards</VersionInfoProductName>
</PropertyGroup>
</Project>
23 changes: 20 additions & 3 deletions source/uwp/Renderer/lib/ElementTagContent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,24 @@ using namespace ABI::Windows::UI::Xaml::Controls;

namespace AdaptiveNamespace
{
HRESULT ElementTagContent::RuntimeClassInitialize() { return S_OK; }

HRESULT ElementTagContent::RuntimeClassInitialize(_In_ IAdaptiveCardElement* cardElement,
_In_ IPanel* parentPanel,
_In_ IUIElement* separator,
_In_ IColumnDefinition* columnDefinition)
_In_ IColumnDefinition* columnDefinition,
boolean isStretchable)
{
ComPtr<IPanel> localParentPanel(parentPanel);
RETURN_IF_FAILED(localParentPanel.AsWeak(&m_parentPanel));
if (parentPanel != nullptr)
{
ComPtr<IPanel> localParentPanel(parentPanel);
RETURN_IF_FAILED(localParentPanel.AsWeak(&m_parentPanel));
}

m_columnDefinition = columnDefinition;
m_separator = separator;
m_cardElement = cardElement;
m_isStretchable = isStretchable;
return S_OK;
}

Expand All @@ -44,4 +51,14 @@ namespace AdaptiveNamespace
{
return m_parentPanel.CopyTo(parentPanel);
}
HRESULT ElementTagContent::get_IsStretchable(boolean* isStretchable)
{
*isStretchable = m_isStretchable;
return S_OK;
}
HRESULT ElementTagContent::put_IsStretchable(boolean isStretchable)
{
m_isStretchable = isStretchable;
return S_OK;
}
}
12 changes: 11 additions & 1 deletion source/uwp/Renderer/lib/ElementTagContent.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,26 +12,36 @@ namespace AdaptiveNamespace
virtual HRESULT get_AdaptiveCardElement(_COM_Outptr_ ABI::AdaptiveNamespace::IAdaptiveCardElement * *cardElement) = 0;
virtual HRESULT get_Separator(_COM_Outptr_ ABI::Windows::UI::Xaml::IUIElement * *separator) = 0;
virtual HRESULT get_ParentPanel(_COM_Outptr_ ABI::Windows::UI::Xaml::Controls::IPanel * *parentPanel) = 0;
virtual HRESULT get_IsStretchable(_Outptr_ boolean * isStretchable) = 0;
virtual HRESULT put_IsStretchable(boolean isStretchable) = 0;
};

class ElementTagContent
: public Microsoft::WRL::RuntimeClass<Microsoft::WRL::RuntimeClassFlags<Microsoft::WRL::RuntimeClassType::WinRtClassicComMix>, IElementTagContent>
{
public:
ElementTagContent() : m_isStretchable(false) {}

HRESULT RuntimeClassInitialize();

HRESULT RuntimeClassInitialize(_In_ ABI::AdaptiveNamespace::IAdaptiveCardElement* cardElement,
_In_ ABI::Windows::UI::Xaml::Controls::IPanel* parentPanel,
_In_ ABI::Windows::UI::Xaml::IUIElement* separator,
_In_ ABI::Windows::UI::Xaml::Controls::IColumnDefinition* columnDefinition);
_In_ ABI::Windows::UI::Xaml::Controls::IColumnDefinition* columnDefinition,
boolean isStretchable);

virtual HRESULT get_ColumnDefinition(_COM_Outptr_ ABI::Windows::UI::Xaml::Controls::IColumnDefinition** columnDefinition) override;
virtual HRESULT get_AdaptiveCardElement(_COM_Outptr_ ABI::AdaptiveNamespace::IAdaptiveCardElement** cardElement) override;
virtual HRESULT get_Separator(_COM_Outptr_ ABI::Windows::UI::Xaml::IUIElement** separator) override;
virtual HRESULT get_ParentPanel(_COM_Outptr_ ABI::Windows::UI::Xaml::Controls::IPanel** parentPanel) override;
virtual HRESULT get_IsStretchable(_Outptr_ boolean* isStretchable) override;
virtual HRESULT put_IsStretchable(boolean isStretchable) override;

private:
Microsoft::WRL::ComPtr<ABI::AdaptiveNamespace::IAdaptiveCardElement> m_cardElement;
Microsoft::WRL::ComPtr<ABI::Windows::UI::Xaml::Controls::IColumnDefinition> m_columnDefinition;
Microsoft::WRL::ComPtr<ABI::Windows::UI::Xaml::IUIElement> m_separator;
Microsoft::WRL::WeakRef m_parentPanel;
boolean m_isStretchable;
};
}
62 changes: 38 additions & 24 deletions source/uwp/Renderer/lib/WholeItemsPanel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include "pch.h"
#include "WholeItemsPanel.h"
#include "XamlHelpers.h"
#include "ElementTagContent.h"

using namespace std;
using namespace Microsoft::WRL;
Expand Down Expand Up @@ -251,12 +252,11 @@ namespace AdaptiveNamespace
RETURN_IF_FAILED(children->get_Size(&m_measuredCount));

float extraPaddingPerItem{};
if (!m_stretchableItems.empty())
if (m_stretchableItemCount != 0)
{
extraPaddingPerItem = floor((finalSize.Height - m_calculatedSize) / m_stretchableItems.size());
extraPaddingPerItem = floor((finalSize.Height - m_calculatedSize) / m_stretchableItemCount);
}

if (m_stretchableItems.empty())
else
{
if (m_verticalContentAlignment == ABI::AdaptiveNamespace::VerticalContentAlignment::Center)
{
Expand Down Expand Up @@ -399,36 +399,50 @@ namespace AdaptiveNamespace
void WholeItemsPanel::AddElementToStretchablesList(_In_ IUIElement* element)
{
ComPtr<IUIElement> localElement(element);
ComPtr<IUIElement4> elementWithAccessKey;
if (SUCCEEDED(localElement.As(&elementWithAccessKey)))
ComPtr<IFrameworkElement> elementAsFrameworkElement;
THROW_IF_FAILED(localElement.As(&elementAsFrameworkElement));

ComPtr<IInspectable> tagAsInspectable;
THROW_IF_FAILED(elementAsFrameworkElement->get_Tag(&tagAsInspectable));

ComPtr<IElementTagContent> elementTagContent;
if (tagAsInspectable != nullptr)
{
std::string elementAccessKey = std::to_string(m_accessKeyCount);
++m_accessKeyCount;
THROW_IF_FAILED(tagAsInspectable.As(&elementTagContent));
THROW_IF_FAILED(elementTagContent->put_IsStretchable(true));
}
else
{
ComPtr<IElementTagContent> tagContent;
THROW_IF_FAILED(MakeAndInitialize<ElementTagContent>(&tagContent));

HSTRING accessKey;
if (SUCCEEDED(UTF8ToHString(elementAccessKey, &accessKey)))
{
elementWithAccessKey->put_AccessKey(accessKey);
m_stretchableItems.insert(elementAccessKey);
}
THROW_IF_FAILED(tagContent->put_IsStretchable(true));

THROW_IF_FAILED(tagContent.As(&tagAsInspectable));
THROW_IF_FAILED(elementAsFrameworkElement->put_Tag(tagAsInspectable.Get()));
}

++m_stretchableItemCount;
}

bool WholeItemsPanel::IsUIElementInStretchableList(_In_ IUIElement* element)
{
ComPtr<IUIElement> localElement(element);
ComPtr<IUIElement4> elementWithAccessKey;
if (SUCCEEDED(localElement.As(&elementWithAccessKey)))
ComPtr<IUIElement> localUIElement(element);
ComPtr<IFrameworkElement> uiElementAsFrameworkElement;
THROW_IF_FAILED(localUIElement.As(&uiElementAsFrameworkElement));

ComPtr<IInspectable> tagAsInspectable;
THROW_IF_FAILED(uiElementAsFrameworkElement->get_Tag(&tagAsInspectable));

boolean isStretchable = false;
if (tagAsInspectable != nullptr)
{
HSTRING elementAccessKey;
if (SUCCEEDED(elementWithAccessKey->get_AccessKey(&elementAccessKey)))
{
std::string accessKey = HStringToUTF8(elementAccessKey);
return (m_stretchableItems.find(accessKey) != m_stretchableItems.end());
}
ComPtr<AdaptiveNamespace::IElementTagContent> tagContent;
THROW_IF_FAILED(tagAsInspectable.As(&tagContent));
THROW_IF_FAILED(tagContent->get_IsStretchable(&isStretchable));
}

return false; // Couldn't get access key, weird, so it wasnt found
return isStretchable;
}

void WholeItemsPanel::SetVerticalContentAlignment(_In_ ABI::AdaptiveNamespace::VerticalContentAlignment verticalContentAlignment)
Expand Down
3 changes: 1 addition & 2 deletions source/uwp/Renderer/lib/WholeItemsPanel.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,9 @@ namespace AdaptiveNamespace
unsigned int m_visibleCount{};
unsigned int m_measuredCount{};

unsigned int m_accessKeyCount{};
unsigned int m_stretchableItemCount{};
float m_calculatedSize{};
bool m_allElementsRendered{};
std::set<std::string> m_stretchableItems;
ABI::AdaptiveNamespace::VerticalContentAlignment m_verticalContentAlignment{};

// true if this represents the mainPanel.
Expand Down
7 changes: 4 additions & 3 deletions source/uwp/Renderer/lib/XamlBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -880,12 +880,13 @@ namespace AdaptiveNamespace
RETURN_IF_FAILED(newControlAsFrameworkElement->put_Name(id.Get()));
}

ABI::AdaptiveNamespace::HeightType heightType{};
RETURN_IF_FAILED(element->get_Height(&heightType));

ComPtr<ElementTagContent> tagContent;
RETURN_IF_FAILED(MakeAndInitialize<ElementTagContent>(&tagContent, element, parentPanel, separator, columnDefinition));
RETURN_IF_FAILED(MakeAndInitialize<ElementTagContent>(&tagContent, element, parentPanel, separator, columnDefinition, heightType == HeightType_Stretch));
RETURN_IF_FAILED(newControlAsFrameworkElement->put_Tag(tagContent.Get()));

ABI::AdaptiveNamespace::HeightType heightType{};
RETURN_IF_FAILED(element->get_Height(&heightType));
XamlHelpers::AppendXamlElementToPanel(newControl, parentPanel, heightType);

childCreatedCallback(newControl);
Expand Down