diff --git a/src/blackgui/components/statusmessagesdetail.cpp b/src/blackgui/components/statusmessagesdetail.cpp new file mode 100644 index 000000000..4f52fc7fa --- /dev/null +++ b/src/blackgui/components/statusmessagesdetail.cpp @@ -0,0 +1,111 @@ +/* Copyright (C) 2018 + * 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 "statusmessagesdetail.h" +#include "ui_statusmessagesdetail.h" + +using namespace BlackMisc; +using namespace BlackGui::Menus; +using namespace BlackGui::Views; + +namespace BlackGui +{ + namespace Components + { + CStatusMessagesDetail::CStatusMessagesDetail(QWidget *parent) : + QFrame(parent), + ui(new Ui::CStatusMessagesDetail) + { + ui->setupUi(this); + connect(ui->tvp_StatusMessages, &CStatusMessageView::objectSelected, ui->form_StatusMessage, &CStatusMessageForm::setVariant); + connect(ui->tvp_StatusMessages, &CStatusMessageView::modelDataChangedDigest, this, &CStatusMessagesDetail::modelDataChangedDigest); + ui->tvp_StatusMessages->setAutoResizeFrequency(3); + ui->tvp_StatusMessages->setCustomMenu(new CMessageMenu(this)); + ui->tvp_StatusMessages->menuAddItems(CStatusMessageView::MenuSave); + this->showFilterBar(); // default + } + + CStatusMessagesDetail::~CStatusMessagesDetail() + { } + + void CStatusMessagesDetail::appendStatusMessageToList(const CStatusMessage &message, bool resize) + { + if (message.isEmpty()) { return; } + ui->tvp_StatusMessages->insert(message, resize); + this->removeOldest(); + } + + void CStatusMessagesDetail::appendStatusMessagesToList(const CStatusMessageList &messages, bool resize) + { + if (messages.isEmpty()) { return; } + ui->tvp_StatusMessages->insert(messages, resize); + this->removeOldest(); + } + + void CStatusMessagesDetail::showDetails(bool details) + { + ui->form_StatusMessage->setVisible(details); + } + + void CStatusMessagesDetail::showFilterDialog() + { + ui->tvp_StatusMessages->addFilterDialog(); + ui->filter_LogMessages->hide(); + } + + void CStatusMessagesDetail::showFilterBar() + { + ui->tvp_StatusMessages->setFilterWidget(ui->filter_LogMessages); + ui->filter_LogMessages->show(); + } + + void CStatusMessagesDetail::clear() + { + ui->tvp_StatusMessages->clear(); + ui->form_StatusMessage->clear(); + } + + int CStatusMessagesDetail::rowCount() const + { + return ui->tvp_StatusMessages->rowCount(); + } + + void CStatusMessagesDetail::filterUseRadioButtonDescriptiveIcons(bool oneCharacterText) + { + ui->filter_LogMessages->useRadioButtonDescriptiveIcons(oneCharacterText); + } + + void CStatusMessagesDetail::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 CStatusMessagesDetail::CMessageMenu::customMenu(CMenuActions &menuActions) + { + CStatusMessagesDetail *messagesDetail = qobject_cast(this->parent()); + Q_ASSERT_X(messagesDetail, Q_FUNC_INFO, "Missing parent"); + + bool v = messagesDetail->ui->form_StatusMessage->isVisible(); + const QString formString(v ? "Hide log details" : "Show log details"); + this->m_action = menuActions.addAction(this->m_action, BlackMisc::CIcons::databaseTable16(), formString, + CMenuAction::pathLog(), { messagesDetail->ui->form_StatusMessage, &CStatusMessageForm::toggleVisibility}); + this->m_action->setCheckable(true); + this->m_action->setChecked(v); + } + } // ns +} // ns diff --git a/src/blackgui/components/statusmessagesdetail.h b/src/blackgui/components/statusmessagesdetail.h new file mode 100644 index 000000000..79a4422e2 --- /dev/null +++ b/src/blackgui/components/statusmessagesdetail.h @@ -0,0 +1,96 @@ +/* Copyright (C) 2018 + * 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_COMPONENTS_STATUSMESSAGESDETAIL_H +#define BLACKGUI_COMPONENTS_STATUSMESSAGESDETAIL_H + +#include "blackgui/menus/menudelegate.h" +#include "blackgui/blackguiexport.h" +#include "blackmisc/statusmessagelist.h" +#include "blackmisc/variant.h" + +#include +#include +#include + +namespace Ui { class CStatusMessagesDetail; } +namespace BlackGui +{ + namespace Components + { + //! Status messages plus detail + class BLACKGUI_EXPORT CStatusMessagesDetail : public QFrame + { + Q_OBJECT + + public: + //! Constructor + explicit CStatusMessagesDetail(QWidget *parent = nullptr); + + //! Destructor + virtual ~CStatusMessagesDetail(); + + //! Add message + void appendStatusMessageToList(const BlackMisc::CStatusMessage &message, bool resize = true); + + //! Add messages + void appendStatusMessagesToList(const BlackMisc::CStatusMessageList &messages, bool resize = true); + + //! Show log details + void showDetails(bool details); + + //! Show filter dialog and disable bar + void showFilterDialog(); + + //! Show a filter bar + void showFilterBar(); + + //! Clear + void clear(); + + //! Number of status messages in view + int rowCount() const; + + //! Set max.log messages + void setMaxLogMessages(int desiredNumber) { m_maxLogMessages = desiredNumber; } + + //! \copydoc BlackGui::Filters::CStatusMessageFilterBar::useRadioButtonDescriptiveIcons + void filterUseRadioButtonDescriptiveIcons(bool oneCharacterText); + + signals: + //! \copydoc BlackGui::Views::CStatusMessageView::modelDataChangedDigest + void modelDataChangedDigest(int count, bool withFilter); + + private: + QScopedPointer ui; + int m_maxLogMessages = -1; + + //! Remove oldest messages + void removeOldest(); + + //! Custom menu for the log component + class CMessageMenu : public Menus::IMenuDelegate + { + public: + //! Constructor + CMessageMenu(CStatusMessagesDetail *parent) : IMenuDelegate(parent) {} + + //! \copydoc IMenuDelegate::customMenu + virtual void customMenu(Menus::CMenuActions &menuActions) override; + + private: + QAction *m_action = nullptr; + }; + }; + } // ns +} // ns + +#endif // guard diff --git a/src/blackgui/components/statusmessagesdetail.ui b/src/blackgui/components/statusmessagesdetail.ui new file mode 100644 index 000000000..8b9e2c9e8 --- /dev/null +++ b/src/blackgui/components/statusmessagesdetail.ui @@ -0,0 +1,109 @@ + + + CStatusMessagesDetail + + + + 0 + 0 + 640 + 480 + + + + Status messages plus details + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 30 + + + + + + + + Status message log view + + + Qt::ScrollBarAlwaysOn + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + false + + + + + + + + 0 + 0 + + + + + 0 + 100 + + + + + 16777215 + 100 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + BlackGui::Views::CStatusMessageView + QTableView +
blackgui/views/statusmessageview.h
+
+ + BlackGui::Components::CStatusMessageForm + QFrame +
blackgui/components/statusmessageform.h
+ 1 +
+ + BlackGui::Filters::CStatusMessageFilterBar + QFrame +
blackgui/filters/statusmessagefilterbar.h
+ 1 +
+
+ + +