summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/winrt/qwinrtmessagedialoghelper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/winrt/qwinrtmessagedialoghelper.cpp')
-rw-r--r--src/plugins/platforms/winrt/qwinrtmessagedialoghelper.cpp247
1 files changed, 0 insertions, 247 deletions
diff --git a/src/plugins/platforms/winrt/qwinrtmessagedialoghelper.cpp b/src/plugins/platforms/winrt/qwinrtmessagedialoghelper.cpp
deleted file mode 100644
index 7016b47f7e..0000000000
--- a/src/plugins/platforms/winrt/qwinrtmessagedialoghelper.cpp
+++ /dev/null
@@ -1,247 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qwinrtmessagedialoghelper.h"
-#include "qwinrttheme.h"
-
-#include <QtGui/QTextDocument>
-#include <QtCore/qfunctions_winrt.h>
-#include <private/qeventdispatcher_winrt_p.h>
-
-#include <functional>
-#include <windows.ui.popups.h>
-#include <windows.foundation.h>
-#include <windows.foundation.collections.h>
-#include <wrl.h>
-
-using namespace ABI::Windows::Foundation;
-using namespace ABI::Windows::Foundation::Collections;
-using namespace ABI::Windows::UI::Popups;
-using namespace Microsoft::WRL;
-using namespace Microsoft::WRL::Wrappers;
-
-typedef IAsyncOperationCompletedHandler<IUICommand *> DialogCompletedHandler;
-
-QT_BEGIN_NAMESPACE
-
-class CommandId : public RuntimeClass<IInspectable>
-{
-public:
- CommandId(QPlatformDialogHelper::StandardButton button)
- : button(button) { }
- QPlatformDialogHelper::StandardButton button;
-};
-
-class QWinRTMessageDialogHelperPrivate
-{
-public:
- const QWinRTTheme *theme;
- bool shown;
- ComPtr<IAsyncInfo> info;
- QEventLoop loop;
-};
-
-QWinRTMessageDialogHelper::QWinRTMessageDialogHelper(const QWinRTTheme *theme)
- : QPlatformMessageDialogHelper(), d_ptr(new QWinRTMessageDialogHelperPrivate)
-{
- Q_D(QWinRTMessageDialogHelper);
-
- d->theme = theme;
- d->shown = false;
-}
-
-QWinRTMessageDialogHelper::~QWinRTMessageDialogHelper()
-{
- Q_D(QWinRTMessageDialogHelper);
-
- if (d->shown)
- hide();
-}
-
-void QWinRTMessageDialogHelper::exec()
-{
- Q_D(QWinRTMessageDialogHelper);
-
- if (!d->shown)
- show(Qt::Dialog, Qt::ApplicationModal, nullptr);
- d->loop.exec();
-}
-
-bool QWinRTMessageDialogHelper::show(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent)
-{
- Q_UNUSED(windowFlags)
- Q_UNUSED(windowModality)
- Q_UNUSED(parent)
- Q_D(QWinRTMessageDialogHelper);
-
- QSharedPointer<QMessageDialogOptions> options = this->options();
- if (!options.data())
- return false;
-
- const QString informativeText = options->informativeText();
- const QString title = options->windowTitle();
- const QString text = informativeText.isEmpty() ? options->text() : (options->text() + QLatin1Char('\n') + informativeText);
- if (Qt::mightBeRichText(text)) {
- qWarning("Rich text detected, defaulting to QtWidgets-based dialog.");
- return false;
- }
-
- HRESULT hr;
- ComPtr<IMessageDialogFactory> dialogFactory;
- hr = RoGetActivationFactory(HString::MakeReference(RuntimeClass_Windows_UI_Popups_MessageDialog).Get(),
- IID_PPV_ARGS(&dialogFactory));
- RETURN_FALSE_IF_FAILED("Failed to create dialog factory");
-
- ComPtr<IUICommandFactory> commandFactory;
- hr = RoGetActivationFactory(HString::MakeReference(RuntimeClass_Windows_UI_Popups_UICommand).Get(),
- IID_PPV_ARGS(&commandFactory));
- RETURN_FALSE_IF_FAILED("Failed to create command factory");
-
- ComPtr<IMessageDialog> dialog;
- HStringReference nativeText(reinterpret_cast<LPCWSTR>(text.utf16()),
- uint(text.size()));
- if (!title.isEmpty()) {
- HStringReference nativeTitle(reinterpret_cast<LPCWSTR>(title.utf16()),
- uint(title.size()));
- hr = dialogFactory->CreateWithTitle(nativeText.Get(), nativeTitle.Get(), &dialog);
- RETURN_FALSE_IF_FAILED("Failed to create dialog with title");
- } else {
- hr = dialogFactory->Create(nativeText.Get(), &dialog);
- RETURN_FALSE_IF_FAILED("Failed to create dialog");
- }
-
- hr = QEventDispatcherWinRT::runOnXamlThread([this, d, options, commandFactory, dialog]() {
- HRESULT hr;
-
- // Add Buttons
- ComPtr<IVector<IUICommand *>> dialogCommands;
- hr = dialog->get_Commands(&dialogCommands);
- RETURN_HR_IF_FAILED("Failed to get dialog commands");
-
- // If no button is specified we need to create one to get close notification
- int buttons = options->standardButtons();
- if (buttons == 0)
- buttons = Ok;
-
- for (int i = FirstButton; i < LastButton; i<<=1) {
- if (!(buttons & i))
- continue;
- // Add native command
- const QString label = d->theme->standardButtonText(i);
- HStringReference nativeLabel(reinterpret_cast<LPCWSTR>(label.utf16()),
- uint(label.size()));
- ComPtr<IUICommand> command;
- hr = commandFactory->Create(nativeLabel.Get(), &command);
- RETURN_HR_IF_FAILED("Failed to create message box command");
- ComPtr<IInspectable> id = Make<CommandId>(static_cast<StandardButton>(i));
- hr = command->put_Id(id.Get());
- RETURN_HR_IF_FAILED("Failed to set command ID");
- hr = dialogCommands->Append(command.Get());
- if (hr == E_BOUNDS) {
- qErrnoWarning(hr, "The WinRT message dialog supports a maximum of three buttons");
- continue;
- }
- RETURN_HR_IF_FAILED("Failed to append message box command");
- if (i == Abort || i == Cancel || i == Close) {
- quint32 size;
- hr = dialogCommands->get_Size(&size);
- RETURN_HR_IF_FAILED("Failed to get command list size");
- hr = dialog->put_CancelCommandIndex(size - 1);
- RETURN_HR_IF_FAILED("Failed to set cancel index");
- }
- }
-
- ComPtr<IAsyncOperation<IUICommand *>> op;
- hr = dialog->ShowAsync(&op);
- RETURN_HR_IF_FAILED("Failed to show dialog");
- hr = op->put_Completed(Callback<DialogCompletedHandler>(this, &QWinRTMessageDialogHelper::onCompleted).Get());
- RETURN_HR_IF_FAILED("Failed to set dialog callback");
- d->shown = true;
- hr = op.As(&d->info);
- RETURN_HR_IF_FAILED("Failed to acquire AsyncInfo for MessageDialog");
- return hr;
- });
-
- RETURN_FALSE_IF_FAILED("Failed to show dialog")
- return true;
-}
-
-void QWinRTMessageDialogHelper::hide()
-{
- Q_D(QWinRTMessageDialogHelper);
-
- if (!d->shown)
- return;
-
- HRESULT hr = d->info->Cancel();
- if (FAILED(hr))
- qErrnoWarning(hr, "Failed to cancel dialog operation");
-
- d->shown = false;
-}
-
-HRESULT QWinRTMessageDialogHelper::onCompleted(IAsyncOperation<IUICommand *> *asyncInfo, AsyncStatus status)
-{
- Q_UNUSED(status);
- Q_D(QWinRTMessageDialogHelper);
-
- QEventLoopLocker locker(&d->loop);
-
- d->shown = false;
-
- if (status == Canceled) {
- emit reject();
- return S_OK;
- }
-
- HRESULT hr;
- ComPtr<IUICommand> command;
- hr = asyncInfo->GetResults(&command);
- RETURN_OK_IF_FAILED("Failed to get command");
-
- ComPtr<CommandId> id;
- hr = command->get_Id(&id);
- RETURN_OK_IF_FAILED("Failed to get command ID");
-
- ButtonRole role = buttonRole(id->button);
- emit clicked(id->button, role);
- return S_OK;
-}
-
-QT_END_NAMESPACE