74 lines
2.2 KiB
C++
74 lines
2.2 KiB
C++
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// Licensed under the MIT License.
|
|
|
|
//
|
|
// HorizontalNoOverflowStackPanel.xaml.cpp
|
|
// Implementation of the HorizontalNoOverflowStackPanel class
|
|
//
|
|
|
|
#include "pch.h"
|
|
#include "HorizontalNoOverflowStackPanel.h"
|
|
|
|
using namespace std;
|
|
using namespace CalculatorApp::Controls;
|
|
using namespace Windows::Foundation;
|
|
using namespace Windows::UI::Xaml::Automation;
|
|
using namespace Windows::UI::Xaml::Automation::Peers;
|
|
|
|
Size HorizontalNoOverflowStackPanel::MeasureOverride(Size availableSize)
|
|
{
|
|
float maxHeight = 0;
|
|
float width = 0;
|
|
for (auto child : Children)
|
|
{
|
|
child->Measure(Size(numeric_limits<float>::infinity(), numeric_limits<float>::infinity()));
|
|
maxHeight = max(maxHeight, child->DesiredSize.Height);
|
|
width += child->DesiredSize.Width;
|
|
}
|
|
return Size(min(width, availableSize.Width), min(availableSize.Height, maxHeight));
|
|
}
|
|
|
|
bool HorizontalNoOverflowStackPanel::ShouldPrioritizeLastItem()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
Size HorizontalNoOverflowStackPanel::ArrangeOverride(Size finalSize)
|
|
{
|
|
if (Children->Size == 0)
|
|
{
|
|
return finalSize;
|
|
}
|
|
|
|
float posX = 0;
|
|
auto lastChild = Children->GetAt(Children->Size - 1);
|
|
float lastChildWidth = 0;
|
|
if (Children->Size > 2 && ShouldPrioritizeLastItem())
|
|
{
|
|
lastChildWidth = lastChild->DesiredSize.Width;
|
|
}
|
|
for (auto item : Children)
|
|
{
|
|
auto widthAvailable = finalSize.Width - posX;
|
|
if (item != lastChild)
|
|
{
|
|
widthAvailable -= lastChildWidth;
|
|
}
|
|
float itemWidth = item->DesiredSize.Width;
|
|
if (widthAvailable > 0 && itemWidth <= widthAvailable)
|
|
{
|
|
// stack the items horizontally (left to right)
|
|
item->Arrange(Rect(posX, 0, itemWidth, finalSize.Height));
|
|
AutomationProperties::SetAccessibilityView(item, ::AccessibilityView::Content);
|
|
posX += item->RenderSize.Width;
|
|
}
|
|
else
|
|
{
|
|
// Not display the item
|
|
item->Arrange(Rect(0, 0, 0, 0));
|
|
AutomationProperties::SetAccessibilityView(item, ::AccessibilityView::Raw);
|
|
}
|
|
}
|
|
return finalSize;
|
|
}
|