aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoland Knall <rknall@gmail.com>2019-06-11 14:15:44 -0700
committerRoland Knall <rknall@gmail.com>2019-06-11 22:09:54 +0000
commitec972df60a7810d84cf3c1c13c00dbac642f47e4 (patch)
treeeee27c61a4cfbc437ccebf582c4173d09254d07a
parent8a1a63d7c9d7c9661e1bc83973a698c39fd8d926 (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.cpp61
-rw-r--r--ui/qt/widgets/display_filter_edit.h7
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