refs #832, overlay messages may be overridden with pending confirmation dialogs

found during #832
This commit is contained in:
Klaus Basan
2016-12-13 18:37:48 +01:00
parent e0b38fb296
commit 4e5413ff3f
4 changed files with 92 additions and 15 deletions

View File

@@ -39,7 +39,7 @@ namespace BlackGui
explicit CStatusMessageForm(QWidget *parent = nullptr); explicit CStatusMessageForm(QWidget *parent = nullptr);
//! Destructor //! Destructor
~CStatusMessageForm(); virtual ~CStatusMessageForm();
public slots: public slots:
//! Set message //! Set message

View File

@@ -23,7 +23,6 @@
class QWidget; class QWidget;
namespace Ui { class CStatusMessageFormSmall; } namespace Ui { class CStatusMessageFormSmall; }
namespace BlackGui namespace BlackGui
{ {
namespace Components namespace Components
@@ -40,7 +39,7 @@ namespace BlackGui
explicit CStatusMessageFormSmall(QWidget *parent = nullptr); explicit CStatusMessageFormSmall(QWidget *parent = nullptr);
//! Destructor //! Destructor
~CStatusMessageFormSmall(); virtual ~CStatusMessageFormSmall();
public slots: public slots:
//! Set message //! Set message

View File

@@ -64,11 +64,11 @@ namespace BlackGui
void COverlayMessages::init(int w, int h) void COverlayMessages::init(int w, int h)
{ {
ui->setupUi(this); ui->setupUi(this);
resize(w, h); this->resize(w, h);
this->setAutoFillBackground(true); this->setAutoFillBackground(true);
ui->tvp_StatusMessages->setMode(CStatusMessageListModel::Simplified); ui->tvp_StatusMessages->setMode(CStatusMessageListModel::Simplified);
connect(ui->tb_Close, &QToolButton::released, this, &COverlayMessages::close); connect(ui->tb_Close, &QToolButton::released, this, &COverlayMessages::close);
m_autoCloseTimer.setObjectName(objectName() + ":autoCloseTimer"); this->m_autoCloseTimer.setObjectName(objectName() + ":autoCloseTimer");
connect(&m_autoCloseTimer, &QTimer::timeout, this, &COverlayMessages::close); connect(&m_autoCloseTimer, &QTimer::timeout, this, &COverlayMessages::close);
} }
@@ -116,6 +116,16 @@ namespace BlackGui
void COverlayMessages::showOverlayMessages(const BlackMisc::CStatusMessageList &messages, int timeOutMs) void COverlayMessages::showOverlayMessages(const BlackMisc::CStatusMessageList &messages, int timeOutMs)
{ {
if (messages.isEmpty()) { return; } if (messages.isEmpty()) { return; }
if (this->hasPendingConfirmation())
{
// defer message
this->m_pendingMessageCalls.push_back([ = ]()
{
this->showOverlayMessages(messages, timeOutMs);
});
return;
}
this->setModeToMessages(); this->setModeToMessages();
ui->tvp_StatusMessages->updateContainer(messages); ui->tvp_StatusMessages->updateContainer(messages);
this->display(timeOutMs); this->display(timeOutMs);
@@ -124,6 +134,16 @@ namespace BlackGui
void COverlayMessages::showOverlayMessage(const BlackMisc::CStatusMessage &message, int timeOutMs) void COverlayMessages::showOverlayMessage(const BlackMisc::CStatusMessage &message, int timeOutMs)
{ {
if (message.isEmpty()) { return; } if (message.isEmpty()) { return; }
if (this->hasPendingConfirmation())
{
// defer message
this->m_pendingMessageCalls.push_back([ = ]()
{
this->showOverlayMessage(message, timeOutMs);
});
return;
}
if (this->useSmall()) if (this->useSmall())
{ {
this->setModeToMessageSmall(); this->setModeToMessageSmall();
@@ -140,6 +160,16 @@ namespace BlackGui
void COverlayMessages::showOverlayTextMessage(const CTextMessage &textMessage, int timeOutMs) void COverlayMessages::showOverlayTextMessage(const CTextMessage &textMessage, int timeOutMs)
{ {
if (textMessage.isEmpty()) { return; } if (textMessage.isEmpty()) { return; }
if (this->hasPendingConfirmation())
{
// defer message
this->m_pendingMessageCalls.push_back([ = ]()
{
this->showOverlayTextMessage(textMessage, timeOutMs);
});
return;
}
this->setModeToTextMessage(); this->setModeToTextMessage();
// message and display // message and display
@@ -158,6 +188,16 @@ namespace BlackGui
void COverlayMessages::showOverlayImage(const QPixmap &image, int timeOutMs) void COverlayMessages::showOverlayImage(const QPixmap &image, int timeOutMs)
{ {
if (this->hasPendingConfirmation())
{
// defer message
this->m_pendingMessageCalls.push_back([ = ]()
{
this->showOverlayImage(image, timeOutMs);
});
return;
}
this->setModeToImage(); this->setModeToImage();
QSize sizeAvailable = ui->fr_StatusMessagesComponentsInner->size(); QSize sizeAvailable = ui->fr_StatusMessagesComponentsInner->size();
if (sizeAvailable.width() < 300) if (sizeAvailable.width() < 300)
@@ -254,8 +294,18 @@ namespace BlackGui
void COverlayMessages::showOverlayMessagesWithConfirmation(const CStatusMessageList &messages, const QString &confirmationMessage, std::function<void ()> okLambda, int defaultButton, int timeOutMs) void COverlayMessages::showOverlayMessagesWithConfirmation(const CStatusMessageList &messages, const QString &confirmationMessage, std::function<void ()> okLambda, int defaultButton, int timeOutMs)
{ {
if (this->hasPendingConfirmation())
{
// defer message
this->m_pendingMessageCalls.push_back([ = ]()
{
this->showOverlayMessagesWithConfirmation(messages, confirmationMessage, okLambda, defaultButton, timeOutMs);
});
return;
}
this->setConfirmationMessage(confirmationMessage); this->setConfirmationMessage(confirmationMessage);
this->showOverlayMessages(messages, timeOutMs); this->showOverlayMessages(messages, timeOutMs);
this->m_awaitingConfirmation = true; // needs to be after showOverlayMessages
this->m_okLambda = okLambda; this->m_okLambda = okLambda;
this->setDefaultConfirmationButton(defaultButton); this->setDefaultConfirmationButton(defaultButton);
} }
@@ -285,6 +335,11 @@ namespace BlackGui
} }
} }
bool COverlayMessages::hasPendingConfirmation() const
{
return this->m_awaitingConfirmation;
}
void COverlayMessages::keyPressEvent(QKeyEvent *event) void COverlayMessages::keyPressEvent(QKeyEvent *event)
{ {
if (!this->isVisible()) { QFrame::keyPressEvent(event); } if (!this->isVisible()) { QFrame::keyPressEvent(event); }
@@ -304,8 +359,23 @@ namespace BlackGui
this->hide(); this->hide();
this->setEnabled(false); this->setEnabled(false);
ui->fr_Confirmation->setVisible(false); ui->fr_Confirmation->setVisible(false);
if (this->m_awaitingConfirmation)
{
emit confirmationCompleted();
}
else
{
this->m_lastConfirmation = QMessageBox::Cancel; this->m_lastConfirmation = QMessageBox::Cancel;
}
this->m_awaitingConfirmation = false;
this->m_okLambda = nullptr; this->m_okLambda = nullptr;
if (!this->m_pendingMessageCalls.isEmpty())
{
std::function<void()> f = this->m_pendingMessageCalls.front();
this->m_pendingMessageCalls.removeFirst();
QTimer::singleShot(500, this, f);
}
} }
void COverlayMessages::display(int timeOutMs) void COverlayMessages::display(int timeOutMs)

View File

@@ -50,7 +50,7 @@ namespace BlackGui
explicit COverlayMessages(const QString &headerText, int w, int h, QWidget *parent); explicit COverlayMessages(const QString &headerText, int w, int h, QWidget *parent);
//! Destructor //! Destructor
~COverlayMessages(); virtual ~COverlayMessages();
//! Messages mode //! Messages mode
void setModeToMessages(); void setModeToMessages();
@@ -80,10 +80,6 @@ namespace BlackGui
int defaultButton = QMessageBox::Cancel, int defaultButton = QMessageBox::Cancel,
int timeOutMs = -1); int timeOutMs = -1);
//! Set the default confirmation button
void setDefaultConfirmationButton(int button = QMessageBox::Cancel);
public slots:
//! Show multiple messages //! Show multiple messages
void showOverlayMessages(const BlackMisc::CStatusMessageList &messages, int timeOutMs = -1); void showOverlayMessages(const BlackMisc::CStatusMessageList &messages, int timeOutMs = -1);
@@ -105,6 +101,16 @@ namespace BlackGui
//! Close button clicked //! Close button clicked
void close(); void close();
//! Set the default confirmation button
void setDefaultConfirmationButton(int button = QMessageBox::Cancel);
//! Is awaiting a conformation
bool hasPendingConfirmation() const;
signals:
//! Confirmation completed
void confirmationCompleted();
protected: protected:
//! Show message //! Show message
void display(int timeOutMs = -1); void display(int timeOutMs = -1);
@@ -126,8 +132,10 @@ namespace BlackGui
QScopedPointer<Ui::COverlayMessages> ui; QScopedPointer<Ui::COverlayMessages> ui;
QString m_header; QString m_header;
int m_lastConfirmation = QMessageBox::Cancel; int m_lastConfirmation = QMessageBox::Cancel;
bool m_awaitingConfirmation = false;
std::function<void()> m_okLambda; std::function<void()> m_okLambda;
QTimer m_autoCloseTimer { this }; QTimer m_autoCloseTimer { this };
QList<std::function<void()>> m_pendingMessageCalls;
//! Init widget //! Init widget
void init(int w, int h); void init(int w, int h);