diff --git a/src/blackgui/components/logcomponent.cpp b/src/blackgui/components/logcomponent.cpp index bce898614..f76b2db16 100644 --- a/src/blackgui/components/logcomponent.cpp +++ b/src/blackgui/components/logcomponent.cpp @@ -19,28 +19,52 @@ namespace BlackGui { namespace Components { + CConsoleTextEdit::CConsoleTextEdit(QWidget *parent) : QPlainTextEdit(parent) + { + bool c = connect(this, &CConsoleTextEdit::customContextMenuRequested, this, &CConsoleTextEdit::ps_customMenuRequested); + Q_ASSERT_X(c, Q_FUNC_INFO, "Custom menu"); + Q_UNUSED(c); + this->setContextMenuPolicy(Qt::CustomContextMenu); + } + + void CConsoleTextEdit::ps_customMenuRequested(const QPoint &pos) + { + QMenu *menu = QPlainTextEdit::createStandardContextMenu(); + menu->addAction(CIcons::delete16(), "Clear console", this, SLOT(clear())); + menu->exec(this->mapToGlobal(pos)); + } + CLogComponent::CLogComponent(QWidget *parent) : QFrame(parent), ui(new Ui::CLogComponent) { ui->setupUi(this); this->ui->tvp_StatusMessages->setAutoResizeFrequency(3); - connect(this->ui->tvp_StatusMessages, &CStatusMessageView::messageSelected, - this->ui->form_StatusMessage, &CStatusMessageForm::setValue); + connect(this->ui->tvp_StatusMessages, &CStatusMessageView::objectSelected, this->ui->form_StatusMessage, &CStatusMessageForm::setVariant); this->ui->tvp_StatusMessages->setCustomMenu(new CLogMenu(this)); } CLogComponent::~CLogComponent() { } + void CLogComponent::displayLog() + { + this->ui->tw_StatusPage->setCurrentIndex(0); + } + + void CLogComponent::displayConsole() + { + this->ui->tw_StatusPage->setCurrentIndex(1); + } + void CLogComponent::appendStatusMessageToConsole(const CStatusMessage &statusMessage) { if (statusMessage.isEmpty()) return; - this->ui->te_StatusPageConsole->appendHtml(statusMessage.toHtml()); + this->ui->tep_StatusPageConsole->appendHtml(statusMessage.toHtml()); } void CLogComponent::appendPlainTextToConsole(const QString &text) { - this->ui->te_StatusPageConsole->appendPlainText(text); + this->ui->tep_StatusPageConsole->appendPlainText(text); } void CLogComponent::appendStatusMessageToList(const CStatusMessage &statusMessage) @@ -55,7 +79,7 @@ namespace BlackGui Q_ASSERT_X(logComp, Q_FUNC_INFO, "Missing parent"); bool v = logComp->ui->form_StatusMessage->isVisible(); - QString formString(v ? "Hide details" : "Show details"); + QString formString(v ? "Hide log details" : "Show log details"); QAction *a = menu.addAction(BlackMisc::CIcons::databaseTable16(), formString, logComp->ui->form_StatusMessage, SLOT(toggleVisibility())); a->setCheckable(true); a->setChecked(v); diff --git a/src/blackgui/components/logcomponent.h b/src/blackgui/components/logcomponent.h index e659777dd..44b696b49 100644 --- a/src/blackgui/components/logcomponent.h +++ b/src/blackgui/components/logcomponent.h @@ -16,6 +16,7 @@ #include "enableforruntime.h" #include "blackmisc/statusmessagelist.h" #include "blackgui/menudelegate.h" +#include #include #include @@ -25,6 +26,20 @@ namespace BlackGui { namespace Components { + //! Text edit for our log component + class BLACKGUI_EXPORT CConsoleTextEdit : public QPlainTextEdit + { + Q_OBJECT + + public: + //! Constructor + CConsoleTextEdit(QWidget *parent = nullptr); + + protected slots: + //! Custom menu + void ps_customMenuRequested(const QPoint &pos); + }; + //! GUI displaying log and status messages class BLACKGUI_EXPORT CLogComponent : public QFrame, @@ -39,6 +54,12 @@ namespace BlackGui //! Destructor ~CLogComponent(); + //! Display log + void displayLog(); + + //! Display console + void displayConsole(); + public slots: //! Append status message to console void appendStatusMessageToConsole(const BlackMisc::CStatusMessage &statusMessage); @@ -62,7 +83,6 @@ namespace BlackGui //! \copydoc IMenuDelegate::customMenu virtual void customMenu(QMenu &menu) const override; }; - }; } // ns } // ns diff --git a/src/blackgui/components/logcomponent.ui b/src/blackgui/components/logcomponent.ui index 896300035..846dd1185 100644 --- a/src/blackgui/components/logcomponent.ui +++ b/src/blackgui/components/logcomponent.ui @@ -133,7 +133,7 @@ 0 - + 0 @@ -147,6 +147,9 @@ true + + Console output + QPlainTextEdit::NoWrap @@ -173,6 +176,11 @@
blackgui/statusmessageform.h
1 + + BlackGui::Components::CConsoleTextEdit + QPlainTextEdit +
blackgui/components/logcomponent.h
+
diff --git a/src/blackgui/models/statusmessagelistmodel.cpp b/src/blackgui/models/statusmessagelistmodel.cpp index ebfa2d579..37cc6f662 100644 --- a/src/blackgui/models/statusmessagelistmodel.cpp +++ b/src/blackgui/models/statusmessagelistmodel.cpp @@ -46,7 +46,6 @@ namespace BlackGui col.setSortPropertyIndex(CStatusMessage::IndexSeverityAsString); this->m_columns.addColumn(col); this->m_columns.addColumn(CColumn::standardString("message", CStatusMessage::IndexMessage)); - this->m_columns.addColumn(CColumn::standardString("all categories", CStatusMessage::IndexCategories)); this->m_sortedColumn = CStatusMessage::IndexUtcTimestamp; this->m_sortOrder = Qt::DescendingOrder; diff --git a/src/blackgui/statusmessageform.cpp b/src/blackgui/statusmessageform.cpp index c4431b23a..9c32070c2 100644 --- a/src/blackgui/statusmessageform.cpp +++ b/src/blackgui/statusmessageform.cpp @@ -11,6 +11,8 @@ #include "ui_statusmessageform.h" #include +using namespace BlackMisc; + namespace BlackGui { CStatusMessageForm::CStatusMessageForm(QWidget *parent) : @@ -23,9 +25,14 @@ namespace BlackGui CStatusMessageForm::~CStatusMessageForm() { } - void CStatusMessageForm::setValue(const BlackMisc::CStatusMessage &message) + void CStatusMessageForm::setVariant(const CVariant &messageVariant) { if (!this->isVisible()) { return; } + this->setValue(messageVariant.value()); + } + + void CStatusMessageForm::setValue(const CStatusMessage &message) + { ui->te_Message->setPlainText(message.getMessage()); ui->lbl_SeverityIcon->setPixmap(message.toPixmap()); ui->le_Categories->setText(message.getCategories().toQString(true)); diff --git a/src/blackgui/statusmessageform.h b/src/blackgui/statusmessageform.h index 4e0c09498..83eefbd88 100644 --- a/src/blackgui/statusmessageform.h +++ b/src/blackgui/statusmessageform.h @@ -35,6 +35,9 @@ namespace BlackGui ~CStatusMessageForm(); public slots: + //! Set message + void setVariant(const BlackMisc::CVariant &messageVariant); + //! Set message void setValue(const BlackMisc::CStatusMessage &message); diff --git a/src/blackgui/statusmessageform.ui b/src/blackgui/statusmessageform.ui index 593b1d964..0d0c560a1 100644 --- a/src/blackgui/statusmessageform.ui +++ b/src/blackgui/statusmessageform.ui @@ -35,15 +35,28 @@ 4 - - - - true + + + + Categories: - - + + + + Timestamp: + + + + + + + + 200 + 16777215 + + true @@ -56,14 +69,34 @@ - + true - + + + + + 200 + 16777215 + + + + true + + + + + + + true + + + + @@ -73,26 +106,34 @@ - - - - Timestamp: + + + + Qt::Horizontal - + + + 40 + 20 + + + - - - true + + + Qt::Horizontal - - - - - - Categories: + + QSizePolicy::Fixed - + + + 25 + 20 + + +
diff --git a/src/blackgui/views/statusmessageview.cpp b/src/blackgui/views/statusmessageview.cpp index a381fc47a..31c3f72bb 100644 --- a/src/blackgui/views/statusmessageview.cpp +++ b/src/blackgui/views/statusmessageview.cpp @@ -21,8 +21,8 @@ namespace BlackGui CStatusMessageView::CStatusMessageView(QWidget *parent) : CViewBase(parent) { m_withMenuItemClear = true; + m_acceptRowSelected = true; this->standardInit(new CStatusMessageListModel(this)); - connect(this, &CStatusMessageView::clicked, this, &CStatusMessageView::ps_messageSelected); } void CStatusMessageView::setMode(CStatusMessageListModel::Mode mode) @@ -30,13 +30,5 @@ namespace BlackGui this->derivedModel()->setMode(mode); } - void CStatusMessageView::ps_messageSelected(const QModelIndex &index) - { - if (!index.isValid()) { return; } - emit messageSelected( - this->at(index) - ); - } - } // namespace } // namespace diff --git a/src/blackgui/views/statusmessageview.h b/src/blackgui/views/statusmessageview.h index addc26a6d..83572ad35 100644 --- a/src/blackgui/views/statusmessageview.h +++ b/src/blackgui/views/statusmessageview.h @@ -32,14 +32,6 @@ namespace BlackGui //! Set mode void setMode(BlackGui::Models::CStatusMessageListModel::Mode mode); - - signals: - //! Message has been selected - void messageSelected(const BlackMisc::CStatusMessage &statusMessage); - - private: - //! Message selected - void ps_messageSelected(const QModelIndex &index); }; } // ns } // ns diff --git a/src/blackgui/views/viewbase.cpp b/src/blackgui/views/viewbase.cpp index 95c003539..2d83a9dfa 100644 --- a/src/blackgui/views/viewbase.cpp +++ b/src/blackgui/views/viewbase.cpp @@ -36,6 +36,8 @@ namespace BlackGui { this->setContextMenuPolicy(Qt::CustomContextMenu); connect(this, &QWidget::customContextMenuRequested, this, &CViewBaseNonTemplate::ps_customMenuRequested); + connect(this, &QTableView::clicked, this, &CViewBaseNonTemplate::ps_clicked); + connect(this, &QTableView::doubleClicked, this, &CViewBaseNonTemplate::ps_doubleClicked); // scroll modes this->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); @@ -100,6 +102,16 @@ namespace BlackGui return m_enabledLoadIndicator && m_showingLoadIndicator; } + void CViewBaseNonTemplate::setSelectionModel(QItemSelectionModel *model) + { + if (this->selectionModel()) { disconnect(this->selectionModel()); } + QTableView::setSelectionModel(model); + if (this->selectionModel()) + { + connect(this->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &CViewBaseNonTemplate::ps_rowSelected); + } + } + QWidget *CViewBaseNonTemplate::mainApplicationWindowWidget() const { return CGuiUtility::mainApplicationWindowWidget(); @@ -601,6 +613,30 @@ namespace BlackGui this->derivedModel()->removeFilter(); } + template + void CViewBase::ps_clicked(const QModelIndex &index) + { + if (!m_acceptClickSelection) { return; } + if (!index.isValid()) { return; } + emit objectClicked(CVariant::fromValue(at(index))); + } + + template + void CViewBase::ps_doubleClicked(const QModelIndex &index) + { + if (!m_acceptDoubleClickSelection) { return; } + if (!index.isValid()) { return; } + emit objectDoubleClicked(CVariant::fromValue(at(index))); + } + + template + void CViewBase::ps_rowSelected(const QModelIndex &index) + { + if (!m_acceptRowSelected) { return; } + if (!index.isValid()) { return; } + emit objectSelected(CVariant::fromValue(at(index))); + } + // see here for the reason of thess forward instantiations // http://www.parashift.com/c++-faq/separate-template-class-defn-from-decl.html template class CViewBase; diff --git a/src/blackgui/views/viewbase.h b/src/blackgui/views/viewbase.h index c7952b2b3..f299ffb51 100644 --- a/src/blackgui/views/viewbase.h +++ b/src/blackgui/views/viewbase.h @@ -108,6 +108,15 @@ namespace BlackGui //! Showing load indicator bool isShowingLoadIndicator() const; + //! Accept click selection + void acceptClickSelection(bool accept) { m_acceptClickSelection = accept; } + + //! Accept double click selection + void acceptDoubleClickSelection(bool accept) { m_acceptDoubleClickSelection = accept; } + + //! \copydoc QTableView::setSelectionModel(); + virtual void setSelectionModel(QItemSelectionModel *model) override; + //! Main application window widget if any QWidget *mainApplicationWindowWidget() const; @@ -130,6 +139,15 @@ namespace BlackGui //! Single object was changed in model void objectChanged(const BlackMisc::CVariant &object, const BlackMisc::CPropertyIndex &changedIndex); + //! Object has been clicked + void objectClicked(const BlackMisc::CVariant &object); + + //! Object has been double clicked + void objectDoubleClicked(const BlackMisc::CVariant &object); + + //! Object has been double clicked + void objectSelected(const BlackMisc::CVariant &object); + public slots: //! Resize to contents, strategy depends on container size virtual void resizeToContents(); @@ -190,14 +208,17 @@ namespace BlackGui int m_skipResizeThreshold = 40; //!< when to skip resize (rows count) int m_resizeAutoNthTime = 1; //!< with ResizeAuto, resize every n-th time bool m_forceStretchLastColumnWhenResized = false; //!< a small table might (few columns) might to fail stretching, force again - bool m_withMenuItemClear = false; //!< allow clearing the view via menu - bool m_withMenuItemRefresh = false; //!< allow refreshing the view via menu - bool m_withMenuItemBackend = false; //!< allow to request data from backend - bool m_withMenuFilter = false; //!< filter can be opened - bool m_showingLoadIndicator = false; //!< showing loading indicator - bool m_enabledLoadIndicator = true; //!< loading indicator enabled/disabled - QWidget *m_filterWidget = nullptr; //!< filter widget if any - BlackGui::IMenuDelegate *m_menu = nullptr; //!< custom menu if any + bool m_withMenuItemClear = false; //!< allow clearing the view via menu + bool m_withMenuItemRefresh = false; //!< allow refreshing the view via menu + bool m_withMenuItemBackend = false; //!< allow to request data from backend + bool m_withMenuFilter = false; //!< filter can be opened + bool m_showingLoadIndicator = false; //!< showing loading indicator + bool m_enabledLoadIndicator = true; //!< loading indicator enabled/disabled + bool m_acceptClickSelection = false; //!< clicked + bool m_acceptRowSelected = false; //!< selection changed + bool m_acceptDoubleClickSelection = false; //!< double clicked + QWidget *m_filterWidget = nullptr; //!< filter widget if any + BlackGui::IMenuDelegate *m_menu = nullptr; //!< custom menu if any BlackGui::CLoadIndicator *m_loadIndicator = nullptr; //!< load indicator if neeeded protected slots: @@ -216,6 +237,15 @@ namespace BlackGui //! Filter changed in filter widget virtual bool ps_filterWidgetChangedFilter(bool enabled) = 0; + //! Index clicked + virtual void ps_clicked(const QModelIndex &index) = 0; + + //! Index double clicked + virtual void ps_doubleClicked(const QModelIndex &index) = 0; + + //! Row selected + virtual void ps_rowSelected(const QModelIndex &index) = 0; + private slots: //! Custom menu was requested void ps_customMenuRequested(QPoint pos); @@ -323,6 +353,18 @@ namespace BlackGui //! \copydoc CViewBaseNonTemplate::ps_removeFilter //! \remarks Actually a slot, but not defined as such as the template does not support Q_OBJECT virtual void ps_removeFilter() override; + + //! \copydoc CViewBaseNonTemplate::ps_clicked + //! \remarks Actually a slot, but not defined as such as the template does not support Q_OBJECT + virtual void ps_clicked(const QModelIndex &index) override; + + //! \copydoc CViewBaseNonTemplate::ps_doubleClicked + //! \remarks Actually a slot, but not defined as such as the template does not support Q_OBJECT + virtual void ps_doubleClicked(const QModelIndex &index) override; + + //! \copydoc CViewBaseNonTemplate::ps_doubleClicked + //! \remarks Actually a slot, but not defined as such as the template does not support Q_OBJECT + virtual void ps_rowSelected(const QModelIndex &index) override; }; } // namespace } // namespace