From fb60f225e67db6c548fc2c5dfbe172251993daba Mon Sep 17 00:00:00 2001 From: Samuel Nevala Date: Thu, 27 Aug 2015 09:17:05 +0300 Subject: winrt: Enable window visibility for the root window. - Minimized and Hidden: hide the status bar and collapse winrt native ui element. - Windowed and Maximized: show the status bar and re-size the window. - FullScreen and AutomaticVisibility: hide the status bar and re-size the window. Showing & hiding the status bar and re-sizing the window affect only the windows phone build. Change-Id: Iaa412382bffc14e470720f2213bb3f6851f57a6b Task-Id: QTBUG-47811 Reviewed-by: Andrew Knight --- src/plugins/platforms/winrt/qwinrtwindow.cpp | 79 ++++++++++++++++++++++------ 1 file changed, 62 insertions(+), 17 deletions(-) (limited to 'src/plugins/platforms/winrt/qwinrtwindow.cpp') diff --git a/src/plugins/platforms/winrt/qwinrtwindow.cpp b/src/plugins/platforms/winrt/qwinrtwindow.cpp index 634d62ef24..23e4e163e4 100644 --- a/src/plugins/platforms/winrt/qwinrtwindow.cpp +++ b/src/plugins/platforms/winrt/qwinrtwindow.cpp @@ -64,9 +64,22 @@ using namespace Microsoft::WRL::Wrappers; using namespace ABI::Windows::Foundation; using namespace ABI::Windows::Foundation::Collections; using namespace ABI::Windows::UI; +using namespace ABI::Windows::UI::Xaml; +using namespace ABI::Windows::UI::Xaml::Controls; QT_BEGIN_NAMESPACE +static void setUIElementVisibility(IUIElement *uiElement, bool visibility) +{ + Q_ASSERT(uiElement); + QEventDispatcherWinRT::runOnXamlThread([uiElement, visibility]() { + HRESULT hr; + hr = uiElement->put_Visibility(visibility ? Visibility_Visible : Visibility_Collapsed); + Q_ASSERT_SUCCEEDED(hr); + return S_OK; + }); +} + class QWinRTWindowPrivate { public: @@ -74,8 +87,11 @@ public: QSurfaceFormat surfaceFormat; QString windowTitle; + Qt::WindowState state; - ComPtr swapChainPanel; + ComPtr swapChainPanel; + ComPtr canvas; + ComPtr uiElement; }; QWinRTWindow::QWinRTWindow(QWindow *window) @@ -101,24 +117,26 @@ QWinRTWindow::QWinRTWindow(QWindow *window) d->surfaceFormat.setSwapBehavior(QSurfaceFormat::DoubleBuffer); HRESULT hr; + hr = RoGetActivationFactory(HString::MakeReference(RuntimeClass_Windows_UI_Xaml_Controls_Canvas).Get(), + IID_PPV_ARGS(&d->canvas)); + Q_ASSERT_SUCCEEDED(hr); hr = QEventDispatcherWinRT::runOnXamlThread([this, d]() { // Create a new swapchain and place it inside the canvas HRESULT hr; hr = RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_UI_Xaml_Controls_SwapChainPanel).Get(), &d->swapChainPanel); Q_ASSERT_SUCCEEDED(hr); - ComPtr uiElement; - hr = d->swapChainPanel.As(&uiElement); + hr = d->swapChainPanel.As(&d->uiElement); Q_ASSERT_SUCCEEDED(hr); - ComPtr canvas = d->screen->canvas(); - ComPtr panel; + ComPtr canvas = d->screen->canvas(); + ComPtr panel; hr = canvas.As(&panel); Q_ASSERT_SUCCEEDED(hr); - ComPtr> children; + ComPtr> children; hr = panel->get_Children(&children); Q_ASSERT_SUCCEEDED(hr); - hr = children->Append(uiElement.Get()); + hr = children->Append(d->uiElement.Get()); Q_ASSERT_SUCCEEDED(hr); return S_OK; }); @@ -134,20 +152,18 @@ QWinRTWindow::~QWinRTWindow() HRESULT hr; hr = QEventDispatcherWinRT::runOnXamlThread([d]() { HRESULT hr; - ComPtr canvas = d->screen->canvas(); - ComPtr panel; + ComPtr canvas = d->screen->canvas(); + ComPtr panel; hr = canvas.As(&panel); Q_ASSERT_SUCCEEDED(hr); - ComPtr> children; + ComPtr> children; hr = panel->get_Children(&children); Q_ASSERT_SUCCEEDED(hr); - ComPtr uiElement; - hr = d->swapChainPanel.As(&uiElement); Q_ASSERT_SUCCEEDED(hr); quint32 index; boolean found; - hr = children->IndexOf(uiElement.Get(), &index, &found); + hr = children->IndexOf(d->uiElement.Get(), &index, &found); Q_ASSERT_SUCCEEDED(hr); if (found) { hr = children->RemoveAt(index); @@ -181,7 +197,8 @@ void QWinRTWindow::setGeometry(const QRect &rect) Q_D(QWinRTWindow); if (window()->isTopLevel()) { - QPlatformWindow::setGeometry(d->screen->geometry()); + QPlatformWindow::setGeometry(window()->flags() & Qt::MaximizeUsingFullscreenGeometryHint + ? d->screen->geometry() : d->screen->availableGeometry()); QWindowSystemInterface::handleGeometryChange(window(), geometry()); } else { QPlatformWindow::setGeometry(rect); @@ -191,10 +208,16 @@ void QWinRTWindow::setGeometry(const QRect &rect) HRESULT hr; hr = QEventDispatcherWinRT::runOnXamlThread([this, d]() { HRESULT hr; + const QRect windowGeometry = geometry(); + const QPointF topLeft= QPointF(windowGeometry.topLeft()) / d->screen->scaleFactor(); + hr = d->canvas->SetTop(d->uiElement.Get(), topLeft.y()); + Q_ASSERT_SUCCEEDED(hr); + hr = d->canvas->SetLeft(d->uiElement.Get(), topLeft.x()); + Q_ASSERT_SUCCEEDED(hr); ComPtr frameworkElement; hr = d->swapChainPanel.As(&frameworkElement); Q_ASSERT_SUCCEEDED(hr); - const QSizeF size = QSizeF(geometry().size()) / d->screen->scaleFactor(); + const QSizeF size = QSizeF(windowGeometry.size()) / d->screen->scaleFactor(); hr = frameworkElement->put_Width(size.width()); Q_ASSERT_SUCCEEDED(hr); hr = frameworkElement->put_Height(size.height()); @@ -209,10 +232,13 @@ void QWinRTWindow::setVisible(bool visible) Q_D(QWinRTWindow); if (!window()->isTopLevel()) return; - if (visible) + if (visible) { d->screen->addWindow(window()); - else + setUIElementVisibility(d->uiElement.Get(), d->state != Qt::WindowMinimized); + } else { d->screen->removeWindow(window()); + setUIElementVisibility(d->uiElement.Get(), false); + } } void QWinRTWindow::setWindowTitle(const QString &title) @@ -249,4 +275,23 @@ qreal QWinRTWindow::devicePixelRatio() const return screen()->devicePixelRatio(); } +void QWinRTWindow::setWindowState(Qt::WindowState state) +{ + Q_D(QWinRTWindow); + if (d->state == state) + return; + +#ifdef Q_OS_WINPHONE + d->screen->setStatusBarVisibility(state == Qt::WindowMaximized || state == Qt::WindowNoState, window()); +#endif + + if (state == Qt::WindowMinimized) + setUIElementVisibility(d->uiElement.Get(), false); + + if (d->state == Qt::WindowMinimized) + setUIElementVisibility(d->uiElement.Get(), true); + + d->state = state; +} + QT_END_NAMESPACE -- cgit v1.2.3