diff options
Diffstat (limited to 'ui/qt/models/info_proxy_model.cpp')
-rw-r--r-- | ui/qt/models/info_proxy_model.cpp | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/ui/qt/models/info_proxy_model.cpp b/ui/qt/models/info_proxy_model.cpp new file mode 100644 index 00000000..7b256b9d --- /dev/null +++ b/ui/qt/models/info_proxy_model.cpp @@ -0,0 +1,119 @@ +/* info_proxy_model.cpp + * Proxy model for displaying an info text at the end of any QAbstractListModel + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include <config.h> + +#include <ui/qt/models/info_proxy_model.h> + +#include <QFont> + +InfoProxyModel::InfoProxyModel(QObject * parent) + : QIdentityProxyModel(parent), + column_(-1) +{ +} + +InfoProxyModel::~InfoProxyModel() +{ + infos_.clear(); +} + +void InfoProxyModel::appendInfo(QString info) +{ + if (! infos_.contains(info)) + infos_ << info; +} + +void InfoProxyModel::clearInfos() +{ + infos_.clear(); +} + +int InfoProxyModel::rowCount(const QModelIndex &parent) const +{ + return static_cast<int>(sourceModel()->rowCount(parent) + infos_.count()); +} + +QVariant InfoProxyModel::data (const QModelIndex &index, int role) const +{ + if (! index.isValid()) + return QVariant(); + + if (index.row() < sourceModel()->rowCount()) + return sourceModel()->data(mapToSource(index), role); + + int ifIdx = index.row() - sourceModel()->rowCount(); + if (index.column() != column_ || ifIdx < 0 || ifIdx >= infos_.count()) + return QVariant(); + + switch (role) + { + case Qt::DisplayRole: + return infos_.at(ifIdx); + break; + case Qt::FontRole: + QFont font = QIdentityProxyModel::data(index, Qt::FontRole).value<QFont>(); + font.setItalic(true); + return font; + } + + return QIdentityProxyModel::data(index, role); +} + +Qt::ItemFlags InfoProxyModel::flags(const QModelIndex &index) const +{ + if (index.row() < sourceModel()->rowCount()) + return sourceModel()->flags(mapToSource(index)); + + return Qt::ItemFlags(); +} + +QModelIndex InfoProxyModel::index(int row, int column, const QModelIndex &parent) const +{ + if (row >= sourceModel()->rowCount() && row < rowCount()) + return createIndex(row, column); + + return QIdentityProxyModel::index(row, column, parent); +} + +QModelIndex InfoProxyModel::mapToSource(const QModelIndex &proxyIndex) const +{ + if (! proxyIndex.isValid()) + return QModelIndex(); + + if (proxyIndex.row() >= sourceModel()->rowCount()) + return QModelIndex(); + + return QIdentityProxyModel::mapToSource(proxyIndex); +} + +QModelIndex InfoProxyModel::mapFromSource(const QModelIndex &fromIndex) const +{ + return QIdentityProxyModel::mapFromSource(fromIndex); +} + +void InfoProxyModel::setColumn(int column) +{ + int old_column = column_; + column_ = column; + + QVector<int> roles; + roles << Qt::DisplayRole; + + if (old_column >= 0) { + //Notify old column has changed + emit dataChanged(index(0, old_column), index(rowCount(), old_column), roles); + } + + if (column_ >= 0) { + //Notify new column has changed + emit dataChanged(index(0, column_), index(rowCount(), column_), roles); + } +} |