aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoland Knall <rknall@gmail.com>2022-07-01 09:56:13 +0200
committerRoland Knall <rknall@gmail.com>2022-07-01 11:30:57 +0200
commit2cebafc61331d6b63e14bfdafbc197411b68c9b8 (patch)
treebd1501204e04059279c6b0bd99ae3f8259996ec1
parent54aed0aa10fade18a1550b0fe1baaba8d16269c6 (diff)
Qt: Filter TrafficListTypes
Add a textbox to allow for filtering the traffic types in the conversation and endpoint dialog. The current implementation allows for an easier growth of the list entries. To ensure that the user can find the entry he/she/they is looking for fast, add a textbox for filtering
-rw-r--r--ui/qt/traffic_table_dialog.cpp3
-rw-r--r--ui/qt/traffic_table_dialog.ui13
-rw-r--r--ui/qt/widgets/traffic_types_list.cpp39
-rw-r--r--ui/qt/widgets/traffic_types_list.h9
4 files changed, 60 insertions, 4 deletions
diff --git a/ui/qt/traffic_table_dialog.cpp b/ui/qt/traffic_table_dialog.cpp
index 1d47b3027b..8ad832faf8 100644
--- a/ui/qt/traffic_table_dialog.cpp
+++ b/ui/qt/traffic_table_dialog.cpp
@@ -63,6 +63,9 @@ TrafficTableDialog::TrafficTableDialog(QWidget &parent, CaptureFile &cf, const Q
connect(ui->absoluteTimeCheckBox, &QCheckBox::toggled, ui->trafficTab, &TrafficTab::useAbsoluteTime);
connect(ui->trafficTab, &TrafficTab::retapRequired, &cap_file_, &CaptureFile::delayedRetapPackets);
+ connect(ui->trafficListSearch, &QLineEdit::textChanged, ui->trafficList, &TrafficTypesList::filterList);
+ connect(ui->trafficList, &TrafficTypesList::clearFilterList, ui->trafficListSearch, &QLineEdit::clear);
+
QPushButton *close_bt = ui->buttonBox->button(QDialogButtonBox::Close);
if (close_bt)
close_bt->setDefault(true);
diff --git a/ui/qt/traffic_table_dialog.ui b/ui/qt/traffic_table_dialog.ui
index d86ce3e9ed..901df7bf3e 100644
--- a/ui/qt/traffic_table_dialog.ui
+++ b/ui/qt/traffic_table_dialog.ui
@@ -93,6 +93,19 @@
<item>
<widget class="TrafficTypesList" name="trafficList"/>
</item>
+ <item>
+ <widget class="QLineEdit" name="trafficListSearch">
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Only show types matching the filter value&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="placeholderText">
+ <string>Filter list for specific type</string>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
</item>
diff --git a/ui/qt/widgets/traffic_types_list.cpp b/ui/qt/widgets/traffic_types_list.cpp
index c51f5f729a..9f43cba290 100644
--- a/ui/qt/widgets/traffic_types_list.cpp
+++ b/ui/qt/widgets/traffic_types_list.cpp
@@ -199,6 +199,30 @@ bool TrafficListSortModel::lessThan(const QModelIndex &source_left, const QModel
return QSortFilterProxyModel::lessThan(source_left, source_right);
}
+void TrafficListSortModel::setFilter(QString filter)
+{
+ if ( filter.compare(_filter) != 0 ) {
+ _filter = filter;
+ invalidateFilter();
+ }
+}
+
+bool TrafficListSortModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
+{
+ if (sourceModel() && _filter.length() > 0) {
+ QModelIndex idx = sourceModel()->index(source_row, TrafficTypesModel::COL_NAME);
+
+ if (idx.isValid()) {
+ QString name = idx.data().toString();
+ if (name.contains(_filter, Qt::CaseInsensitive))
+ return true;
+ return false;
+ }
+ }
+
+ return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);
+}
+
TrafficTypesList::TrafficTypesList(QWidget *parent) :
QTreeView(parent)
@@ -214,11 +238,11 @@ void TrafficTypesList::setProtocolInfo(QString name, GList ** recentList)
{
_name = name;
- TrafficListSortModel * sortModel = new TrafficListSortModel();
+ _sortModel = new TrafficListSortModel();
_model = new TrafficTypesModel(recentList);
- sortModel->setSourceModel(_model);
- setModel(sortModel);
+ _sortModel->setSourceModel(_model);
+ setModel(_sortModel);
setSortingEnabled(true);
sortByColumn(TrafficTypesModel::COL_NAME, Qt::AscendingOrder);
@@ -231,8 +255,10 @@ void TrafficTypesList::setProtocolInfo(QString name, GList ** recentList)
void TrafficTypesList::selectProtocols(QList<int> protocols)
{
- if (_model)
+ if (_model) {
_model->selectProtocols(protocols);
+ emit clearFilterList();
+ }
}
QList<int> TrafficTypesList::protocols(bool onlySelected) const
@@ -250,3 +276,8 @@ QList<int> TrafficTypesList::protocols(bool onlySelected) const
return entries;
}
+void TrafficTypesList::filterList(QString filter)
+{
+ _sortModel->setFilter(filter);
+}
+
diff --git a/ui/qt/widgets/traffic_types_list.h b/ui/qt/widgets/traffic_types_list.h
index b539ade551..00798c5090 100644
--- a/ui/qt/widgets/traffic_types_list.h
+++ b/ui/qt/widgets/traffic_types_list.h
@@ -87,8 +87,14 @@ class TrafficListSortModel : public QSortFilterProxyModel
public:
TrafficListSortModel(QObject * parent = nullptr);
+ void setFilter(QString filter = QString());
+
protected:
virtual bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override;
+ virtual bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override;
+
+private:
+ QString _filter;
};
@@ -104,13 +110,16 @@ public:
public slots:
void selectProtocols(QList<int> protocols);
+ void filterList(QString);
signals:
void protocolsChanged(QList<int> protocols);
+ void clearFilterList();
private:
QString _name;
TrafficTypesModel * _model;
+ TrafficListSortModel * _sortModel;
};
#endif // TRAFFIC_TYPES_LIST_H \ No newline at end of file