diff options
author | Roland Knall <rknall@gmail.com> | 2022-07-01 09:56:13 +0200 |
---|---|---|
committer | Roland Knall <rknall@gmail.com> | 2022-07-01 11:30:57 +0200 |
commit | 2cebafc61331d6b63e14bfdafbc197411b68c9b8 (patch) | |
tree | bd1501204e04059279c6b0bd99ae3f8259996ec1 | |
parent | 54aed0aa10fade18a1550b0fe1baaba8d16269c6 (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.cpp | 3 | ||||
-rw-r--r-- | ui/qt/traffic_table_dialog.ui | 13 | ||||
-rw-r--r-- | ui/qt/widgets/traffic_types_list.cpp | 39 | ||||
-rw-r--r-- | ui/qt/widgets/traffic_types_list.h | 9 |
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><html><head/><body><p>Only show types matching the filter value</p></body></html></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 |