feat: Add warn/error log buttons

Add buttons to highlight that error or warning messages were logged.

Fixes #106
This commit is contained in:
Lars Toenning
2024-10-06 11:32:26 +02:00
parent 7337e89f0c
commit e5916b65a9
5 changed files with 99 additions and 0 deletions

View File

@@ -29,6 +29,8 @@ namespace BlackGui
// we are not necessarily the owner of the status bar // we are not necessarily the owner of the status bar
m_statusBar->removeWidget(m_statusBarLabel); m_statusBar->removeWidget(m_statusBarLabel);
m_statusBar->removeWidget(m_statusBarIcon); m_statusBar->removeWidget(m_statusBarIcon);
m_statusBar->removeWidget(m_errorButton);
m_statusBar->removeWidget(m_warningButton);
// labels will be deleted with status bar // labels will be deleted with status bar
if (m_ownedStatusBar) { delete m_statusBar; } if (m_ownedStatusBar) { delete m_statusBar; }
@@ -46,11 +48,24 @@ namespace BlackGui
m_statusBarLabel = new QLabel(m_statusBar); m_statusBarLabel = new QLabel(m_statusBar);
m_statusBarLabel->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); m_statusBarLabel->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
m_statusBarLabel->setObjectName(QString("lbl_StatusBarLabel").append(m_statusBar->objectName())); 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 // use insert to insert from left to right
// this keeps any grip on the right size // this keeps any grip on the right size
m_statusBar->insertPermanentWidget(0, m_statusBarIcon, 0); // status icon m_statusBar->insertPermanentWidget(0, m_statusBarIcon, 0); // status icon
m_statusBar->insertPermanentWidget(1, m_statusBarLabel, 1); // status text m_statusBar->insertPermanentWidget(1, m_statusBarLabel, 1); // status text
m_statusBar->insertPermanentWidget(2, m_warningButton, 0);
m_statusBar->insertPermanentWidget(3, m_errorButton, 0);
// timer // timer
m_timerStatusBar.setObjectName(this->objectName().append(":m_timerStatusBar")); 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() void CManagedStatusBar::show()
{ {
if (!m_statusBar) { return; } if (!m_statusBar) { return; }
@@ -146,4 +185,19 @@ namespace BlackGui
m_statusBarIcon->clear(); m_statusBarIcon->clear();
m_statusBarLabel->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 } // namespace

View File

@@ -10,6 +10,7 @@
#include "blackmisc/statusmessage.h" #include "blackmisc/statusmessage.h"
#include "blackmisc/statusmessagelist.h" #include "blackmisc/statusmessagelist.h"
#include <QObject> #include <QObject>
#include <QPushButton>
#include <QTimer> #include <QTimer>
class QLabel; class QLabel;
@@ -35,6 +36,12 @@ namespace BlackGui
//! Init //! Init
void initStatusBar(QStatusBar *statusBar = nullptr); void initStatusBar(QStatusBar *statusBar = nullptr);
//! Show warning log button
void showWarningButton();
//! Show warning error button
void showErrorButton();
//! Show //! Show
void show(); void show();
@@ -53,15 +60,29 @@ namespace BlackGui
//! Enabled size grip //! Enabled size grip
void setSizeGripEnabled(bool enabled); void setSizeGripEnabled(bool enabled);
signals:
//! Request to show the log page
void requestLogPage();
private: private:
//! Clear status bar //! Clear status bar
void clearStatusBar(); void clearStatusBar();
//! Pressed the WARN button
void pressedWarnButton();
//! Pressed the ERROR button
void pressedErrorButton();
QStatusBar *m_statusBar = nullptr; //!< the status bar itself QStatusBar *m_statusBar = nullptr; //!< the status bar itself
QLabel *m_statusBarIcon = nullptr; //!< status bar icon QLabel *m_statusBarIcon = nullptr; //!< status bar icon
QLabel *m_statusBarLabel = nullptr; //!< status bar label 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) 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_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 Qt::TextElideMode m_elideMode = Qt::ElideMiddle; //!< label text elide
BlackMisc::StatusSeverity m_currentSeverity = BlackMisc::StatusSeverity::SeverityDebug; //!< severity currently displayed BlackMisc::StatusSeverity m_currentSeverity = BlackMisc::StatusSeverity::SeverityDebug; //!< severity currently displayed
}; };

View File

@@ -718,6 +718,16 @@ QStatusBar QLabel {
padding-left: 5px; padding-left: 5px;
} }
#btn_StatusBarWarnsb_MainStatusBar {
background-color: yellow;
color: black;
}
#btn_StatusBarErrorsb_MainStatusBar {
background-color: red;
color: white;
}
QToolTip { QToolTip {
color: black; color: black;
background-color: darkgray; background-color: darkgray;

View File

@@ -132,6 +132,7 @@ private:
BlackCore::CActionBindings m_menuHotkeyHandlers; BlackCore::CActionBindings m_menuHotkeyHandlers;
BlackGui::CManagedStatusBar m_statusBar; BlackGui::CManagedStatusBar m_statusBar;
BlackMisc::CLogHistoryReplica m_logHistoryForStatus { this }; BlackMisc::CLogHistoryReplica m_logHistoryForStatus { this };
BlackMisc::CLogHistoryReplica m_logHistoryForLogButtons { this };
BlackMisc::CLogHistoryReplica m_logHistoryForOverlay { this }; BlackMisc::CLogHistoryReplica m_logHistoryForOverlay { this };
BlackMisc::CSetting<BlackMisc::Audio::TSettings> m_audioSettings { this }; BlackMisc::CSetting<BlackMisc::Audio::TSettings> m_audioSettings { this };

View File

@@ -77,6 +77,7 @@ void SwiftGuiStd::init()
// log messages // log messages
m_logHistoryForStatus.setFilter(CLogPattern().withSeverityAtOrAbove(CStatusMessage::SeverityInfo)); m_logHistoryForStatus.setFilter(CLogPattern().withSeverityAtOrAbove(CStatusMessage::SeverityInfo));
m_logHistoryForOverlay.setFilter(CLogPattern().withSeverityAtOrAbove(CStatusMessage::SeverityError)); m_logHistoryForOverlay.setFilter(CLogPattern().withSeverityAtOrAbove(CStatusMessage::SeverityError));
m_logHistoryForLogButtons.setFilter(CLogPattern().withSeverityAtOrAbove(SeverityWarning));
connect(&m_logHistoryForStatus, &CLogHistoryReplica::elementAdded, this, [this](const CStatusMessage &message) { connect(&m_logHistoryForStatus, &CLogHistoryReplica::elementAdded, this, [this](const CStatusMessage &message) {
m_statusBar.displayStatusMessage(message); m_statusBar.displayStatusMessage(message);
ui->comp_MainInfoArea->displayStatusMessage(message); ui->comp_MainInfoArea->displayStatusMessage(message);
@@ -85,8 +86,19 @@ void SwiftGuiStd::init()
//! \todo filter out validation messages at CLogPattern level //! \todo filter out validation messages at CLogPattern level
if (!message.getCategories().contains(CLogCategories::validation())) { ui->fr_CentralFrameInside->showOverlayMessage(message); } 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_logHistoryForStatus.initialize(sApp->getDataLinkDBus());
m_logHistoryForOverlay.initialize(sApp->getDataLinkDBus()); m_logHistoryForOverlay.initialize(sApp->getDataLinkDBus());
m_logHistoryForLogButtons.initialize(sApp->getDataLinkDBus());
// style // style
this->initStyleSheet(); this->initStyleSheet();
@@ -116,6 +128,7 @@ void SwiftGuiStd::init()
// info bar and status bar // info bar and status bar
m_statusBar.initStatusBar(ui->sb_MainStatusBar); m_statusBar.initStatusBar(ui->sb_MainStatusBar);
connect(&m_statusBar, &CManagedStatusBar::requestLogPage, ui->comp_MainInfoArea, &CMainInfoAreaComponent::displayLog);
ui->dw_InfoBarStatus->allowStatusBar(false); ui->dw_InfoBarStatus->allowStatusBar(false);
ui->dw_InfoBarStatus->setPreferredSizeWhenFloating(ui->dw_InfoBarStatus->size()); // set floating size ui->dw_InfoBarStatus->setPreferredSizeWhenFloating(ui->dw_InfoBarStatus->size()); // set floating size