diff --git a/ui/qt/filter_dialog.cpp b/ui/qt/filter_dialog.cpp index 104de067c2..33a83b4121 100644 --- a/ui/qt/filter_dialog.cpp +++ b/ui/qt/filter_dialog.cpp @@ -30,17 +30,6 @@ #include #include "wireshark_application.h" -// To do: -// - Add filter expression button. The right thing to do might be to add an -// action inside DisplayFilterEdit. -// - Show syntax state of each filter? A partial implementation is in place -// for capture filters. - -enum { - name_col_, - filter_col_ -}; - FilterDialog::FilterDialog(QWidget *parent, FilterType filter_type, QString new_filter_) : GeometryStateDialog(parent), ui(new Ui::FilterDialog), @@ -212,11 +201,10 @@ FilterTreeDelegate::FilterTreeDelegate(QObject *parent, FilterDialog::FilterType filter_type_(filter_type) {} - QWidget *FilterTreeDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { QWidget * w = Q_NULLPTR; - if (index.column() != filter_col_) { + if ( index.column() != FilterListModel::ColumnExpression ) { w = QStyledItemDelegate::createEditor(parent, option, index); } else @@ -228,6 +216,9 @@ QWidget *FilterTreeDelegate::createEditor(QWidget *parent, const QStyleOptionVie } } + if ( qobject_cast(w) && index.column() == FilterListModel::ColumnName ) + qobject_cast(w)->setValidator(new FilterValidator()); + return w; } @@ -242,6 +233,21 @@ void FilterTreeDelegate::setEditorData(QWidget *editor, const QModelIndex &index qobject_cast(editor)->setText(index.data().toString()); } +QValidator::State FilterValidator::validate(QString & input, int & /*pos*/) const +{ + /* Making this a list to be able to easily add additional values in the future */ + QStringList invalidKeys = QStringList() << "\""; + + if ( input.length() <= 0 ) + return QValidator::Intermediate; + + foreach ( QString key, invalidKeys ) + if ( input.indexOf(key) >= 0 ) + return QValidator::Invalid; + + return QValidator::Acceptable; +} + /* * Editor modelines * diff --git a/ui/qt/filter_dialog.h b/ui/qt/filter_dialog.h index 880d44bf01..1c612e8e6c 100644 --- a/ui/qt/filter_dialog.h +++ b/ui/qt/filter_dialog.h @@ -14,6 +14,9 @@ #include +#include +#include + class QItemSelection; class FilterTreeDelegate; @@ -58,8 +61,6 @@ private slots: // Delegate for editing capture and display filters. // -#include - class FilterTreeDelegate : public QStyledItemDelegate { Q_OBJECT @@ -74,6 +75,12 @@ private: FilterDialog::FilterType filter_type_; }; +class FilterValidator : public QValidator +{ +public: + virtual QValidator::State validate(QString & input, int & pos) const override; +}; + #endif // FILTER_DIALOG_H /* diff --git a/ui/qt/models/filter_list_model.cpp b/ui/qt/models/filter_list_model.cpp index 6907ac5328..43a5e6ca6a 100644 --- a/ui/qt/models/filter_list_model.cpp +++ b/ui/qt/models/filter_list_model.cpp @@ -150,6 +150,9 @@ bool FilterListModel::setData(const QModelIndex &index, const QVariant &value, i if ( row.count() <= index.column() ) return false; + if ( index.column() == FilterListModel::ColumnName && value.toString().contains("\"") ) + return false; + row[index.column()] = value.toString(); storage[index.row()] = row.join("\n"); @@ -231,7 +234,7 @@ void FilterListModel::saveList() QTextStream out(&file); for ( int row = 0; row < rowCount(); row++ ) { - QString line = QString("\"%1\"").arg(index(row, ColumnName).data().toString().replace("\\", "\\\\").replace("\"", "\\\"")); + QString line = QString("\"%1\"").arg(index(row, ColumnName).data().toString()); line.append(QString(" %1").arg(index(row, ColumnExpression).data().toString())); #ifdef _WIN32