Ref T529, automatically setting/restoring sorting for status messages

This commit is contained in:
Klaus Basan
2019-02-05 15:52:29 +01:00
committed by Mat Sutcliffe
parent 4d0f8b9fa0
commit 728a76fc2c
3 changed files with 50 additions and 18 deletions

View File

@@ -25,9 +25,10 @@ namespace BlackGui
CStatusMessageListModel::CStatusMessageListModel(QObject *parent) :
CListModelTimestampObjects<CStatusMessageList, true>("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

View File

@@ -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
};

View File

@@ -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);
}