Skip to content

Commit bc16895

Browse files
author
Charles PIGNEROL
committed
Version 6.5.0. Issue Magix3D #112 : QtMessageBox::displayWarningMessageInAppWorkspace and QtMessageBox::displayErrorMessageInAppWorkspace which do not disrupt the current virtual desktop, QtMessageBox::systemNotification method for sending a message to the notification system.
1 parent 025fd10 commit bc16895

File tree

7 files changed

+405
-29
lines changed

7 files changed

+405
-29
lines changed

cmake/version.cmake

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
#
44

55
set (QT_UTIL_MAJOR_VERSION "6")
6-
set (QT_UTIL_MINOR_VERSION "4")
7-
set (QT_UTIL_RELEASE_VERSION "2")
6+
set (QT_UTIL_MINOR_VERSION "5")
7+
set (QT_UTIL_RELEASE_VERSION "0")
88
set (QT_UTIL_VERSION ${QT_UTIL_MAJOR_VERSION}.${QT_UTIL_MINOR_VERSION}.${QT_UTIL_RELEASE_VERSION})
99

1010

src/QtUtil/QtMessageBox.cpp

Lines changed: 110 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22
#include "QtUtil/QtUnicodeHelper.h"
33

44
#include <TkUtil/Exception.h>
5+
#include <TkUtil/Process.h>
56

67
#include <iostream>
8+
#include <memory>
79
#include <stdexcept>
810
#include <assert.h>
911

@@ -26,26 +28,30 @@ USE_ENCODING_AUTODETECTION
2628

2729

2830
#define BEGIN_TRY_CATCH_BLOCK \
31+
bool hasError = false; \
2932
try {
3033

3134
#define COMPLETE_TRY_CATCH_BLOCK \
3235
} \
3336
catch (const IN_UTIL Exception& exc) \
3437
{ \
38+
hasError = true; \
3539
QMessageBox::critical (0, \
3640
"ERREUR APPLICATIVE LORS DE L'AFFICHAGE D'UN MESSAGE",\
3741
UTF8TOQSTRING(exc.getFullMessage( )),\
3842
QMessageBox::Ok, QMessageBox::NoButton); \
3943
} \
4044
catch (const IN_STD exception& exc) \
4145
{ \
46+
hasError = true; \
4247
QMessageBox::critical (0, \
4348
"ERREUR APPLICATIVE LORS DE L'AFFICHAGE D'UN MESSAGE",\
4449
QSTR (exc.what ( )), \
4550
QMessageBox::Ok, QMessageBox::NoButton); \
4651
} \
4752
catch (...) \
4853
{ \
54+
hasError = true; \
4955
QMessageBox::critical (0, \
5056
"ERREUR APPLICATIVE LORS DE L'AFFICHAGE D'UN MESSAGE",\
5157
QSTR ("Erreur non documentée"), \
@@ -67,8 +73,8 @@ USE_ENCODING_AUTODETECTION
6773

6874

6975
QtMessageDialog::QtMessageDialog (QMessageBox::Icon icon, QWidget* parent, const QString& title, const QString& text, int columns, const char* button1, const char* button2, const char* button3, int defaultButton)
70-
: QDialog (parent)
71-
{
76+
: QDialog (parent), _processing (false), _parentState (true)
77+
{
7278
setWindowTitle (title);
7379

7480
QVBoxLayout* mainLayout = new QVBoxLayout (this);
@@ -167,19 +173,40 @@ QtMessageDialog::~QtMessageDialog ( )
167173
} // QtMessageDialog::~QtMessageDialog
168174

169175

176+
void QtMessageDialog::setProcessing (bool processing) // v 6.5.0
177+
{
178+
if (processing != _processing)
179+
{
180+
_processing = processing;
181+
if (0 != parentWidget ( ))
182+
{
183+
if (true == processing)
184+
{
185+
_parentState = parentWidget ( )->isEnabled ( );
186+
parentWidget ( )->setEnabled (false);
187+
// L'inactivation du parent entraîne celui de la boite de dialogue, donc on la réactive :
188+
setEnabled (true);
189+
}
190+
else if (true == _parentState)
191+
parentWidget ( )->setEnabled (_parentState);
192+
}
193+
} // if (processing != _processing)
194+
} // QtMessageDialog::setProcessing
195+
196+
170197
void QtMessageDialog::buttonClicked ( )
171198
{
172199
const QObject* s = sender ( );
173200
for (int i = 0; i < 3; i++)
174201
if (s == _buttons [i])
175202
{
203+
setProcessing (false); // v 6.5.0
176204
done (i);
177205
return;
178206
} // if (s == _buttons [i])
179207
} // QtMessageDialog::buttonClicked
180208

181209

182-
183210
// ===========================================================================
184211
// LA CLASSE QtMessageBox
185212
// ===========================================================================
@@ -239,6 +266,28 @@ void QtMessageBox::displayWarningMessage (QWidget* parent, const UTF8String& tit
239266
} // QtMessageBox::displayWarningMessage
240267

241268

269+
void QtMessageBox::displayWarningMessageInAppWorkspace (QWidget* parent, const UTF8String& title, const UTF8String& message, size_t columnNum) // v 6.5.0
270+
{
271+
QApplication::setOverrideCursor (QCursor (Qt::ArrowCursor));
272+
const bool security = 0 == parent ? true : parent->isEnabled ( );
273+
274+
BEGIN_TRY_CATCH_BLOCK
275+
276+
QtMessageDialog dialog (QMessageBox::Warning, parent, UTF8TOQSTRING (title),UTF8TOQSTRING (message), columnNum, "OK", 0, 0);
277+
dialog.setProcessing (true);
278+
dialog.show ( );
279+
while (true == dialog.isProcessing ( ))
280+
QApplication::processEvents (QEventLoop::AllEvents, 1000);
281+
282+
COMPLETE_TRY_CATCH_BLOCK
283+
284+
if ((true == hasError) && (0 != parent) && (true == security))
285+
parent->setEnabled (true);
286+
287+
QApplication::restoreOverrideCursor ( );
288+
} // QtMessageBox::displayWarningMessageInAppWorkspace
289+
290+
242291
int QtMessageBox::displayWarningMessage (QWidget* parent, const UTF8String& title, const UTF8String& message, size_t columnNum, const char* button0Text, const char* button1Text, const char* button2Text, int defaultButtonNumber)
243292
{
244293
QApplication::setOverrideCursor (QCursor (Qt::ArrowCursor));
@@ -264,6 +313,28 @@ void QtMessageBox::displayErrorMessage (QWidget* parent, const UTF8String& title
264313
} // QtMessageBox::displayErrorMessage
265314

266315

316+
void QtMessageBox::displayErrorMessageInAppWorkspace (QWidget* parent, const UTF8String& title, const UTF8String& message, size_t columnNum) // v 6.5.0
317+
{
318+
QApplication::setOverrideCursor (QCursor (Qt::ArrowCursor));
319+
const bool security = 0 == parent ? true : parent->isEnabled ( );
320+
321+
BEGIN_TRY_CATCH_BLOCK
322+
323+
QtMessageDialog dialog (QMessageBox::Critical, parent, UTF8TOQSTRING (title), UTF8TOQSTRING (message), columnNum, "OK", 0, 0);
324+
dialog.setProcessing (true);
325+
dialog.show ( );
326+
while (true == dialog.isProcessing ( ))
327+
QApplication::processEvents (QEventLoop::AllEvents, 1000);
328+
329+
COMPLETE_TRY_CATCH_BLOCK
330+
331+
if ((true == hasError) && (0 != parent) && (true == security))
332+
parent->setEnabled (true);
333+
334+
QApplication::restoreOverrideCursor ( );
335+
} // QtMessageBox::displayErrorMessageInAppWorkspace
336+
337+
267338
int QtMessageBox::displayErrorMessage (QWidget* parent, const UTF8String& title, const UTF8String& message, size_t columnNum, const char* button0Text, const char* button1Text, const char* button2Text, int defaultButtonNumber)
268339
{
269340
QApplication::setOverrideCursor (QCursor (Qt::ArrowCursor));
@@ -302,3 +373,39 @@ int QtMessageBox::displayQuestionMessage (QWidget* parent, const UTF8String& tit
302373
} // QtMessageBox::displayQuestionMessage
303374

304375

376+
int QtMessageBox::systemNotification (const UTF8String& appTitle, const UTF8String& message, URGENCY_LEVEL level, size_t duration) // v 6.5.0
377+
{
378+
static bool available = true;
379+
if (false == available)
380+
return -1;
381+
382+
unique_ptr<Process> notifySend (new Process ("notify-send"));
383+
384+
BEGIN_TRY_CATCH_BLOCK
385+
386+
notifySend->getOptions ( ).addOption ("-u");
387+
switch (level)
388+
{
389+
case QtMessageBox::URGENCY_LOW : notifySend->getOptions ( ).addOption ("low"); break;
390+
case QtMessageBox::URGENCY_CRITICAL : notifySend->getOptions ( ).addOption ("critical");break;
391+
default : notifySend->getOptions ( ).addOption ("normal");
392+
} // switch (level)
393+
394+
char time [1024];
395+
sprintf (time, "%lu", duration);
396+
notifySend->getOptions ( ).addOption ("-t");
397+
notifySend->getOptions ( ).addOption (time);
398+
if (false == appTitle.empty ( ))
399+
{
400+
notifySend->getOptions ( ).addOption ("-a");
401+
notifySend->getOptions ( ).addOption (appTitle.utf8 ( ));
402+
} // if (false == appTitle.empty ( ))
403+
notifySend->getOptions ( ).addOption (message.utf8 ( ));
404+
notifySend->execute (false);
405+
notifySend->wait ( );
406+
available = 0 == notifySend->getCompletionCode ( ) ? true : false;
407+
408+
COMPLETE_TRY_CATCH_BLOCK
409+
410+
return notifySend->getCompletionCode ( );
411+
} // QtMessageBox::systemNotification

src/QtUtil/public/QtUtil/QtMessageBox.h

Lines changed: 56 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,19 @@
77

88
#include <QWidget>
99
#include <QMessageBox>
10+
#include <QScreen>
1011

1112

1213

1314
/**
14-
* Fonctions permettant d'afficher une boite de dialogue contenant un
15-
* message.
15+
* Fonctions permettant d'afficher une boite de dialogue contenant un message.
1616
*/
1717
class QtMessageBox
1818
{
1919
public :
2020

2121
/**
22-
* Boite de dialogue modale affichant un message d'information. Formate le
23-
* message avant affichage.
22+
* Boite de dialogue modale affichant un message d'information. Formate le message avant affichage.
2423
* @param Widget parent
2524
* @param Titre de la boite de dialogue.
2625
* @param Message à afficher.
@@ -33,16 +32,14 @@ class QtMessageBox
3332
size_t columnNum = 100);
3433

3534
/**
36-
* Boite de dialogue modale affichant un message d'information. Formate le
37-
* message avant affichage.
35+
* Boite de dialogue modale affichant un message d'information. Formate le message avant affichage.
3836
* @param Widget parent
3937
* @param Titre de la boite de dialogue.
4038
* @param Message à afficher.
4139
* @param Nombre de colonnes du message.
4240
* @param Libellés des boutons
4341
* @param Bouton actif par défaut
44-
* @return L'identifiant du bouton ayant provoqué la femeture de la
45-
* boite de dialogue.
42+
* @return L'identifiant du bouton ayant provoqué la femeture de la boite de dialogue.
4643
*/
4744
static int displayInformationMessage (
4845
QWidget* parent,
@@ -55,8 +52,7 @@ class QtMessageBox
5552
);
5653

5754
/**
58-
* Boite de dialogue modale affichant un message d'avertissement. Formate le
59-
* message avant affichage.
55+
* Boite de dialogue modale affichant un message d'avertissement. Formate le message avant affichage.
6056
* @param Widget parent
6157
* @param Titre de la boite de dialogue.
6258
* @param Message à afficher.
@@ -69,16 +65,25 @@ class QtMessageBox
6965
size_t columnNum = 100);
7066

7167
/**
72-
* Boite de dialogue modale affichant un message d'avertissement. Formate le
73-
* message avant affichage.
68+
* Boite de dialogue affichant un message d'avertissement. Formate le message avant affichage. Désactive l'éventuel parent le temps du message. Non modale,
69+
* elle évite que la fenêtre parente ne passe dans le bureau virtuel courant et désorganise celui-ci.
70+
* @param Widget parent
71+
* @param Titre de la boite de dialogue.
72+
* @param Message à afficher.
73+
* @param Nombre de colonnes du message.
74+
* @since 6.5.0
75+
*/
76+
static void displayWarningMessageInAppWorkspace (QWidget* parent, const IN_UTIL UTF8String& title, const IN_UTIL UTF8String& message, size_t columnNum = 100);
77+
78+
/**
79+
* Boite de dialogue modale affichant un message d'avertissement. Formate le message avant affichage.
7480
* @param Widget parent
7581
* @param Titre de la boite de dialogue.
7682
* @param Message à afficher.
7783
* @param Libellés des boutons
7884
* @param Bouton actif par défaut
7985
* @param Nombre de colonnes du message.
80-
* @return L'identifiant du bouton ayant provoqué la femeture de la
81-
* boite de dialogue.
86+
* @return L'identifiant du bouton ayant provoqué la femeture de la boite de dialogue.
8287
*/
8388
static int displayWarningMessage (
8489
QWidget* parent,
@@ -91,21 +96,30 @@ class QtMessageBox
9196
);
9297

9398
/**
94-
* Boite de dialogue modale affichant un message d'erreur. Formate le
95-
* message avant affichage.
99+
* Boite de dialogue modale affichant un message d'erreur. Formate le message avant affichage.
96100
* @param Widget parent
97101
* @param Titre de la boite de dialogue.
98102
* @param Message à afficher.
99103
* @param Nombre de colonnes du message.
100-
* @return L'identifiant du bouton ayant provoqué la femeture de la
101-
* boite de dialogue.
104+
* @return L'identifiant du bouton ayant provoqué la femeture de la boite de dialogue.
102105
*/
103106
static void displayErrorMessage (
104107
QWidget* parent,
105108
const IN_UTIL UTF8String& title,
106109
const IN_UTIL UTF8String& message,
107110
size_t columnNum = 100);
108111

112+
/**
113+
* Boite de dialogue affichant un message d'avertissement. Formate le message avant affichage. Désactive l'éventuel parent le temps du message. Non modale,
114+
* elle évite que la fenêtre parente ne passe dans le bureau virtuel courant et désorganise celui-ci.
115+
* @param Widget parent
116+
* @param Titre de la boite de dialogue.
117+
* @param Message à afficher.
118+
* @param Nombre de colonnes du message.
119+
* @since 6.5.0
120+
*/
121+
static void displayErrorMessageInAppWorkspace (QWidget* parent, const IN_UTIL UTF8String& title, const IN_UTIL UTF8String& message, size_t columnNum = 100);
122+
109123
/**
110124
* Boite de dialogue modale affichant un message d'erreur. Formate le
111125
* message avant affichage.
@@ -115,8 +129,7 @@ class QtMessageBox
115129
* @param Nombre de colonnes du message.
116130
* @param Libellés des boutons
117131
* @param Bouton actif par défaut
118-
* @return L'identifiant du bouton ayant provoqué la femeture de la
119-
* boite de dialogue.
132+
* @return L'identifiant du bouton ayant provoqué la femeture de la boite de dialogue.
120133
*/
121134
static int displayErrorMessage (
122135
QWidget* parent,
@@ -129,15 +142,14 @@ class QtMessageBox
129142
);
130143

131144
/**
132-
* Boite de dialogue modale affichant une question. Formate le
133-
* message avant affichage.
145+
* Boite de dialogue modale affichant une question. Formate le message avant affichage.
134146
* @param Widget parent
135147
* @param Titre de la boite de dialogue.
136148
* @param Message à afficher.
137149
* @param Nombre de colonnes du message.
138150
* @param Libellés des boutons
139151
* @param Bouton actif par défaut
140-
* @return L'identifiant du bouton ayant provoqué la femeture de la
152+
* @return
141153
* boite de dialogue.
142154
*/
143155
static int displayQuestionMessage (
@@ -150,6 +162,19 @@ class QtMessageBox
150162
int defaultButtonNumber = 0
151163
);
152164

165+
enum URGENCY_LEVEL { URGENCY_LOW, URGENCY_NORMAL, URGENCY_CRITICAL };
166+
167+
/**
168+
* Envoie la notification système transmise en argument. Repose sur <I>notify-send</I>. Attention, les caractères accentués semblent ne pas passer.
169+
* @param Titre de l'application
170+
* @param Message à afficher
171+
* @param Niveau d'urgence
172+
* @param Durée (en millisecondes) de la notification.
173+
* @return 0 si la notification s'est bien passée, ou un code d'erreur.
174+
* @since 6.5.0
175+
*/
176+
static int systemNotification (const IN_UTIL UTF8String& appTitle, const IN_UTIL UTF8String& message, URGENCY_LEVEL level = URGENCY_NORMAL, size_t duration = 5000);
177+
153178

154179
private :
155180

@@ -181,7 +206,12 @@ class QtMessageDialog : public QDialog
181206
int defaultButton = 0);
182207

183208
virtual ~QtMessageDialog ( );
184-
209+
210+
// v 6.5.0 : possibilité de marquer la boite de dialogue comme en cours de traitement.
211+
virtual void setProcessing (bool processing);
212+
virtual bool isProcessing ( ) const
213+
{ return _processing; }
214+
185215

186216
protected slots :
187217

@@ -194,6 +224,8 @@ class QtMessageDialog : public QDialog
194224
QtMessageDialog& operator = (const QtMessageDialog&);
195225

196226
QPushButton* _buttons [3];
227+
bool _processing; // v 6.5.0
228+
bool _parentState; // v 6.5.0 le parent était-il actif ?
197229
}; // class QtMessageDialog
198230

199231

0 commit comments

Comments
 (0)