diff options
author | Roland Knall <rknall@gmail.com> | 2019-07-25 23:08:16 +0200 |
---|---|---|
committer | Roland Knall <rknall@gmail.com> | 2019-07-26 20:01:31 +0000 |
commit | 3a53b8643b8b2f9eba24fef4bfea794f37615a88 (patch) | |
tree | 8c9aefc96eae339a232d479acf3cdab18f62fa55 | |
parent | 1759288e4ee257ce20fffadfbb363a212ff0f4ab (diff) |
Qt: Fix coloring rules dialog
Invalid filters now lead to the correct enable/disable behavior of the button
Bug: 15153
Change-Id: I3ea9e27e246146dbeedab89be841bccbb00739e4
Reviewed-on: https://code.wireshark.org/review/34085
Petri-Dish: Roland Knall <rknall@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Roland Knall <rknall@gmail.com>
-rw-r--r-- | ui/qt/coloring_rules_dialog.cpp | 81 | ||||
-rw-r--r-- | ui/qt/coloring_rules_dialog.h | 5 |
2 files changed, 80 insertions, 6 deletions
diff --git a/ui/qt/coloring_rules_dialog.cpp b/ui/qt/coloring_rules_dialog.cpp index 16cb537664..15f6aaf1c7 100644 --- a/ui/qt/coloring_rules_dialog.cpp +++ b/ui/qt/coloring_rules_dialog.cpp @@ -18,6 +18,7 @@ #include <wsutil/utf8_entities.h> #include "wsutil/filesystem.h" +#include "epan/dfilter/dfilter.h" #include "wireshark_application.h" #include "ui/qt/utils/qt_ui_utils.h" @@ -78,6 +79,7 @@ ColoringRulesDialog::ColoringRulesDialog(QWidget *parent, QString add_filter) : this, SLOT(invalidField(const QModelIndex&, const QString&))); connect(&colorRuleDelegate_, SIGNAL(validField(const QModelIndex&)), this, SLOT(validField(const QModelIndex&))); + connect(ui->coloringRulesTreeView, &QTreeView::clicked, this, &ColoringRulesDialog::treeItemClicked ); connect(&colorRuleModel_, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(rowCountChanged())); connect(&colorRuleModel_, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), this, SLOT(rowCountChanged())); @@ -169,20 +171,82 @@ void ColoringRulesDialog::rowCountChanged() ui->clearToolButton->setEnabled(colorRuleModel_.rowCount() > 0); } +bool ColoringRulesDialog::isValidFilter(QString filter, QString * error) +{ + dfilter_t *dfp = NULL; + gchar *err_msg; + if (dfilter_compile(filter.toUtf8().constData(), &dfp, &err_msg)) { + GPtrArray *depr = NULL; + if (dfp) { + depr = dfilter_deprecated_tokens(dfp); + } + if (! depr) { + return true; + } + } + dfilter_free(dfp); + + if ( err_msg ) + { + error->append(err_msg); + g_free(err_msg); + } + + return false; +} + +void ColoringRulesDialog::treeItemClicked(const QModelIndex &index) +{ + QModelIndex idx = ui->coloringRulesTreeView->model()->index(index.row(), ColoringRulesModel::colFilter); + QString filter = idx.data(Qt::DisplayRole).toString(); + QString err; + if (! isValidFilter(filter, &err) && index.data(Qt::CheckStateRole).toInt() == Qt::Checked) + { + errors_.insert(index, err); + updateHint(index); + } + else + { + QList<QModelIndex> keys = errors_.keys(); + bool update = false; + foreach ( QModelIndex key, keys ) + { + if ( key.row() == index.row() ) + { + errors_.remove(key); + update = true; + } + } + + if ( update ) + updateHint(index); + } +} + void ColoringRulesDialog::invalidField(const QModelIndex &index, const QString& errMessage) { errors_.insert(index, errMessage); - updateHint(); + updateHint(index); } void ColoringRulesDialog::validField(const QModelIndex &index) { - if (errors_.remove(index) > 0) { - updateHint(); + QList<QModelIndex> keys = errors_.keys(); + bool update = false; + foreach ( QModelIndex key, keys ) + { + if ( key.row() == index.row() ) + { + errors_.remove(key); + update = true; + } } + + if ( update ) + updateHint(index); } -void ColoringRulesDialog::updateHint() +void ColoringRulesDialog::updateHint(QModelIndex idx) { QString hint = "<small><i>"; QString error_text; @@ -205,7 +269,14 @@ void ColoringRulesDialog::updateHint() hint += tr("Double click to edit. Drag to move. Rules are processed in order until a match is found."); } else { hint += error_text; - enable_save = false; + if ( idx.isValid() ) + { + QModelIndex fiIdx = ui->coloringRulesTreeView->model()->index(idx.row(), ColoringRulesModel::colName); + if ( fiIdx.data(Qt::CheckStateRole).toInt() == Qt::Checked ) + enable_save = false; + } + else + enable_save = false; } hint += "</i></small>"; diff --git a/ui/qt/coloring_rules_dialog.h b/ui/qt/coloring_rules_dialog.h index 7a11156a1f..5678354f5b 100644 --- a/ui/qt/coloring_rules_dialog.h +++ b/ui/qt/coloring_rules_dialog.h @@ -54,6 +54,7 @@ private slots: void rowCountChanged(); void invalidField(const QModelIndex &index, const QString& errMessage); void validField(const QModelIndex &index); + void treeItemClicked(const QModelIndex &index); private: Ui::ColoringRulesDialog *ui; @@ -66,10 +67,12 @@ private: void checkUnknownColorfilters(); void setColorButtons(QModelIndex &index); - void updateHint(); + void updateHint(QModelIndex idx = QModelIndex()); void addRule(bool copy_from_current = false); void changeColor(bool foreground = true); + + bool isValidFilter(QString filter, QString *error); }; #endif // COLORING_RULES_DIALOG_H |