Qt: Add InfoProxyModel

Add an identity model, which can be used to display non-selectable
information at the end of any list

Change-Id: Iaca436f34cb8e5b251eb0dc00ea2c0ce1bd9e0e2
Reviewed-on: https://code.wireshark.org/review/25280
Petri-Dish: Roland Knall <rknall@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Roland Knall <rknall@gmail.com>
This commit is contained in:
Roland Knall 2018-01-12 13:15:20 +01:00 committed by Roland Knall
parent c1301a4862
commit ac9c89de65
4 changed files with 169 additions and 0 deletions

View File

@ -83,6 +83,7 @@ set(WIRESHARK_MODEL_HEADERS
models/export_objects_model.h
models/fileset_entry_model.h
models/html_text_delegate.h
models/info_proxy_model.h
models/interface_sort_filter_model.h
models/interface_tree_cache_model.h
models/interface_tree_model.h
@ -306,6 +307,7 @@ set(WIRESHARK_MODEL_SRCS
models/export_objects_model.cpp
models/fileset_entry_model.cpp
models/html_text_delegate.cpp
models/info_proxy_model.cpp
models/interface_sort_filter_model.cpp
models/interface_tree_cache_model.cpp
models/interface_tree_model.cpp

View File

@ -215,6 +215,7 @@ MOC_MODELS_HDRS = \
models/export_objects_model.h \
models/fileset_entry_model.h \
models/html_text_delegate.h \
models/info_proxy_model.h \
models/interface_sort_filter_model.h \
models/interface_tree_cache_model.h \
models/interface_tree_model.h \
@ -563,6 +564,7 @@ WIRESHARK_QT_MODELS_SRCS = \
models/export_objects_model.cpp \
models/fileset_entry_model.cpp \
models/html_text_delegate.cpp \
models/info_proxy_model.cpp \
models/interface_sort_filter_model.cpp \
models/interface_tree_cache_model.cpp \
models/interface_tree_model.cpp \

View File

@ -0,0 +1,107 @@
/* 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+
*/
#include <config.h>
#include <ui/qt/models/info_proxy_model.h>
#include <QFont>
InfoProxyModel::InfoProxyModel(int column, QObject * parent) : QIdentityProxyModel (parent)
{
column_ = column;
}
InfoProxyModel::~InfoProxyModel()
{
infos_.clear();
}
void InfoProxyModel::appendInfo(QString info)
{
if ( ! infos_.contains(info) )
infos_ << info;
}
int InfoProxyModel::rowCount(const QModelIndex &parent) const
{
return 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 0;
}
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);
}
/*
* Editor modelines
*
* Local Variables:
* c-basic-offset: 4
* tab-width: 8
* indent-tabs-mode: nil
* End:
*
* ex: set shiftwidth=4 tabstop=8 expandtab:
* :indentSize=4:tabSize=8:noTabs=true:
*/

View File

@ -0,0 +1,58 @@
/* info_proxy_model.h
* 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+
*/
#ifndef INFO_PROXY_MODEL_H
#define INFO_PROXY_MODEL_H
#include <config.h>
#include <QStringList>
#include <QIdentityProxyModel>
class InfoProxyModel : public QIdentityProxyModel
{
Q_OBJECT
public:
explicit InfoProxyModel(int column, QObject * parent);
~InfoProxyModel();
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
virtual QVariant data (const QModelIndex &index, int role = Qt::DisplayRole) const;
virtual Qt::ItemFlags flags(const QModelIndex &index) const;
virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
virtual QModelIndex mapToSource(const QModelIndex &proxyIndex) const;
virtual QModelIndex mapFromSource(const QModelIndex &fromIndex) const;
void appendInfo(QString info);
private:
int column_;
QStringList infos_;
};
#endif // INFO_PROXY_MODEL_H
/*
* Editor modelines
*
* Local Variables:
* c-basic-offset: 4
* tab-width: 8
* indent-tabs-mode: nil
* End:
*
* ex: set shiftwidth=4 tabstop=8 expandtab:
* :indentSize=4:tabSize=8:noTabs=true:
*/