diff --git a/src/blackgui/overlaymessages.cpp b/src/blackgui/overlaymessages.cpp new file mode 100644 index 000000000..e29ab19a5 --- /dev/null +++ b/src/blackgui/overlaymessages.cpp @@ -0,0 +1,124 @@ +/* Copyright (C) 2015 + * swift project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +#include "blackgui/overlaymessages.h" +#include "blackgui/stylesheetutility.h" +#include "ui_overlaymessages.h" +#include + +using namespace BlackGui::Models; + +namespace BlackGui +{ + COverlayMessages::COverlayMessages(int w, int h, QWidget *parent) : + QFrame(parent), + ui(new Ui::COverlayMessages) + { + this->init(w, h); + } + + COverlayMessages::COverlayMessages(const QString &headerText, int w, int h, QWidget *parent) : + QFrame(parent), + ui(new Ui::COverlayMessages), + m_header(headerText) + { + this->init(w, h); + } + + void COverlayMessages::init(int w, int h) + { + ui->setupUi(this); + resize(w, h); + this->setAutoFillBackground(true); + this->ui->tvp_StatusMessages->setMode(CStatusMessageListModel::Simplified); + connect(this->ui->tb_Close, &QToolButton::released, this, &COverlayMessages::close); + m_autoCloseTimer.setObjectName(objectName() + ":autoCloseTimer"); + connect(&m_autoCloseTimer, &QTimer::timeout, this, &COverlayMessages::close); + } + + void COverlayMessages::setHeader(const QString &header) + { + if (m_header.isEmpty()) + { + ui->lbl_Header->setText(header); + } + else + { + ui->lbl_Header->setText(m_header); + } + } + + COverlayMessages::~COverlayMessages() + {} + + void COverlayMessages::showMessages(const BlackMisc::CStatusMessageList &messages, int timeOutMs) + { + if (messages.isEmpty()) { return; } + this->setModeToMessages(); + this->ui->tvp_StatusMessages->updateContainer(messages); + this->display(timeOutMs); + } + + void COverlayMessages::showMessage(const BlackMisc::CStatusMessage &message, int timeOutMs) + { + if (message.isEmpty()) { return; } + this->setModeToMessage(); + this->ui->form_StatusMessage->setValue(message); + this->display(timeOutMs); + } + + void COverlayMessages::setModeToMessages() + { + this->ui->sw_StatusMessagesComponent->setCurrentWidget(this->ui->pg_StatusMessages); + this->setHeader("Messages"); + } + + void COverlayMessages::setModeToMessage() + { + this->ui->sw_StatusMessagesComponent->setCurrentWidget(this->ui->pg_StatusMessage); + this->setHeader("Message"); + } + + void COverlayMessages::keyPressEvent(QKeyEvent *event) + { + if (event->key() == Qt::Key_Escape) + { + this->close(); + event->setAccepted(true); + } + } + + void COverlayMessages::close() + { + this->hide(); + this->setEnabled(false); + } + + void COverlayMessages::display(int timeOutMs) + { + this->show(); + this->setEnabled(true); + if (timeOutMs > 250) + { + m_autoCloseTimer.start(timeOutMs); + } + else + { + m_autoCloseTimer.stop(); + } + } + + void BlackGui::COverlayMessages::paintEvent(QPaintEvent *event) + { + bool s = CStyleSheetUtility::useStyleSheetInDerivedWidget(this, QStyle::PE_Widget); + if (s) { return; } + QFrame::paintEvent(event); + } + +} // ns diff --git a/src/blackgui/overlaymessages.h b/src/blackgui/overlaymessages.h new file mode 100644 index 000000000..ec57577e1 --- /dev/null +++ b/src/blackgui/overlaymessages.h @@ -0,0 +1,84 @@ +/* Copyright (C) 2015 + * swift project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +//! \file + +#ifndef BLACKGUI_OVERLAYMESSAGES_H +#define BLACKGUI_OVERLAYMESSAGES_H + +#include "blackmisc/statusmessagelist.h" +#include +#include +#include + +namespace Ui { class COverlayMessages; } + +namespace BlackGui +{ + /*! + * Display status messages (nested in another widget) + */ + class COverlayMessages : public QFrame + { + Q_OBJECT + + public: + //! Constructor + explicit COverlayMessages(int w, int h, QWidget *parent); + + //! Constructor + explicit COverlayMessages(const QString &headerText, int w, int h, QWidget *parent); + + //! Destructor + ~COverlayMessages(); + + //! Show multiple messages + void showMessages(const BlackMisc::CStatusMessageList &messages, int timeOutMs = -1); + + //! Show single message + void showMessage(const BlackMisc::CStatusMessage &message, int timeOutMs = -1); + + //! Messages mode + void setModeToMessages(); + + //! Single Message mode + void setModeToMessage(); + + //! Set header text + void setHeaderText(const QString &header); + + public slots: + //! Close button clicked + void close(); + + protected: + //! Show message + void display(int timeOutMs = -1); + + //! \copydoc QFrame::keyPressEvent + virtual void keyPressEvent(QKeyEvent *event) override; + + //! \copydoc QFrame::paintEvent + virtual void paintEvent(QPaintEvent *event) override; + + private: + QScopedPointer ui; + QString m_header; + QTimer m_autoCloseTimer { this }; + + //! Init widget + void init(int w, int h); + + //! Set header text + void setHeader(const QString &header); + }; + +} // ns + +#endif // guard diff --git a/src/blackgui/overlaymessages.ui b/src/blackgui/overlaymessages.ui new file mode 100644 index 000000000..eda830373 --- /dev/null +++ b/src/blackgui/overlaymessages.ui @@ -0,0 +1,201 @@ + + + COverlayMessages + + + + 0 + 0 + 400 + 300 + + + + Frame + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 6 + + + 6 + + + 6 + + + 6 + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Status messages + + + + + + + Qt::Horizontal + + + + 309 + 20 + + + + + + + + PushButton + + + + :/diagona/icons/diagona/icons/cross-button.png:/diagona/icons/diagona/icons/cross-button.png + + + + + + + + + + + + 4 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QAbstractItemView::NoSelection + + + QAbstractItemView::SelectRows + + + false + + + + + + + + + 4 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + + + + + + + + BlackGui::Views::CStatusMessageView + QTableView +
blackgui/views/statusmessageview.h
+
+ + BlackGui::CStatusMessageForm + QFrame +
blackgui/statusmessageform.h
+ 1 +
+
+ + + + +
diff --git a/src/blackgui/overlaymessagesframe.cpp b/src/blackgui/overlaymessagesframe.cpp new file mode 100644 index 000000000..67896ca63 --- /dev/null +++ b/src/blackgui/overlaymessagesframe.cpp @@ -0,0 +1,95 @@ +/* Copyright (C) 2015 + * swift project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +#include "blackgui/overlaymessagesframe.h" +#include "blackgui/stylesheetutility.h" +#include +#include + +namespace BlackGui +{ + COverlayMessagesFrame::COverlayMessagesFrame(QWidget *parent) : + QFrame(parent) + { } + + COverlayMessagesFrame::~COverlayMessagesFrame() + {} + + void COverlayMessagesFrame::showStatusMessagesFrame() + { + this->initInnerFrame(); + } + + void COverlayMessagesFrame::hideStatusMessagesFrame() + { + if (!m_statusMessages) { return; } + } + + void COverlayMessagesFrame::showMessages(const BlackMisc::CStatusMessageList &messages) + { + if (messages.isEmpty()) { return; } + this->initInnerFrame(); + this->m_statusMessages->showMessages(messages); + this->repaint(); + } + + void COverlayMessagesFrame::showMessage(const BlackMisc::CStatusMessage &message) + { + if (message.isEmpty()) { return; } + this->initInnerFrame(); + this->m_statusMessages->showMessage(message); + this->repaint(); + } + + void COverlayMessagesFrame::paintEvent(QPaintEvent *event) + { + bool s = CStyleSheetUtility::useStyleSheetInDerivedWidget(this, QStyle::PE_Widget); + if (s) { return; } + QFrame::paintEvent(event); + } + + void COverlayMessagesFrame::keyPressEvent(QKeyEvent *event) + { + if (!m_statusMessages) { QFrame::keyPressEvent(event); } + if (event->key() == Qt::Key_Escape) + { + m_statusMessages->close(); + event->setAccepted(true); + } + else + { + QFrame::keyPressEvent(event); + } + } + + QSize COverlayMessagesFrame::innerFrameSize() const + { + int w = this->width(); + int h = this->height(); + int wInner = 0.7 * w; + int hInner = 0.7 * h; + return QSize(wInner, hInner); + } + + void COverlayMessagesFrame::initInnerFrame() + { + QSize inner(innerFrameSize()); + if (!this->m_statusMessages) + { + this->m_statusMessages = new COverlayMessages(inner.width(), inner.height(), this); + } + + QPoint middle = this->geometry().center(); + int w = inner.width(); + int h = inner.height(); + int x = middle.x() - w / 2; + int y = middle.y() - h / 2; + this->m_statusMessages->setGeometry(x, y, w, h); + } +} // ns diff --git a/src/blackgui/overlaymessagesframe.h b/src/blackgui/overlaymessagesframe.h new file mode 100644 index 000000000..f9c765c68 --- /dev/null +++ b/src/blackgui/overlaymessagesframe.h @@ -0,0 +1,65 @@ +/* Copyright (C) 2015 + * swift project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +//! \file + +#ifndef BLACKGUI_OVERLAYMESSAGES_FRAME_H +#define BLACKGUI_OVERLAYMESSAGES_FRAME_H + +#include "blackgui/overlaymessages.h" +#include + +namespace BlackGui +{ + /*! + * Display status messages (nested in another widget) + */ + class COverlayMessagesFrame : public QFrame + { + Q_OBJECT + + public: + //! Constructor + explicit COverlayMessagesFrame(QWidget *parent = nullptr); + + //! Destructor + ~COverlayMessagesFrame(); + + //! Show the inner frame + void showStatusMessagesFrame(); + + //! Hide the inner frame + void hideStatusMessagesFrame(); + + //! Show multiple messages + void showMessages(const BlackMisc::CStatusMessageList &messages); + + //! Show single message + void showMessage(const BlackMisc::CStatusMessage &message); + + protected: + //! \copydoc QFrame::paintEvent + virtual void paintEvent(QPaintEvent *event) override; + + //! \copydoc QFrame::keyPressEvent + virtual void keyPressEvent(QKeyEvent *event) override; + + COverlayMessages *m_statusMessages = nullptr; //!< embedded QFrame with Status messages + + private: + //! Calculate inner frame size + QSize innerFrameSize() const; + + //! Init the inner frame (if not yet initialized) + void initInnerFrame(); + }; + +} // ns + +#endif // guard