diff options
author | Roland Knall <rknall@gmail.com> | 2019-06-11 14:15:44 -0700 |
---|---|---|
committer | Roland Knall <rknall@gmail.com> | 2019-06-11 22:09:54 +0000 |
commit | ec972df60a7810d84cf3c1c13c00dbac642f47e4 (patch) | |
tree | eee27c61a4cfbc437ccebf582c4173d09254d07a | |
parent | 8a1a63d7c9d7c9661e1bc83973a698c39fd8d926 (diff) |
Qt: Add context menu to drag-n-drop filters
By holding down the Metamodifier (Ctrl on Mac) you get a contextmenu upon
dropping, from which you can decide if you want to add/or/and not/or not
the filter to the bar.
Bug: 15801
Change-Id: I78b3b265311ee53c7f53698c0e58186eb1afb57f
Reviewed-on: https://code.wireshark.org/review/33560
Petri-Dish: Roland Knall <rknall@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Roland Knall <rknall@gmail.com>
-rw-r--r-- | ui/qt/widgets/display_filter_edit.cpp | 61 | ||||
-rw-r--r-- | ui/qt/widgets/display_filter_edit.h | 7 |
2 files changed, 66 insertions, 2 deletions
diff --git a/ui/qt/widgets/display_filter_edit.cpp b/ui/qt/widgets/display_filter_edit.cpp index 350a13d948..d19adc9b07 100644 --- a/ui/qt/widgets/display_filter_edit.cpp +++ b/ui/qt/widgets/display_filter_edit.cpp @@ -580,10 +580,19 @@ void DisplayFilterEdit::dropEvent(QDropEvent *event) event->setDropAction(Qt::CopyAction); event->accept(); + QString filterText; if ((QApplication::keyboardModifiers() & Qt::AltModifier)) - setText(data->field()); + filterText = data->field(); else - setText(data->filter()); + filterText = data->filter(); + + if ( text().length() > 0 && QApplication::keyboardModifiers() & Qt::MetaModifier) + { + createFilterTextDropMenu(event, filterText); + return; + } + + setText(filterText); // Holding down the Shift key will only prepare filter. if (!(QApplication::keyboardModifiers() & Qt::ShiftModifier)) { @@ -599,6 +608,54 @@ void DisplayFilterEdit::dropEvent(QDropEvent *event) } } +void DisplayFilterEdit::createFilterTextDropMenu(QDropEvent *event, QString filterText) +{ + if ( filterText.isEmpty() ) + return; + + QMenu applyMenu(this); + + QAction * andAction = new QAction(tr("...and selected")); + andAction->setData(QString("&& %1").arg(filterText)); + connect(andAction, &QAction::triggered, this, &DisplayFilterEdit::dropActionMenuEvent); + + QAction * orAction = new QAction(tr("...or selected")); + orAction->setData(QString("|| %1").arg(filterText)); + connect(orAction, &QAction::triggered, this, &DisplayFilterEdit::dropActionMenuEvent); + + QAction * andNotAction = new QAction(tr("...and not selected")); + andNotAction->setData(QString("&& !(%1)").arg(filterText)); + connect(andNotAction, &QAction::triggered, this, &DisplayFilterEdit::dropActionMenuEvent); + + QAction * orNotAction = new QAction(tr("...or not selected")); + orNotAction->setData(QString("|| !(%1)").arg(filterText)); + connect(orNotAction, &QAction::triggered, this, &DisplayFilterEdit::dropActionMenuEvent); + + applyMenu.addAction(andAction); + applyMenu.addAction(orAction); + applyMenu.addAction(andNotAction); + applyMenu.addAction(orNotAction); + applyMenu.exec(this->mapToGlobal(event->pos())); + +} + +void DisplayFilterEdit::dropActionMenuEvent() +{ + QAction * sendAction = qobject_cast<QAction *>(sender()); + if ( ! sendAction ) + return; + + QString value = sendAction->data().toString(); + + QString filterText = QString("((%1) %2)").arg(this->text()).arg(value); + setText(filterText); + + // Holding down the Shift key will only prepare filter. + if (!(QApplication::keyboardModifiers() & Qt::ShiftModifier)) { + applyDisplayFilter(); + } +} + /* * Editor modelines * diff --git a/ui/qt/widgets/display_filter_edit.h b/ui/qt/widgets/display_filter_edit.h index 9a89fbfe3a..2ecf693b56 100644 --- a/ui/qt/widgets/display_filter_edit.h +++ b/ui/qt/widgets/display_filter_edit.h @@ -69,11 +69,18 @@ private: void setDefaultPlaceholderText(); void buildCompletionList(const QString& field_word); + void createFilterTextDropMenu(QDropEvent *event, QString filterText = QString()); + signals: void pushFilterSyntaxStatus(const QString&); void popFilterSyntaxStatus(); void filterPackets(QString new_filter, bool force); void showPreferencesDialog(QString pane_name); + +private slots: + + void dropActionMenuEvent(); + }; #endif // DISPLAYFILTEREDIT_H |