From e5916b65a92677d526d10f667959e29aff71999d Mon Sep 17 00:00:00 2001 From: Lars Toenning Date: Sun, 6 Oct 2024 11:32:26 +0200 Subject: [PATCH] feat: Add warn/error log buttons Add buttons to highlight that error or warning messages were logged. Fixes #106 --- src/blackgui/managedstatusbar.cpp | 54 ++++++++++++++++++++++++ src/blackgui/managedstatusbar.h | 21 +++++++++ src/blackgui/share/qss/stdwidget.qss | 10 +++++ src/swiftguistandard/swiftguistd.h | 1 + src/swiftguistandard/swiftguistdinit.cpp | 13 ++++++ 5 files changed, 99 insertions(+) diff --git a/src/blackgui/managedstatusbar.cpp b/src/blackgui/managedstatusbar.cpp index 8ee9c117d..599ab6cb8 100644 --- a/src/blackgui/managedstatusbar.cpp +++ b/src/blackgui/managedstatusbar.cpp @@ -29,6 +29,8 @@ namespace BlackGui // we are not necessarily the owner of the status bar m_statusBar->removeWidget(m_statusBarLabel); m_statusBar->removeWidget(m_statusBarIcon); + m_statusBar->removeWidget(m_errorButton); + m_statusBar->removeWidget(m_warningButton); // labels will be deleted with status bar if (m_ownedStatusBar) { delete m_statusBar; } @@ -46,11 +48,24 @@ namespace BlackGui m_statusBarLabel = new QLabel(m_statusBar); m_statusBarLabel->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); m_statusBarLabel->setObjectName(QString("lbl_StatusBarLabel").append(m_statusBar->objectName())); + m_warningButton = new QPushButton("WARN", m_statusBar); + m_warningButton->setObjectName(QString("btn_StatusBarWarn").append(m_statusBar->objectName())); + m_warningButton->setHidden(!m_showWarnButtonInitially); + m_warningButton->setToolTip("ACK and show logs"); + connect(m_warningButton, &QPushButton::pressed, this, &CManagedStatusBar::pressedWarnButton); + m_errorButton = new QPushButton("ERROR", m_statusBar); + m_errorButton->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Expanding); + m_errorButton->setObjectName(QString("btn_StatusBarError").append(m_statusBar->objectName())); + m_errorButton->setHidden(!m_showErrorButtonInitially); + m_errorButton->setToolTip("ACK and show logs"); + connect(m_errorButton, &QPushButton::pressed, this, &CManagedStatusBar::pressedErrorButton); // use insert to insert from left to right // this keeps any grip on the right size m_statusBar->insertPermanentWidget(0, m_statusBarIcon, 0); // status icon m_statusBar->insertPermanentWidget(1, m_statusBarLabel, 1); // status text + m_statusBar->insertPermanentWidget(2, m_warningButton, 0); + m_statusBar->insertPermanentWidget(3, m_errorButton, 0); // timer m_timerStatusBar.setObjectName(this->objectName().append(":m_timerStatusBar")); @@ -72,6 +87,30 @@ namespace BlackGui } } + void CManagedStatusBar::showWarningButton() + { + if (!m_warningButton) + { + m_showWarnButtonInitially = true; + } + else + { + m_warningButton->setHidden(false); + } + } + + void CManagedStatusBar::showErrorButton() + { + if (!m_errorButton) + { + m_showErrorButtonInitially = true; + } + else + { + m_errorButton->setHidden(false); + } + } + void CManagedStatusBar::show() { if (!m_statusBar) { return; } @@ -146,4 +185,19 @@ namespace BlackGui m_statusBarIcon->clear(); m_statusBarLabel->clear(); } + + void CManagedStatusBar::pressedWarnButton() + { + Q_ASSERT_X(m_warningButton, Q_FUNC_INFO, "Missing warning button"); + m_warningButton->setHidden(true); + emit requestLogPage(); + } + + void CManagedStatusBar::pressedErrorButton() + { + Q_ASSERT_X(m_errorButton, Q_FUNC_INFO, "Missing error button"); + m_errorButton->setHidden(true); + emit requestLogPage(); + } + } // namespace diff --git a/src/blackgui/managedstatusbar.h b/src/blackgui/managedstatusbar.h index db333433a..0d39cf97b 100644 --- a/src/blackgui/managedstatusbar.h +++ b/src/blackgui/managedstatusbar.h @@ -10,6 +10,7 @@ #include "blackmisc/statusmessage.h" #include "blackmisc/statusmessagelist.h" #include +#include #include class QLabel; @@ -35,6 +36,12 @@ namespace BlackGui //! Init void initStatusBar(QStatusBar *statusBar = nullptr); + //! Show warning log button + void showWarningButton(); + + //! Show warning error button + void showErrorButton(); + //! Show void show(); @@ -53,15 +60,29 @@ namespace BlackGui //! Enabled size grip void setSizeGripEnabled(bool enabled); + signals: + //! Request to show the log page + void requestLogPage(); + private: //! Clear status bar void clearStatusBar(); + //! Pressed the WARN button + void pressedWarnButton(); + + //! Pressed the ERROR button + void pressedErrorButton(); + QStatusBar *m_statusBar = nullptr; //!< the status bar itself QLabel *m_statusBarIcon = nullptr; //!< status bar icon QLabel *m_statusBarLabel = nullptr; //!< status bar label + QPushButton *m_warningButton = nullptr; //!< log warning button + QPushButton *m_errorButton = nullptr; //!< log error button QTimer m_timerStatusBar { this }; //!< cleaning up status bar (own cleaning as I need to clean window / icon) bool m_ownedStatusBar = false; //!< own status bar or "injected" (e.g.by UI builder) + bool m_showWarnButtonInitially = false; //!< should the button be shown initially? Might be set before the button is initialized + bool m_showErrorButtonInitially = false; //!< should the button be shown initially? Might be set before the button is initialized Qt::TextElideMode m_elideMode = Qt::ElideMiddle; //!< label text elide BlackMisc::StatusSeverity m_currentSeverity = BlackMisc::StatusSeverity::SeverityDebug; //!< severity currently displayed }; diff --git a/src/blackgui/share/qss/stdwidget.qss b/src/blackgui/share/qss/stdwidget.qss index 9cacc9e5d..41d7fec4e 100644 --- a/src/blackgui/share/qss/stdwidget.qss +++ b/src/blackgui/share/qss/stdwidget.qss @@ -718,6 +718,16 @@ QStatusBar QLabel { padding-left: 5px; } +#btn_StatusBarWarnsb_MainStatusBar { + background-color: yellow; + color: black; +} + +#btn_StatusBarErrorsb_MainStatusBar { + background-color: red; + color: white; +} + QToolTip { color: black; background-color: darkgray; diff --git a/src/swiftguistandard/swiftguistd.h b/src/swiftguistandard/swiftguistd.h index 5614baaf2..6d61d13bc 100644 --- a/src/swiftguistandard/swiftguistd.h +++ b/src/swiftguistandard/swiftguistd.h @@ -132,6 +132,7 @@ private: BlackCore::CActionBindings m_menuHotkeyHandlers; BlackGui::CManagedStatusBar m_statusBar; BlackMisc::CLogHistoryReplica m_logHistoryForStatus { this }; + BlackMisc::CLogHistoryReplica m_logHistoryForLogButtons { this }; BlackMisc::CLogHistoryReplica m_logHistoryForOverlay { this }; BlackMisc::CSetting m_audioSettings { this }; diff --git a/src/swiftguistandard/swiftguistdinit.cpp b/src/swiftguistandard/swiftguistdinit.cpp index 96b45bc45..2152d7ead 100644 --- a/src/swiftguistandard/swiftguistdinit.cpp +++ b/src/swiftguistandard/swiftguistdinit.cpp @@ -77,6 +77,7 @@ void SwiftGuiStd::init() // log messages m_logHistoryForStatus.setFilter(CLogPattern().withSeverityAtOrAbove(CStatusMessage::SeverityInfo)); m_logHistoryForOverlay.setFilter(CLogPattern().withSeverityAtOrAbove(CStatusMessage::SeverityError)); + m_logHistoryForLogButtons.setFilter(CLogPattern().withSeverityAtOrAbove(SeverityWarning)); connect(&m_logHistoryForStatus, &CLogHistoryReplica::elementAdded, this, [this](const CStatusMessage &message) { m_statusBar.displayStatusMessage(message); ui->comp_MainInfoArea->displayStatusMessage(message); @@ -85,8 +86,19 @@ void SwiftGuiStd::init() //! \todo filter out validation messages at CLogPattern level if (!message.getCategories().contains(CLogCategories::validation())) { ui->fr_CentralFrameInside->showOverlayMessage(message); } }); + connect(&m_logHistoryForLogButtons, &CLogHistoryReplica::elementAdded, this, [this](const CStatusMessage &message) { + if (message.getSeverity() == CStatusMessage::SeverityError) + { + m_statusBar.showErrorButton(); + } + else if (message.getSeverity() == CStatusMessage::SeverityWarning) + { + m_statusBar.showWarningButton(); + } + }); m_logHistoryForStatus.initialize(sApp->getDataLinkDBus()); m_logHistoryForOverlay.initialize(sApp->getDataLinkDBus()); + m_logHistoryForLogButtons.initialize(sApp->getDataLinkDBus()); // style this->initStyleSheet(); @@ -116,6 +128,7 @@ void SwiftGuiStd::init() // info bar and status bar m_statusBar.initStatusBar(ui->sb_MainStatusBar); + connect(&m_statusBar, &CManagedStatusBar::requestLogPage, ui->comp_MainInfoArea, &CMainInfoAreaComponent::displayLog); ui->dw_InfoBarStatus->allowStatusBar(false); ui->dw_InfoBarStatus->setPreferredSizeWhenFloating(ui->dw_InfoBarStatus->size()); // set floating size