summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaurice Kalinowski <maurice.kalinowski@theqtcompany.com>2015-09-24 21:35:18 +0200
committerMaurice Kalinowski <maurice.kalinowski@theqtcompany.com>2015-10-26 12:19:47 +0000
commit30d02f468fd3d85189c4afc6f84c1015927f43de (patch)
tree3d6529a8f18e22775297519d531c7e9165fbd61c
parent7532fb4e61fc4102fd11022f57f7d8195414167b (diff)
WinRT: Retrieve color settings on Windows 10
Windows 10 uses one enum for all target platforms. Use ApiInformationStatics to identify whether enum values are accessible at runtime. Change-Id: Ib77c9d2a2b5cf1655fbe7d937d0c83cc4cdd9ee9 Reviewed-by: Andrew Knight <andrew.knight@intopalo.com> Reviewed-by: Oliver Wolff <oliver.wolff@theqtcompany.com>
-rw-r--r--src/plugins/platforms/winrt/qwinrttheme.cpp185
1 files changed, 152 insertions, 33 deletions
diff --git a/src/plugins/platforms/winrt/qwinrttheme.cpp b/src/plugins/platforms/winrt/qwinrttheme.cpp
index c32ec8a151..7d09551f5b 100644
--- a/src/plugins/platforms/winrt/qwinrttheme.cpp
+++ b/src/plugins/platforms/winrt/qwinrttheme.cpp
@@ -44,7 +44,13 @@
#include <wrl.h>
#include <windows.ui.h>
#include <windows.ui.viewmanagement.h>
+#if _MSC_VER >= 1900
+#include <windows.foundation.metadata.h>
+using namespace ABI::Windows::Foundation::Metadata;
+#endif
+
using namespace Microsoft::WRL;
+using namespace Microsoft::WRL::Wrappers;
using namespace ABI::Windows::UI;
using namespace ABI::Windows::UI::ViewManagement;
@@ -73,102 +79,215 @@ static inline QColor fromColor(const Color &color)
return QColor(color.R, color.G, color.B, color.A);
}
-QWinRTTheme::QWinRTTheme()
- : d_ptr(new QWinRTThemePrivate)
+#if _MSC_VER >= 1900
+static bool uiColorSettings(const wchar_t *value, UIElementType type, Color *color)
{
- Q_D(QWinRTTheme);
+ static ComPtr<IApiInformationStatics> apiInformationStatics;
+ HRESULT hr;
+ if (!apiInformationStatics) {
+ hr = RoGetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Foundation_Metadata_ApiInformation).Get(),
+ IID_PPV_ARGS(&apiInformationStatics));
+ RETURN_FALSE_IF_FAILED("Could not get ApiInformationStatics");
+ }
+
+ static const HStringReference enumRef(L"Windows.UI.ViewManagement.UIElementType");
+ HStringReference valueRef(value);
+
+ boolean exists;
+ hr = apiInformationStatics->IsEnumNamedValuePresent(enumRef.Get(), valueRef.Get(), &exists);
+
+ if (hr != S_OK || !exists)
+ return false;
+
+ return SUCCEEDED(uiSettings()->UIElementColor(type, color));
+}
+
+static void nativeColorSettings(QPalette &p)
+{
+ Color color;
+
+ if (uiColorSettings(L"ActiveCaption", UIElementType_ActiveCaption, &color))
+ p.setColor(QPalette::ToolTipBase, fromColor(color));
+
+ if (uiColorSettings(L"Background", UIElementType_Background, &color))
+ p.setColor(QPalette::AlternateBase, fromColor(color));
+
+ if (uiColorSettings(L"ButtonFace", UIElementType_ButtonFace, &color)) {
+ p.setColor(QPalette::Button, fromColor(color));
+ p.setColor(QPalette::Midlight, fromColor(color).lighter(110));
+ p.setColor(QPalette::Light, fromColor(color).lighter(150));
+ p.setColor(QPalette::Mid, fromColor(color).dark(130));
+ p.setColor(QPalette::Dark, fromColor(color).dark(150));
+ }
+
+ if (uiColorSettings(L"ButtonText", UIElementType_ButtonText, &color)) {
+ p.setColor(QPalette::ButtonText, fromColor(color));
+ p.setColor(QPalette::Text, fromColor(color));
+ }
+
+ if (uiColorSettings(L"CaptionText", UIElementType_CaptionText, &color))
+ p.setColor(QPalette::ToolTipText, fromColor(color));
+
+ if (uiColorSettings(L"Highlight", UIElementType_Highlight, &color))
+ p.setColor(QPalette::Highlight, fromColor(color));
+
+ if (uiColorSettings(L"HighlightText", UIElementType_HighlightText, &color))
+ p.setColor(QPalette::HighlightedText, fromColor(color));
+
+ if (uiColorSettings(L"Window", UIElementType_Window, &color)) {
+ p.setColor(QPalette::Window, fromColor(color));
+ p.setColor(QPalette::Base, fromColor(color));
+ }
+
+ if (uiColorSettings(L"Hotlight", UIElementType_Hotlight, &color))
+ p.setColor(QPalette::BrightText, fromColor(color));
+
+ //Phone related
+ if (uiColorSettings(L"PopupBackground", UIElementType_PopupBackground, &color)) {
+ p.setColor(QPalette::ToolTipBase, fromColor(color));
+ p.setColor(QPalette::AlternateBase, fromColor(color));
+ }
+
+ if (uiColorSettings(L"NonTextMedium", UIElementType_NonTextMedium, &color))
+ p.setColor(QPalette::Button, fromColor(color));
+
+ if (uiColorSettings(L"NonTextMediumHigh", UIElementType_NonTextMediumHigh, &color))
+ p.setColor(QPalette::Midlight, fromColor(color));
+
+ if (uiColorSettings(L"NonTextHigh", UIElementType_NonTextHigh, &color))
+ p.setColor(QPalette::Light, fromColor(color));
+
+ if (uiColorSettings(L"NonTextMediumLow", UIElementType_NonTextMediumLow, &color))
+ p.setColor(QPalette::Mid, fromColor(color));
+
+ if (uiColorSettings(L"NonTextLow", UIElementType_NonTextLow, &color))
+ p.setColor(QPalette::Dark, fromColor(color));
+
+ if (uiColorSettings(L"TextHigh", UIElementType_TextHigh, &color)) {
+ p.setColor(QPalette::ButtonText, fromColor(color));
+ p.setColor(QPalette::Text, fromColor(color));
+ p.setColor(QPalette::WindowText, fromColor(color));
+ }
+
+ if (uiColorSettings(L"TextMedium", UIElementType_TextMedium, &color))
+ p.setColor(QPalette::ToolTipText, fromColor(color));
+
+ if (uiColorSettings(L"AccentColor", UIElementType_AccentColor, &color))
+ p.setColor(QPalette::Highlight, fromColor(color));
+ if (uiColorSettings(L"PageBackground", UIElementType_PageBackground, &color)) {
+ p.setColor(QPalette::Window, fromColor(color));
+ p.setColor(QPalette::Base, fromColor(color));
+ }
+
+ if (uiColorSettings(L"TextContrastWithHigh", UIElementType_TextContrastWithHigh, &color))
+ p.setColor(QPalette::BrightText, fromColor(color));
+}
+
+#else // _MSC_VER >= 1900
+
+static void nativeColorSettings(QPalette &p)
+{
HRESULT hr;
Color color;
#ifdef Q_OS_WINPHONE
hr = uiSettings()->UIElementColor(UIElementType_PopupBackground, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::ToolTipBase, fromColor(color));
- d->palette.setColor(QPalette::AlternateBase, fromColor(color));
+ p.setColor(QPalette::ToolTipBase, fromColor(color));
+ p.setColor(QPalette::AlternateBase, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_NonTextMedium, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::Button, fromColor(color));
+ p.setColor(QPalette::Button, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_NonTextMediumHigh, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::Midlight, fromColor(color));
+ p.setColor(QPalette::Midlight, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_NonTextHigh, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::Light, fromColor(color));
+ p.setColor(QPalette::Light, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_NonTextMediumLow, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::Mid, fromColor(color));
+ p.setColor(QPalette::Mid, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_NonTextLow, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::Dark, fromColor(color));
+ p.setColor(QPalette::Dark, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_TextHigh, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::ButtonText, fromColor(color));
- d->palette.setColor(QPalette::Text, fromColor(color));
- d->palette.setColor(QPalette::WindowText, fromColor(color));
+ p.setColor(QPalette::ButtonText, fromColor(color));
+ p.setColor(QPalette::Text, fromColor(color));
+ p.setColor(QPalette::WindowText, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_TextMedium, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::ToolTipText, fromColor(color));
+ p.setColor(QPalette::ToolTipText, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_AccentColor, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::Highlight, fromColor(color));
+ p.setColor(QPalette::Highlight, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_PageBackground, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::Window, fromColor(color));
- d->palette.setColor(QPalette::Base, fromColor(color));
+ p.setColor(QPalette::Window, fromColor(color));
+ p.setColor(QPalette::Base, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_TextContrastWithHigh, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::BrightText, fromColor(color));
+ p.setColor(QPalette::BrightText, fromColor(color));
#else
hr = uiSettings()->UIElementColor(UIElementType_ActiveCaption, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::ToolTipBase, fromColor(color));
+ p.setColor(QPalette::ToolTipBase, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_Background, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::AlternateBase, fromColor(color));
+ p.setColor(QPalette::AlternateBase, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_ButtonFace, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::Button, fromColor(color));
- d->palette.setColor(QPalette::Midlight, fromColor(color).lighter(110));
- d->palette.setColor(QPalette::Light, fromColor(color).lighter(150));
- d->palette.setColor(QPalette::Mid, fromColor(color).dark(130));
- d->palette.setColor(QPalette::Dark, fromColor(color).dark(150));
+ p.setColor(QPalette::Button, fromColor(color));
+ p.setColor(QPalette::Midlight, fromColor(color).lighter(110));
+ p.setColor(QPalette::Light, fromColor(color).lighter(150));
+ p.setColor(QPalette::Mid, fromColor(color).dark(130));
+ p.setColor(QPalette::Dark, fromColor(color).dark(150));
hr = uiSettings()->UIElementColor(UIElementType_ButtonText, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::ButtonText, fromColor(color));
- d->palette.setColor(QPalette::Text, fromColor(color));
+ p.setColor(QPalette::ButtonText, fromColor(color));
+ p.setColor(QPalette::Text, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_CaptionText, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::ToolTipText, fromColor(color));
+ p.setColor(QPalette::ToolTipText, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_Highlight, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::Highlight, fromColor(color));
+ p.setColor(QPalette::Highlight, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_HighlightText, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::HighlightedText, fromColor(color));
+ p.setColor(QPalette::HighlightedText, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_Window, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::Window, fromColor(color));
- d->palette.setColor(QPalette::Base, fromColor(color));
+ p.setColor(QPalette::Window, fromColor(color));
+ p.setColor(QPalette::Base, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_Hotlight, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::BrightText, fromColor(color));
+ p.setColor(QPalette::BrightText, fromColor(color));
#endif
}
+#endif // _MSC_VER < 1900
+
+QWinRTTheme::QWinRTTheme()
+ : d_ptr(new QWinRTThemePrivate)
+{
+ Q_D(QWinRTTheme);
+
+ nativeColorSettings(d->palette);
+}
bool QWinRTTheme::usePlatformNativeDialog(DialogType type) const
{