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