-
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 all commits
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 |
||
#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); | ||
Comment on lines
+322
to
+324
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. I believe this would need to do error checking to filter invalid inputs. |
||
if (count >= 4) | ||
{ | ||
break; | ||
} | ||
} | ||
|
||
#pragma warning(push) | ||
#pragma warning(disable : 26446) // Prefer to use gsl::at() instead of unchecked subscript operator (bounds.4). | ||
Comment on lines
+331
to
+332
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. Meh warning. I wish it would just check and see if the subscript index is constant... |
||
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?