From 266a418c902902e63cb8d8e224548aa01ac3e4cb Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Tue, 8 Aug 2017 02:23:27 +0200 Subject: [PATCH] Ref T111, allow to limit entries in log component --- src/blackgui/components/logcomponent.cpp | 21 +++++++++++++++++++++ src/blackgui/components/logcomponent.h | 15 ++++++++++++--- src/blackgui/views/statusmessageview.cpp | 14 ++++++++++++++ src/blackgui/views/statusmessageview.h | 3 +++ src/blackmisc/statusmessagelist.cpp | 19 +++++++++++++++++++ src/blackmisc/statusmessagelist.h | 4 ++++ 6 files changed, 73 insertions(+), 3 deletions(-) diff --git a/src/blackgui/components/logcomponent.cpp b/src/blackgui/components/logcomponent.cpp index d0ca7752e..b4ba8e194 100644 --- a/src/blackgui/components/logcomponent.cpp +++ b/src/blackgui/components/logcomponent.cpp @@ -102,6 +102,11 @@ namespace BlackGui ui->tep_StatusPageConsole->clear(); } + int CLogComponent::rowCount() const + { + return ui->tvp_StatusMessages->rowCount(); + } + void CLogComponent::appendStatusMessageToConsole(const CStatusMessage &statusMessage) { if (statusMessage.isEmpty()) return; @@ -117,12 +122,14 @@ namespace BlackGui { if (statusMessage.isEmpty()) { return; } ui->tvp_StatusMessages->insert(statusMessage); + this->removeOldest(); } void CLogComponent::appendStatusMessagesToList(const CStatusMessageList &statusMessages) { if (statusMessages.isEmpty()) { return; } ui->tvp_StatusMessages->insert(statusMessages); + this->removeOldest(); } void CLogComponent::onStatusMessageDataChanged(int count, bool withFilter) @@ -136,6 +143,20 @@ namespace BlackGui ui->tw_StatusPage->setTabText(i, o); } + void CLogComponent::removeOldest() + { + // do not remove every time, but when a threshold is reached + if (m_maxLogMessages < 1) { return; } + if (m_maxLogMessages < 100 && ui->tvp_StatusMessages->rowCount() > (m_maxLogMessages + 10)) + { + ui->tvp_StatusMessages->keepLatest(m_maxLogMessages); + } + else if (ui->tvp_StatusMessages->rowCount() > (m_maxLogMessages * 1.1)) + { + ui->tvp_StatusMessages->keepLatest(m_maxLogMessages); + } + } + void CLogComponent::CLogMenu::customMenu(CMenuActions &menuActions) { CLogComponent *logComp = qobject_cast(this->parent()); diff --git a/src/blackgui/components/logcomponent.h b/src/blackgui/components/logcomponent.h index 09b0303ef..43f42577c 100644 --- a/src/blackgui/components/logcomponent.h +++ b/src/blackgui/components/logcomponent.h @@ -48,8 +48,7 @@ namespace BlackGui }; //! GUI displaying log and status messages - class BLACKGUI_EXPORT CLogComponent : - public QFrame + class BLACKGUI_EXPORT CLogComponent : public QFrame { Q_OBJECT @@ -75,12 +74,18 @@ namespace BlackGui //! Show a filter bar void showFilterBar(); - //! Set fi + //! Set descriptive icons void filterUseRadioButtonDescriptiveIcons(bool oneLetterText); //! Clear void clear(); + //! Number of status messages in log view + int rowCount() const; + + //! Set max.log messages + void setMaxLogMessages(int desiredNumber) { m_maxLogMessages = desiredNumber; } + signals: //! Make me visible void requestAttention(); @@ -100,10 +105,14 @@ namespace BlackGui private: QScopedPointer ui; + int m_maxLogMessages = -1; //! Status messages changed void onStatusMessageDataChanged(int count, bool withFilter); + //! Remove oldest messages + void removeOldest(); + //! Custom menu for the log component class CLogMenu : public BlackGui::Menus::IMenuDelegate { diff --git a/src/blackgui/views/statusmessageview.cpp b/src/blackgui/views/statusmessageview.cpp index e27b2cb27..f4797858b 100644 --- a/src/blackgui/views/statusmessageview.cpp +++ b/src/blackgui/views/statusmessageview.cpp @@ -39,6 +39,20 @@ namespace BlackGui this->setFilterDialog(new CStatusMessageFilterDialog(this)); } + void CStatusMessageView::keepLatest(int desiredSize) + { + if (desiredSize >= this->rowCount()) { return; } + if (desiredSize < 1) + { + this->clear(); + return; + } + + CStatusMessageList msgs = this->container(); + msgs.keepLatest(desiredSize); + this->updateContainerMaybeAsync(msgs); + } + CStatusMessageFilterDialog *CStatusMessageView::getFilterDialog() const { return qobject_cast(this->getFilterWidget()); diff --git a/src/blackgui/views/statusmessageview.h b/src/blackgui/views/statusmessageview.h index c91254a1f..99bdbafc0 100644 --- a/src/blackgui/views/statusmessageview.h +++ b/src/blackgui/views/statusmessageview.h @@ -43,6 +43,9 @@ namespace BlackGui //! Add my own filter dialog void addFilterDialog(); + //! \copydoc BlackMisc::CStatusMessageList::keepLatest + void keepLatest(int desiredSize); + //! Filter dialog if any BlackGui::Filters::CStatusMessageFilterDialog *getFilterDialog() const; }; diff --git a/src/blackmisc/statusmessagelist.cpp b/src/blackmisc/statusmessagelist.cpp index 7f6286786..dc0b145ed 100644 --- a/src/blackmisc/statusmessagelist.cpp +++ b/src/blackmisc/statusmessagelist.cpp @@ -139,6 +139,25 @@ namespace BlackMisc this->removeIf(&CStatusMessage::getSeverity, CStatusMessage::SeverityInfo); } + int CStatusMessageList::keepLatest(int estimtatedNumber) + { + const int oldSize = this->size(); + if (estimtatedNumber >= oldSize) { return 0; } + if (estimtatedNumber < 1) + { + this->clear(); + return oldSize; + } + + CStatusMessageList copy(*this); + copy.sortLatestFirst(); + const QDateTime ts = copy[estimtatedNumber - 1].getUtcTimestamp(); + copy = *this; // keep order + copy.removeBefore(ts); + *this = copy; + return oldSize - this->size(); + } + CStatusMessage::StatusSeverity CStatusMessageList::worstSeverity() const { CStatusMessage::StatusSeverity s = CStatusMessage::SeverityDebug; diff --git a/src/blackmisc/statusmessagelist.h b/src/blackmisc/statusmessagelist.h index c4e2d4ad4..2aea7dea1 100644 --- a/src/blackmisc/statusmessagelist.h +++ b/src/blackmisc/statusmessagelist.h @@ -97,6 +97,10 @@ namespace BlackMisc //! Remove info and below void removeInfoAndBelow(); + //! Keep latest n status messages + //! \remark taking timestamp of n-th oldest messages, deleting all older + int keepLatest(int estimtatedNumber); + //! Find worst severity CStatusMessage::StatusSeverity worstSeverity() const;