-
Notifications
You must be signed in to change notification settings - Fork 8.4k
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
Unify padding parsers, make SUI operate on struct Thickness
#18300
base: main
Are you sure you want to change the base?
Changes from 3 commits
3330bba
f2017ee
bbfdec6
6528401
529ef31
8fe23e6
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -288,4 +288,69 @@ std::vector<wil::com_ptr<T>> SafeArrayToOwningVector(SAFEARRAY* safeArray) | |
namespace nameSpace::factory_implementation \ | ||
{ \ | ||
BASIC_FACTORY(className); \ | ||
}\ | ||
} | ||
|
||
#ifdef WINRT_Windows_UI_Xaml_H | ||
|
||
inline ::winrt::hstring XamlThicknessToOptimalString(const ::winrt::Windows::UI::Xaml::Thickness& t) | ||
{ | ||
if (t.Left == t.Right) | ||
{ | ||
if (t.Top == t.Bottom) | ||
{ | ||
if (t.Top == t.Left) | ||
{ | ||
return ::winrt::hstring{ fmt::format(FMT_COMPILE(L"{}"), t.Left) }; | ||
} | ||
return ::winrt::hstring{ fmt::format(FMT_COMPILE(L"{},{}"), t.Left, t.Top) }; | ||
} | ||
// fall through | ||
} | ||
return ::winrt::hstring{ fmt::format(FMT_COMPILE(L"{},{},{},{}"), t.Left, t.Top, t.Right, t.Bottom) }; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. open Q: does this need a width specifier? |
||
} | ||
|
||
inline ::winrt::Windows::UI::Xaml::Thickness StringToXamlThickness(std::wstring_view padding) | ||
try | ||
{ | ||
uintptr_t count{ 0 }; | ||
double t[4]{ 0. }; // left, top, right, bottom | ||
wchar_t buf[17]; | ||
for (const auto& token : til::split_iterator{ padding, L',' }) | ||
{ | ||
const auto l{ std::min(token.size(), std::extent_v<decltype(buf)> - 1) }; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You can use There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. fair. done. |
||
#pragma warning(suppress : 26459) // You called an STL function '...' with a raw pointer parameter at position '...' that may be unsafe ... (stl.1). | ||
std::copy_n(token.data(), l, &buf[0]); // the length of buf is controlled for above | ||
til::at(buf, l) = L'\0'; | ||
til::at(t, count++) = std::wcstod(&buf[0], nullptr); | ||
DHowett marked this conversation as resolved.
Show resolved
Hide resolved
|
||
if (count >= 4) | ||
{ | ||
break; | ||
} | ||
} | ||
|
||
#pragma warning(push) | ||
#pragma warning(disable : 26446) // Prefer to use gsl::at() instead of unchecked subscript operator (bounds.4). | ||
DHowett marked this conversation as resolved.
Show resolved
Hide resolved
|
||
switch (count) | ||
{ | ||
case 1: // one input = all 4 values are the same | ||
t[1] = t[0]; // top = left | ||
__fallthrough; | ||
case 2: // two inputs = top/bottom and left/right are the same | ||
t[2] = t[0]; // right = left | ||
t[3] = t[1]; // bottom = top | ||
__fallthrough; | ||
case 4: // four inputs = fully specified | ||
break; | ||
default: | ||
return {}; | ||
} | ||
return { t[0], t[1], t[2], t[3] }; | ||
#pragma warning(pop) | ||
} | ||
catch (...) | ||
{ | ||
LOG_CAUGHT_EXCEPTION(); | ||
return {}; | ||
} | ||
|
||
#endif |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@lhecker I was so horribly indoctrinated at a young age - this can't STILL be right, can it?