diff --git a/src/blackgui/models/statusmessagelistmodel.cpp b/src/blackgui/models/statusmessagelistmodel.cpp index b5253b723..451499be7 100644 --- a/src/blackgui/models/statusmessagelistmodel.cpp +++ b/src/blackgui/models/statusmessagelistmodel.cpp @@ -25,9 +25,10 @@ namespace BlackGui CStatusMessageListModel::CStatusMessageListModel(QObject *parent) : CListModelTimestampObjects("ViewStatusMessageList", parent) { - this->setMode(Detailed); + this->setSorting(CStatusMessage::IndexUtcTimestamp, Qt::DescendingOrder); m_sortTieBreakers.push_front(CStatusMessage::IndexMessage); m_sortTieBreakers.push_front(CStatusMessage::IndexSeverity); + this->setMode(Detailed); // force strings for translation in resource files (void)QT_TRANSLATE_NOOP("ViewStatusMessageList", "time"); @@ -57,18 +58,30 @@ namespace BlackGui this->setMode(m_mode, messages); } + bool CStatusMessageListModel::isSortedByTimestampOrOrder() const + { + const CPropertyIndex p = this->getSortProperty(); + return sortedByTimestampOrOrder(p); + } + + bool CStatusMessageListModel::sortedByTimestampOrOrder(const CPropertyIndex &p) + { + if (p.isEmpty()) { return false; } + const int last = p.indexVector().last(); + return IOrderable::isAnyOrderIndex(last) || ITimestampBased::isAnyTimestampIndex(last); + } + void CStatusMessageListModel::setMode(CStatusMessageListModel::Mode mode) { + const Qt::SortOrder oldOrder = this->getSortOrder(); + const CPropertyIndex oldIndex = this->getSortProperty(); m_columns.clear(); - m_sortColumn = CStatusMessage::IndexUtcTimestamp; m_mode = mode; switch (mode) { case DetailedWithOrder: m_columns.addColumn(CColumn::orderColumn()); - m_sortColumn = CStatusMessage::IndexOrder; - m_sortOrder = Qt::DescendingOrder; Q_FALLTHROUGH(); case Detailed: { @@ -82,7 +95,6 @@ namespace BlackGui break; case SimplifiedWithOrder: m_columns.addColumn(CColumn::orderColumn()); - m_sortColumn = CStatusMessage::IndexOrder; Q_FALLTHROUGH(); case Simplified: { @@ -94,6 +106,24 @@ namespace BlackGui } break; } + + // sorting + if (CStatusMessageListModel::sortedByTimestampOrOrder(oldIndex)) + { + if (mode == DetailedWithOrder || mode == SimplifiedWithOrder) + { + this->setSorting(CStatusMessage::IndexOrder, oldOrder); + } + else + { + this->setSorting(CStatusMessage::IndexUtcTimestamp, oldOrder); + } + } + else + { + // restore sorting + this->setSorting(oldIndex, oldOrder); + } } QVariant CStatusMessageListModel::data(const QModelIndex &index, int role) const diff --git a/src/blackgui/models/statusmessagelistmodel.h b/src/blackgui/models/statusmessagelistmodel.h index 7c09e872a..c71c3f3f3 100644 --- a/src/blackgui/models/statusmessagelistmodel.h +++ b/src/blackgui/models/statusmessagelistmodel.h @@ -56,6 +56,12 @@ namespace BlackGui //! \copydoc QAbstractItemModel::data virtual QVariant data(const QModelIndex &index, int role) const override; + //! Currently sorted by timestamp or by order + bool isSortedByTimestampOrOrder() const; + + //! Sorted by timestamp or order + static bool sortedByTimestampOrOrder(const BlackMisc::CPropertyIndex &p); + private: Mode m_mode; //!< used mode }; diff --git a/src/blackgui/overlaymessages.cpp b/src/blackgui/overlaymessages.cpp index 41bb6c269..11930fbb4 100644 --- a/src/blackgui/overlaymessages.cpp +++ b/src/blackgui/overlaymessages.cpp @@ -170,22 +170,18 @@ namespace BlackGui return; } - //! \fixme KB 2017-09 a possible alternative maybe is to resize rows always to content -> performance? + CStatusMessageList newMsgs(messages); if (appendOldMessages && !ui->tvp_StatusMessages->isEmpty()) { - CStatusMessageList messagesWithOld(messages); - messagesWithOld.push_back(ui->tvp_StatusMessages->container()); - ui->tvp_StatusMessages->rowsResizeModeBasedOnThreshold(messages.size()); - ui->tvp_StatusMessages->updateContainerMaybeAsync(messagesWithOld); - this->setModeToMessages(messagesWithOld.hasErrorMessages()); + newMsgs.push_back(ui->tvp_StatusMessages->container()); } - else - { - ui->tvp_StatusMessages->rowsResizeModeBasedOnThreshold(messages.size()); - ui->tvp_StatusMessages->updateContainerMaybeAsync(messages); - this->setModeToMessages(messages.hasErrorMessages()); - } - this->showKill(false); + + //! \fixme KB 2017-09 a possible alternative maybe is to resize rows always to content -> performance? + ui->tvp_StatusMessages->adjustOrderColumn(newMsgs); + ui->tvp_StatusMessages->rowsResizeModeBasedOnThreshold(newMsgs.size()); + ui->tvp_StatusMessages->updateContainerMaybeAsync(newMsgs); + + this->setModeToMessages(false); this->display(timeOutMs); }