diff --git a/src/blackgui/overlaymessages.cpp b/src/blackgui/overlaymessages.cpp index e3e3ef0a0..a44f51f0f 100644 --- a/src/blackgui/overlaymessages.cpp +++ b/src/blackgui/overlaymessages.cpp @@ -15,6 +15,7 @@ using namespace BlackMisc; using namespace BlackMisc::Network; using namespace BlackGui::Models; +using namespace BlackGui::Views; namespace BlackGui { @@ -24,6 +25,12 @@ namespace BlackGui { this->init(w, h); connect(&CStyleSheetUtility::instance(), &CStyleSheetUtility::styleSheetsChanged, this, &COverlayMessages::ps_onStyleSheetsChanged); + connect(this->ui->pb_Ok, &QPushButton::clicked, this, &COverlayMessages::ps_okClicked); + connect(this->ui->pb_Cancel, &QPushButton::clicked, this, &COverlayMessages::ps_cancelClicked); + + this->ui->tvp_StatusMessages->setResizeMode(CStatusMessageView::ResizingAuto); + this->ui->fr_Confirmation->setVisible(false); + this->setDefaultConfirmationButton(QMessageBox::Cancel); } COverlayMessages::COverlayMessages(const QString &headerText, int w, int h, QWidget *parent) : @@ -62,6 +69,22 @@ namespace BlackGui // stlye sheet } + void COverlayMessages::ps_okClicked() + { + this->m_lastConfirmation = QMessageBox::Ok; + if (this->m_okLambda) + { + this->m_okLambda(); + } + this->close(); + } + + void COverlayMessages::ps_cancelClicked() + { + this->m_lastConfirmation = QMessageBox::Cancel; + this->close(); + } + bool COverlayMessages::useSmall() const { return (this->width() < 400); @@ -149,9 +172,56 @@ namespace BlackGui this->setHeader("Text message"); } + void COverlayMessages::setConfirmationMessage(const QString &message) + { + if (message.isEmpty()) + { + this->ui->fr_Confirmation->setVisible(false); + } + else + { + this->ui->fr_Confirmation->setVisible(true); + this->ui->lbl_Confirmation->setText(message); + } + } + + void COverlayMessages::showMessagesWithConfirmation(const CStatusMessageList &messages, const QString &confirmationMessage, std::function okLambda, int defaultButton, int timeOutMs) + { + this->setConfirmationMessage(confirmationMessage); + this->showMessages(messages, timeOutMs); + this->m_okLambda = okLambda; + this->setDefaultConfirmationButton(defaultButton); + } + + void COverlayMessages::setDefaultConfirmationButton(int button) + { + switch (button) + { + case QMessageBox::Ok: + this->ui->pb_Cancel->setDefault(false); + this->ui->pb_Cancel->setAutoDefault(false); + this->ui->pb_Ok->setDefault(true); + this->ui->pb_Ok->setAutoDefault(true); + this->m_lastConfirmation = QMessageBox::Ok; + this->ui->pb_Ok->setFocus(); + break; + case QMessageBox::Cancel: + this->ui->pb_Ok->setDefault(false); + this->ui->pb_Ok->setAutoDefault(false); + this->ui->pb_Cancel->setDefault(true); + this->ui->pb_Cancel->setAutoDefault(true); + this->m_lastConfirmation = QMessageBox::Cancel; + this->ui->pb_Cancel->setFocus(); + break; + default: + break; + } + } + void COverlayMessages::keyPressEvent(QKeyEvent *event) { - if (this->isVisible() && event->key() == Qt::Key_Escape) + if (!this->isVisible()) { QFrame::keyPressEvent(event); } + if (event->key() == Qt::Key_Escape) { this->close(); event->accept(); @@ -166,6 +236,9 @@ namespace BlackGui { this->hide(); this->setEnabled(false); + this->ui->fr_Confirmation->setVisible(false); + this->m_lastConfirmation = QMessageBox::Cancel; + this->m_okLambda = nullptr; } void COverlayMessages::display(int timeOutMs) diff --git a/src/blackgui/overlaymessages.h b/src/blackgui/overlaymessages.h index 8829100db..ccb7af89b 100644 --- a/src/blackgui/overlaymessages.h +++ b/src/blackgui/overlaymessages.h @@ -19,6 +19,8 @@ #include #include #include +#include +#include namespace Ui { class COverlayMessages; } @@ -56,6 +58,19 @@ namespace BlackGui //! Set header text void setHeaderText(const QString &header); + //! Set the message and show the confirmation frame + void setConfirmationMessage(const QString &message); + + //! Show multiple messages with confirmation bar + void showMessagesWithConfirmation(const BlackMisc::CStatusMessageList &messages, + const QString &confirmationMessage, + std::function okLambda, + int defaultButton = QMessageBox::Cancel, + int timeOutMs = -1); + + //! Set the default confirmation button + void setDefaultConfirmationButton(int button = QMessageBox::Cancel); + public slots: //! Show multiple messages void showMessages(const BlackMisc::CStatusMessageList &messages, int timeOutMs = -1); @@ -86,21 +101,28 @@ namespace BlackGui //! Stylesheet changed void ps_onStyleSheetsChanged(); - //! Small - bool useSmall() const; + //! OK clicked (only when confirmation bar is active) + void ps_okClicked(); + + //! Cancel clicked (only when confirmation bar is active) + void ps_cancelClicked(); private: QScopedPointer ui; - QString m_header; - QTimer m_autoCloseTimer { this }; + QString m_header; + int m_lastConfirmation = QMessageBox::Cancel; + std::function m_okLambda; + QTimer m_autoCloseTimer { this }; //! Init widget void init(int w, int h); //! Set header text void setHeader(const QString &header); - }; + //! Small + bool useSmall() const; + }; } // ns #endif // guard diff --git a/src/blackgui/overlaymessages.ui b/src/blackgui/overlaymessages.ui index aee4262ee..392dcf4ff 100644 --- a/src/blackgui/overlaymessages.ui +++ b/src/blackgui/overlaymessages.ui @@ -275,6 +275,54 @@ + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 3 + + + 3 + + + 3 + + + 3 + + + + + Message goes here + + + + + + + OK + + + + + + + Cancel + + + true + + + + + + @@ -296,6 +344,16 @@ 1 + + pb_Ok + pb_Cancel + tb_Close + tvp_StatusMessages + le_TmReceived + le_TmTo + le_TmFrom + te_TmText + diff --git a/src/blackgui/overlaymessagesframe.cpp b/src/blackgui/overlaymessagesframe.cpp index c218487ea..6d9e4b7fb 100644 --- a/src/blackgui/overlaymessagesframe.cpp +++ b/src/blackgui/overlaymessagesframe.cpp @@ -31,6 +31,14 @@ namespace BlackGui if (!m_overlayMessages) { return; } } + void COverlayMessagesFrame::showMessagesWithConfirmation(const BlackMisc::CStatusMessageList &messages, const QString &confirmationMessage, std::function okLambda, int defaultButton, int timeOutMs) + { + if (messages.isEmpty()) { return; } + this->initInnerFrame(); + this->m_overlayMessages->showMessagesWithConfirmation(messages, confirmationMessage, okLambda, defaultButton, timeOutMs); + this->repaint(); + } + void COverlayMessagesFrame::showMessage(const BlackMisc::CStatusMessage &message, int timeOutMs) { if (message.isEmpty()) { return; } diff --git a/src/blackgui/overlaymessagesframe.h b/src/blackgui/overlaymessagesframe.h index 2513e9076..37f66aa59 100644 --- a/src/blackgui/overlaymessagesframe.h +++ b/src/blackgui/overlaymessagesframe.h @@ -38,6 +38,13 @@ namespace BlackGui //! Hide the inner frame void hideStatusMessagesFrame(); + //! \copydoc COverlayMessages::showMessagesWithConfirmation + void showMessagesWithConfirmation(const BlackMisc::CStatusMessageList &messages, + const QString &confirmationMessage, + std::function okLambda, + int defaultButton = QMessageBox::Cancel, + int timeOutMs = -1); + public slots: //! \copydoc COverlayMessages::showMessages void showMessages(const BlackMisc::CStatusMessageList &messages, int timeOutMs = -1);