Skip to content

Version 6.5.0. Issue Magix3D #112 : QtMessageBox::displayWarningMessa… #6

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Sep 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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