1// Copyright (C) 2017 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qquicklabsplatformmessagedialog_p.h"
5
6#include <QtQml/qqmlinfo.h>
7
8QT_BEGIN_NAMESPACE
9
10/*!
11 \qmltype MessageDialog
12 \inherits Dialog
13//! \instantiates QQuickLabsPlatformMessageDialog
14 \inqmlmodule Qt.labs.platform
15 \since 5.8
16 \brief A native message dialog.
17
18 The MessageDialog type provides a QML API for native platform message dialogs.
19
20 \image qtlabsplatform-messagedialog-android.png
21
22 A message dialog is used to inform the user, or ask the user a question.
23 A message dialog displays a primary \l text to alert the user to a situation,
24 an \l {informativeText}{informative text} to further explain the alert or to
25 ask the user a question, and an optional \l {detailedText}{detailed text} to
26 provide even more data if the user requests it. A message box can also display
27 a configurable set of \l buttons for accepting a user response.
28
29 To show a message dialog, construct an instance of MessageDialog, set the
30 desired properties, and call \l {Dialog::}{open()}.
31
32 \code
33 MessageDialog {
34 buttons: MessageDialog.Ok
35 text: "The document has been modified."
36 }
37 \endcode
38
39 The user must click the \uicontrol OK button to dismiss the message dialog.
40 A modal message dialog blocks the rest of the GUI until the message is
41 dismissed.
42
43 A more elaborate approach than just alerting the user to an event is to
44 also ask the user what to do about it. Store the question in the
45 \l {informativeText}{informative text} property, and specify the \l buttons
46 property to the set of buttons you want as the set of user responses. The
47 buttons are specified by combining values using the bitwise OR operator. The
48 display order for the buttons is platform dependent.
49
50 \code
51 MessageDialog {
52 text: "The document has been modified."
53 informativeText: "Do you want to save your changes?"
54 buttons: MessageDialog.Ok | MessageDialog.Cancel
55
56 onAccepted: document.save()
57 }
58 \endcode
59
60 \image qtlabsplatform-messagedialog-informative-android.png
61
62 The \l clicked() signal passes the information of which button was clicked.
63
64 A native platform message dialog is currently available on the following platforms:
65
66 \list
67 \li Android
68 \li iOS
69 \li macOS
70 \endlist
71
72 \input includes/widgets.qdocinc 1
73
74 \labs
75*/
76
77/*!
78 \qmlsignal Qt.labs.platform::MessageDialog::clicked(button)
79
80 This signal is emitted when a dialog \a button is clicked.
81
82 \sa buttons
83*/
84
85/*!
86 \qmlsignal Qt.labs.platform::MessageDialog::okClicked()
87
88 This signal is emitted when \uicontrol Ok is clicked.
89*/
90
91/*!
92 \qmlsignal Qt.labs.platform::MessageDialog::saveClicked()
93
94 This signal is emitted when \uicontrol Save is clicked.
95*/
96
97/*!
98 \qmlsignal Qt.labs.platform::MessageDialog::saveAllClicked()
99
100 This signal is emitted when \uicontrol {Save All} is clicked.
101*/
102
103/*!
104 \qmlsignal Qt.labs.platform::MessageDialog::openClicked()
105
106 This signal is emitted when \uicontrol Open is clicked.
107*/
108
109/*!
110 \qmlsignal Qt.labs.platform::MessageDialog::yesClicked()
111
112 This signal is emitted when \uicontrol Yes is clicked.
113*/
114
115/*!
116 \qmlsignal Qt.labs.platform::MessageDialog::yesToAllClicked()
117
118 This signal is emitted when \uicontrol {Yes To All} is clicked.
119*/
120
121/*!
122 \qmlsignal Qt.labs.platform::MessageDialog::noClicked()
123
124 This signal is emitted when \uicontrol No is clicked.
125*/
126
127/*!
128 \qmlsignal Qt.labs.platform::MessageDialog::noToAllClicked()
129
130 This signal is emitted when \uicontrol {No To All} is clicked.
131*/
132
133/*!
134 \qmlsignal Qt.labs.platform::MessageDialog::abortClicked()
135
136 This signal is emitted when \uicontrol Abort is clicked.
137*/
138
139/*!
140 \qmlsignal Qt.labs.platform::MessageDialog::retryClicked()
141
142 This signal is emitted when \uicontrol Retry is clicked.
143*/
144
145/*!
146 \qmlsignal Qt.labs.platform::MessageDialog::ignoreClicked()
147
148 This signal is emitted when \uicontrol Ignore is clicked.
149*/
150
151/*!
152 \qmlsignal Qt.labs.platform::MessageDialog::closeClicked()
153
154 This signal is emitted when \uicontrol Close is clicked.
155*/
156
157/*!
158 \qmlsignal Qt.labs.platform::MessageDialog::cancelClicked()
159
160 This signal is emitted when \uicontrol Cancel is clicked.
161*/
162
163/*!
164 \qmlsignal Qt.labs.platform::MessageDialog::discardClicked()
165
166 This signal is emitted when \uicontrol Discard is clicked.
167*/
168
169/*!
170 \qmlsignal Qt.labs.platform::MessageDialog::helpClicked()
171
172 This signal is emitted when \uicontrol Help is clicked.
173*/
174
175/*!
176 \qmlsignal Qt.labs.platform::MessageDialog::applyClicked()
177
178 This signal is emitted when \uicontrol Apply is clicked.
179*/
180
181/*!
182 \qmlsignal Qt.labs.platform::MessageDialog::resetClicked()
183
184 This signal is emitted when \uicontrol Reset is clicked.
185*/
186
187/*!
188 \qmlsignal Qt.labs.platform::MessageDialog::restoreDefaultsClicked()
189
190 This signal is emitted when \uicontrol {Restore Defaults} is clicked.
191*/
192
193QQuickLabsPlatformMessageDialog::QQuickLabsPlatformMessageDialog(QObject *parent)
194 : QQuickLabsPlatformDialog(QPlatformTheme::MessageDialog, parent),
195 m_options(QMessageDialogOptions::create())
196{
197}
198
199/*!
200 \qmlproperty string Qt.labs.platform::MessageDialog::text
201
202 This property holds the text to be displayed on the message dialog.
203
204 \sa informativeText, detailedText
205*/
206QString QQuickLabsPlatformMessageDialog::text() const
207{
208 return m_options->text();
209}
210
211void QQuickLabsPlatformMessageDialog::setText(const QString &text)
212{
213 if (m_options->text() == text)
214 return;
215
216 m_options->setText(text);
217 emit textChanged();
218}
219
220/*!
221 \qmlproperty string Qt.labs.platform::MessageDialog::informativeText
222
223 This property holds the informative text that provides a fuller description for the message.
224
225 Informative text can be used to expand upon the \l text to give more information to the user.
226
227 \sa text, detailedText
228*/
229QString QQuickLabsPlatformMessageDialog::informativeText() const
230{
231 return m_options->informativeText();
232}
233
234void QQuickLabsPlatformMessageDialog::setInformativeText(const QString &text)
235{
236 if (m_options->informativeText() == text)
237 return;
238
239 m_options->setInformativeText(text);
240 emit informativeTextChanged();
241}
242
243/*!
244 \qmlproperty string Qt.labs.platform::MessageDialog::detailedText
245
246 This property holds the text to be displayed in the details area.
247
248 \sa text, informativeText
249*/
250QString QQuickLabsPlatformMessageDialog::detailedText() const
251{
252 return m_options->detailedText();
253}
254
255void QQuickLabsPlatformMessageDialog::setDetailedText(const QString &text)
256{
257 if (m_options->detailedText() == text)
258 return;
259
260 m_options->setDetailedText(text);
261 emit detailedTextChanged();
262}
263
264/*!
265 \qmlproperty flags Qt.labs.platform::MessageDialog::buttons
266
267 This property holds a combination of buttons that are used by the message dialog.
268 The default value is \c MessageDialog.NoButton.
269
270 Possible flags:
271 \value MessageDialog.Ok An "OK" button defined with the \c AcceptRole.
272 \value MessageDialog.Open An "Open" button defined with the \c AcceptRole.
273 \value MessageDialog.Save A "Save" button defined with the \c AcceptRole.
274 \value MessageDialog.Cancel A "Cancel" button defined with the \c RejectRole.
275 \value MessageDialog.Close A "Close" button defined with the \c RejectRole.
276 \value MessageDialog.Discard A "Discard" or "Don't Save" button, depending on the platform, defined with the \c DestructiveRole.
277 \value MessageDialog.Apply An "Apply" button defined with the \c ApplyRole.
278 \value MessageDialog.Reset A "Reset" button defined with the \c ResetRole.
279 \value MessageDialog.RestoreDefaults A "Restore Defaults" button defined with the \c ResetRole.
280 \value MessageDialog.Help A "Help" button defined with the \c HelpRole.
281 \value MessageDialog.SaveAll A "Save All" button defined with the \c AcceptRole.
282 \value MessageDialog.Yes A "Yes" button defined with the \c YesRole.
283 \value MessageDialog.YesToAll A "Yes to All" button defined with the \c YesRole.
284 \value MessageDialog.No A "No" button defined with the \c NoRole.
285 \value MessageDialog.NoToAll A "No to All" button defined with the \c NoRole.
286 \value MessageDialog.Abort An "Abort" button defined with the \c RejectRole.
287 \value MessageDialog.Retry A "Retry" button defined with the \c AcceptRole.
288 \value MessageDialog.Ignore An "Ignore" button defined with the \c AcceptRole.
289 \value MessageDialog.NoButton The dialog has no buttons.
290
291 \sa clicked()
292*/
293QPlatformDialogHelper::StandardButtons QQuickLabsPlatformMessageDialog::buttons() const
294{
295 return m_options->standardButtons();
296}
297
298void QQuickLabsPlatformMessageDialog::setButtons(QPlatformDialogHelper::StandardButtons buttons)
299{
300 if (m_options->standardButtons() == buttons)
301 return;
302
303 m_options->setStandardButtons(buttons);
304 emit buttonsChanged();
305}
306
307void QQuickLabsPlatformMessageDialog::onCreate(QPlatformDialogHelper *dialog)
308{
309 if (QPlatformMessageDialogHelper *messageDialog = qobject_cast<QPlatformMessageDialogHelper *>(object: dialog)) {
310 connect(sender: messageDialog, signal: &QPlatformMessageDialogHelper::clicked, context: this, slot: &QQuickLabsPlatformMessageDialog::handleClick);
311 messageDialog->setOptions(m_options);
312 }
313}
314
315void QQuickLabsPlatformMessageDialog::onShow(QPlatformDialogHelper *dialog)
316{
317 m_options->setWindowTitle(title());
318 if (QPlatformMessageDialogHelper *messageDialog = qobject_cast<QPlatformMessageDialogHelper *>(object: dialog))
319 messageDialog->setOptions(m_options);
320}
321
322void QQuickLabsPlatformMessageDialog::handleClick(QPlatformDialogHelper::StandardButton button)
323{
324 done(result: button);
325 emit clicked(button);
326
327 switch (button) {
328 case QPlatformDialogHelper::Ok: emit okClicked(); break;
329 case QPlatformDialogHelper::Save: emit saveClicked(); break;
330 case QPlatformDialogHelper::SaveAll: emit saveAllClicked(); break;
331 case QPlatformDialogHelper::Open: emit openClicked(); break;
332 case QPlatformDialogHelper::Yes: emit yesClicked(); break;
333 case QPlatformDialogHelper::YesToAll: emit yesToAllClicked(); break;
334 case QPlatformDialogHelper::No: emit noClicked(); break;
335 case QPlatformDialogHelper::NoToAll: emit noToAllClicked(); break;
336 case QPlatformDialogHelper::Abort: emit abortClicked(); break;
337 case QPlatformDialogHelper::Retry: emit retryClicked(); break;
338 case QPlatformDialogHelper::Ignore: emit ignoreClicked(); break;
339 case QPlatformDialogHelper::Close: emit closeClicked(); break;
340 case QPlatformDialogHelper::Cancel: emit cancelClicked(); break;
341 case QPlatformDialogHelper::Discard: emit discardClicked(); break;
342 case QPlatformDialogHelper::Help: emit helpClicked(); break;
343 case QPlatformDialogHelper::Apply: emit applyClicked(); break;
344 case QPlatformDialogHelper::Reset: emit resetClicked(); break;
345 case QPlatformDialogHelper::RestoreDefaults: emit restoreDefaultsClicked(); break;
346 default: qmlWarning(me: this) << "unknown button" << int(button); break;
347 }
348}
349
350QT_END_NAMESPACE
351
352#include "moc_qquicklabsplatformmessagedialog_p.cpp"
353

source code of qtdeclarative/src/labs/platform/qquicklabsplatformmessagedialog.cpp