Skip to content

Commit

Permalink
Merge pull request #6 from LIHPC-Computational-Geometry/issue-112
Browse files Browse the repository at this point in the history
Version 6.5.0. Issue Magix3D #112 : QtMessageBox::displayWarningMessa…
  • Loading branch information
CharlesPignerol authored Sep 16, 2024
2 parents 025fd10 + bc16895 commit 932290d
Show file tree
Hide file tree
Showing 7 changed files with 405 additions and 29 deletions.
4 changes: 2 additions & 2 deletions cmake/version.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
#

set (QT_UTIL_MAJOR_VERSION "6")
set (QT_UTIL_MINOR_VERSION "4")
set (QT_UTIL_RELEASE_VERSION "2")
set (QT_UTIL_MINOR_VERSION "5")
set (QT_UTIL_RELEASE_VERSION "0")
set (QT_UTIL_VERSION ${QT_UTIL_MAJOR_VERSION}.${QT_UTIL_MINOR_VERSION}.${QT_UTIL_RELEASE_VERSION})


113 changes: 110 additions & 3 deletions src/QtUtil/QtMessageBox.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@
#include "QtUtil/QtUnicodeHelper.h"

#include <TkUtil/Exception.h>
#include <TkUtil/Process.h>

#include <iostream>
#include <memory>
#include <stdexcept>
#include <assert.h>

Expand All @@ -26,26 +28,30 @@ USE_ENCODING_AUTODETECTION


#define BEGIN_TRY_CATCH_BLOCK \
bool hasError = false; \
try {

#define COMPLETE_TRY_CATCH_BLOCK \
} \
catch (const IN_UTIL Exception& exc) \
{ \
hasError = true; \
QMessageBox::critical (0, \
"ERREUR APPLICATIVE LORS DE L'AFFICHAGE D'UN MESSAGE",\
UTF8TOQSTRING(exc.getFullMessage( )),\
QMessageBox::Ok, QMessageBox::NoButton); \
} \
catch (const IN_STD exception& exc) \
{ \
hasError = true; \
QMessageBox::critical (0, \
"ERREUR APPLICATIVE LORS DE L'AFFICHAGE D'UN MESSAGE",\
QSTR (exc.what ( )), \
QMessageBox::Ok, QMessageBox::NoButton); \
} \
catch (...) \
{ \
hasError = true; \
QMessageBox::critical (0, \
"ERREUR APPLICATIVE LORS DE L'AFFICHAGE D'UN MESSAGE",\
QSTR ("Erreur non documentée"), \
Expand All @@ -67,8 +73,8 @@ USE_ENCODING_AUTODETECTION


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)
: QDialog (parent)
{
: QDialog (parent), _processing (false), _parentState (true)
{
setWindowTitle (title);

QVBoxLayout* mainLayout = new QVBoxLayout (this);
Expand Down Expand Up @@ -167,19 +173,40 @@ QtMessageDialog::~QtMessageDialog ( )
} // QtMessageDialog::~QtMessageDialog


void QtMessageDialog::setProcessing (bool processing) // v 6.5.0
{
if (processing != _processing)
{
_processing = processing;
if (0 != parentWidget ( ))
{
if (true == processing)
{
_parentState = parentWidget ( )->isEnabled ( );
parentWidget ( )->setEnabled (false);
// L'inactivation du parent entraîne celui de la boite de dialogue, donc on la réactive :
setEnabled (true);
}
else if (true == _parentState)
parentWidget ( )->setEnabled (_parentState);
}
} // if (processing != _processing)
} // QtMessageDialog::setProcessing


void QtMessageDialog::buttonClicked ( )
{
const QObject* s = sender ( );
for (int i = 0; i < 3; i++)
if (s == _buttons [i])
{
setProcessing (false); // v 6.5.0
done (i);
return;
} // if (s == _buttons [i])
} // QtMessageDialog::buttonClicked



// ===========================================================================
// LA CLASSE QtMessageBox
// ===========================================================================
Expand Down Expand Up @@ -239,6 +266,28 @@ void QtMessageBox::displayWarningMessage (QWidget* parent, const UTF8String& tit
} // QtMessageBox::displayWarningMessage


void QtMessageBox::displayWarningMessageInAppWorkspace (QWidget* parent, const UTF8String& title, const UTF8String& message, size_t columnNum) // v 6.5.0
{
QApplication::setOverrideCursor (QCursor (Qt::ArrowCursor));
const bool security = 0 == parent ? true : parent->isEnabled ( );

BEGIN_TRY_CATCH_BLOCK

QtMessageDialog dialog (QMessageBox::Warning, parent, UTF8TOQSTRING (title),UTF8TOQSTRING (message), columnNum, "OK", 0, 0);
dialog.setProcessing (true);
dialog.show ( );
while (true == dialog.isProcessing ( ))
QApplication::processEvents (QEventLoop::AllEvents, 1000);

COMPLETE_TRY_CATCH_BLOCK

if ((true == hasError) && (0 != parent) && (true == security))
parent->setEnabled (true);

QApplication::restoreOverrideCursor ( );
} // QtMessageBox::displayWarningMessageInAppWorkspace


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)
{
QApplication::setOverrideCursor (QCursor (Qt::ArrowCursor));
Expand All @@ -264,6 +313,28 @@ void QtMessageBox::displayErrorMessage (QWidget* parent, const UTF8String& title
} // QtMessageBox::displayErrorMessage


void QtMessageBox::displayErrorMessageInAppWorkspace (QWidget* parent, const UTF8String& title, const UTF8String& message, size_t columnNum) // v 6.5.0
{
QApplication::setOverrideCursor (QCursor (Qt::ArrowCursor));
const bool security = 0 == parent ? true : parent->isEnabled ( );

BEGIN_TRY_CATCH_BLOCK

QtMessageDialog dialog (QMessageBox::Critical, parent, UTF8TOQSTRING (title), UTF8TOQSTRING (message), columnNum, "OK", 0, 0);
dialog.setProcessing (true);
dialog.show ( );
while (true == dialog.isProcessing ( ))
QApplication::processEvents (QEventLoop::AllEvents, 1000);

COMPLETE_TRY_CATCH_BLOCK

if ((true == hasError) && (0 != parent) && (true == security))
parent->setEnabled (true);

QApplication::restoreOverrideCursor ( );
} // QtMessageBox::displayErrorMessageInAppWorkspace


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)
{
QApplication::setOverrideCursor (QCursor (Qt::ArrowCursor));
Expand Down Expand Up @@ -302,3 +373,39 @@ int QtMessageBox::displayQuestionMessage (QWidget* parent, const UTF8String& tit
} // QtMessageBox::displayQuestionMessage


int QtMessageBox::systemNotification (const UTF8String& appTitle, const UTF8String& message, URGENCY_LEVEL level, size_t duration) // v 6.5.0
{
static bool available = true;
if (false == available)
return -1;

unique_ptr<Process> notifySend (new Process ("notify-send"));

BEGIN_TRY_CATCH_BLOCK

notifySend->getOptions ( ).addOption ("-u");
switch (level)
{
case QtMessageBox::URGENCY_LOW : notifySend->getOptions ( ).addOption ("low"); break;
case QtMessageBox::URGENCY_CRITICAL : notifySend->getOptions ( ).addOption ("critical");break;
default : notifySend->getOptions ( ).addOption ("normal");
} // switch (level)

char time [1024];
sprintf (time, "%lu", duration);
notifySend->getOptions ( ).addOption ("-t");
notifySend->getOptions ( ).addOption (time);
if (false == appTitle.empty ( ))
{
notifySend->getOptions ( ).addOption ("-a");
notifySend->getOptions ( ).addOption (appTitle.utf8 ( ));
} // if (false == appTitle.empty ( ))
notifySend->getOptions ( ).addOption (message.utf8 ( ));
notifySend->execute (false);
notifySend->wait ( );
available = 0 == notifySend->getCompletionCode ( ) ? true : false;

COMPLETE_TRY_CATCH_BLOCK

return notifySend->getCompletionCode ( );
} // QtMessageBox::systemNotification
80 changes: 56 additions & 24 deletions src/QtUtil/public/QtUtil/QtMessageBox.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,19 @@

#include <QWidget>
#include <QMessageBox>
#include <QScreen>



/**
* Fonctions permettant d'afficher une boite de dialogue contenant un
* message.
* Fonctions permettant d'afficher une boite de dialogue contenant un message.
*/
class QtMessageBox
{
public :

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

/**
* Boite de dialogue modale affichant un message d'information. Formate le
* message avant affichage.
* Boite de dialogue modale affichant un message d'information. Formate le message avant affichage.
* @param Widget parent
* @param Titre de la boite de dialogue.
* @param Message à afficher.
* @param Nombre de colonnes du message.
* @param Libellés des boutons
* @param Bouton actif par défaut
* @return L'identifiant du bouton ayant provoqué la femeture de la
* boite de dialogue.
* @return L'identifiant du bouton ayant provoqué la femeture de la boite de dialogue.
*/
static int displayInformationMessage (
QWidget* parent,
Expand All @@ -55,8 +52,7 @@ class QtMessageBox
);

/**
* Boite de dialogue modale affichant un message d'avertissement. Formate le
* message avant affichage.
* Boite de dialogue modale affichant un message d'avertissement. Formate le message avant affichage.
* @param Widget parent
* @param Titre de la boite de dialogue.
* @param Message à afficher.
Expand All @@ -69,16 +65,25 @@ class QtMessageBox
size_t columnNum = 100);

/**
* Boite de dialogue modale affichant un message d'avertissement. Formate le
* message avant affichage.
* Boite de dialogue affichant un message d'avertissement. Formate le message avant affichage. Désactive l'éventuel parent le temps du message. Non modale,
* elle évite que la fenêtre parente ne passe dans le bureau virtuel courant et désorganise celui-ci.
* @param Widget parent
* @param Titre de la boite de dialogue.
* @param Message à afficher.
* @param Nombre de colonnes du message.
* @since 6.5.0
*/
static void displayWarningMessageInAppWorkspace (QWidget* parent, const IN_UTIL UTF8String& title, const IN_UTIL UTF8String& message, size_t columnNum = 100);

/**
* Boite de dialogue modale affichant un message d'avertissement. Formate le message avant affichage.
* @param Widget parent
* @param Titre de la boite de dialogue.
* @param Message à afficher.
* @param Libellés des boutons
* @param Bouton actif par défaut
* @param Nombre de colonnes du message.
* @return L'identifiant du bouton ayant provoqué la femeture de la
* boite de dialogue.
* @return L'identifiant du bouton ayant provoqué la femeture de la boite de dialogue.
*/
static int displayWarningMessage (
QWidget* parent,
Expand All @@ -91,21 +96,30 @@ class QtMessageBox
);

/**
* Boite de dialogue modale affichant un message d'erreur. Formate le
* message avant affichage.
* Boite de dialogue modale affichant un message d'erreur. Formate le message avant affichage.
* @param Widget parent
* @param Titre de la boite de dialogue.
* @param Message à afficher.
* @param Nombre de colonnes du message.
* @return L'identifiant du bouton ayant provoqué la femeture de la
* boite de dialogue.
* @return L'identifiant du bouton ayant provoqué la femeture de la boite de dialogue.
*/
static void displayErrorMessage (
QWidget* parent,
const IN_UTIL UTF8String& title,
const IN_UTIL UTF8String& message,
size_t columnNum = 100);

/**
* Boite de dialogue affichant un message d'avertissement. Formate le message avant affichage. Désactive l'éventuel parent le temps du message. Non modale,
* elle évite que la fenêtre parente ne passe dans le bureau virtuel courant et désorganise celui-ci.
* @param Widget parent
* @param Titre de la boite de dialogue.
* @param Message à afficher.
* @param Nombre de colonnes du message.
* @since 6.5.0
*/
static void displayErrorMessageInAppWorkspace (QWidget* parent, const IN_UTIL UTF8String& title, const IN_UTIL UTF8String& message, size_t columnNum = 100);

/**
* Boite de dialogue modale affichant un message d'erreur. Formate le
* message avant affichage.
Expand All @@ -115,8 +129,7 @@ class QtMessageBox
* @param Nombre de colonnes du message.
* @param Libellés des boutons
* @param Bouton actif par défaut
* @return L'identifiant du bouton ayant provoqué la femeture de la
* boite de dialogue.
* @return L'identifiant du bouton ayant provoqué la femeture de la boite de dialogue.
*/
static int displayErrorMessage (
QWidget* parent,
Expand All @@ -129,15 +142,14 @@ class QtMessageBox
);

/**
* Boite de dialogue modale affichant une question. Formate le
* message avant affichage.
* Boite de dialogue modale affichant une question. Formate le message avant affichage.
* @param Widget parent
* @param Titre de la boite de dialogue.
* @param Message à afficher.
* @param Nombre de colonnes du message.
* @param Libellés des boutons
* @param Bouton actif par défaut
* @return L'identifiant du bouton ayant provoqué la femeture de la
* @return
* boite de dialogue.
*/
static int displayQuestionMessage (
Expand All @@ -150,6 +162,19 @@ class QtMessageBox
int defaultButtonNumber = 0
);

enum URGENCY_LEVEL { URGENCY_LOW, URGENCY_NORMAL, URGENCY_CRITICAL };

/**
* Envoie la notification système transmise en argument. Repose sur <I>notify-send</I>. Attention, les caractères accentués semblent ne pas passer.
* @param Titre de l'application
* @param Message à afficher
* @param Niveau d'urgence
* @param Durée (en millisecondes) de la notification.
* @return 0 si la notification s'est bien passée, ou un code d'erreur.
* @since 6.5.0
*/
static int systemNotification (const IN_UTIL UTF8String& appTitle, const IN_UTIL UTF8String& message, URGENCY_LEVEL level = URGENCY_NORMAL, size_t duration = 5000);


private :

Expand Down Expand Up @@ -181,7 +206,12 @@ class QtMessageDialog : public QDialog
int defaultButton = 0);

virtual ~QtMessageDialog ( );


// v 6.5.0 : possibilité de marquer la boite de dialogue comme en cours de traitement.
virtual void setProcessing (bool processing);
virtual bool isProcessing ( ) const
{ return _processing; }


protected slots :

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

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


Expand Down
Loading

0 comments on commit 932290d

Please sign in to comment.