From 7fdf4ceaa6d5bacb69165adc2e7c7f56d696a685 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stig=20Bj=C3=B8rlykke?= Date: Wed, 27 Jan 2016 21:30:52 +0100 Subject: Qt: Update display filter bookmarks when list changed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Recreate the display filter bookmarks menu only when the list has changed, not every time the display filter changes. The list changes when removing an entry from the menu and when changing the list in the "Manage Display Filters" dialog. Save the list when removing an entry from the menu. Change-Id: Icd08e0a80085cca55c0e63177d45abe4902c7c3e Reviewed-on: https://code.wireshark.org/review/13567 Petri-Dish: Stig Bjørlykke Tested-by: Petri Dish Buildbot Reviewed-by: Gerald Combs Reviewed-by: Stig Bjørlykke --- ui/qt/display_filter_edit.cpp | 92 +++++++++++++++++++++++++++++++------------ 1 file changed, 66 insertions(+), 26 deletions(-) (limited to 'ui/qt/display_filter_edit.cpp') diff --git a/ui/qt/display_filter_edit.cpp b/ui/qt/display_filter_edit.cpp index 3d7df3eeb1..749f856403 100644 --- a/ui/qt/display_filter_edit.cpp +++ b/ui/qt/display_filter_edit.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #include #include @@ -98,6 +99,8 @@ static const QString fld_abbrev_chars_ = "-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ DisplayFilterEdit::DisplayFilterEdit(QWidget *parent, DisplayFilterEditType type) : SyntaxLineEdit(parent), type_(type), + save_action_(NULL), + remove_action_(NULL), bookmark_button_(NULL), clear_button_(NULL), apply_button_(NULL) @@ -193,7 +196,9 @@ DisplayFilterEdit::DisplayFilterEdit(QWidget *parent, DisplayFilterEditType type .arg(bksz.width()) .arg(cbsz.width() + apsz.width() + frameWidth + 1) ); - checkFilter(); + + connect(wsApp, SIGNAL(appInitialized()), this, SLOT(updateBookmarkMenu())); + connect(wsApp, SIGNAL(displayFilterListChanged()), this, SLOT(updateBookmarkMenu())); } void DisplayFilterEdit::setDefaultPlaceholderText() @@ -335,57 +340,77 @@ void DisplayFilterEdit::checkFilter(const QString& filter_text) if (bookmark_button_) { bool enable_save_action = false; bool match = false; - QMenu *bb_menu = bookmark_button_->menu(); - bb_menu->clear(); - QAction *save_action = bb_menu->addAction(tr("Save this filter")); - connect(save_action, SIGNAL(triggered(bool)), this, SLOT(saveFilter())); - QAction *manage_action = bb_menu->addAction(tr("Manage Display Filters")); - connect(manage_action, SIGNAL(triggered(bool)), this, SLOT(showFilters())); - QAction *expr_action = bb_menu->addAction(tr("Manage Filter Expressions")); - connect(expr_action, SIGNAL(triggered(bool)), this, SLOT(showExpressionPrefs())); - - QAction *first_filter = NULL; for (GList *df_item = get_filter_list_first(DFILTER_LIST); df_item; df_item = g_list_next(df_item)) { if (!df_item->data) continue; filter_def *df_def = (filter_def *) df_item->data; if (!df_def->name || !df_def->strval) continue; - int one_em = bb_menu->fontMetrics().height(); - QString prep_text = QString("%1: %2").arg(df_def->name).arg(df_def->strval); - prep_text = bb_menu->fontMetrics().elidedText(prep_text, Qt::ElideRight, one_em * 40); - - QAction *prep_action = bb_menu->addAction(prep_text); - prep_action->setData(df_def->strval); - connect(prep_action, SIGNAL(triggered(bool)), this, SLOT(prepareFilter())); - if (!first_filter) first_filter = prep_action; - if (filter_text.compare(df_def->strval) == 0) { match = true; } } - if (first_filter) bb_menu->insertSeparator(first_filter); if (match) { bookmark_button_->setStockIcon("x-filter-matching-bookmark"); - QAction *remove_action = new QAction(tr("Remove this filter"), bb_menu); - bb_menu->insertAction(manage_action, remove_action); - remove_action->setData(filter_text); - connect(remove_action, SIGNAL(triggered(bool)), this, SLOT(removeFilter())); + if (remove_action_) { + remove_action_->setData(text()); + remove_action_->setVisible(true); + } } else { bookmark_button_->setStockIcon("x-filter-bookmark"); + if (remove_action_) { + remove_action_->setVisible(false); + } } if (!match && (syntaxState() == Valid || syntaxState() == Deprecated) && !filter_text.isEmpty()) { enable_save_action = true; } - save_action->setEnabled(enable_save_action); + if (save_action_) { + save_action_->setEnabled(enable_save_action); + } } if (apply_button_) { apply_button_->setEnabled(syntaxState() != Invalid); } } +void DisplayFilterEdit::updateBookmarkMenu() +{ + if (!bookmark_button_) + return; + + QMenu *bb_menu = bookmark_button_->menu(); + bb_menu->clear(); + + save_action_ = bb_menu->addAction(tr("Save this filter")); + connect(save_action_, SIGNAL(triggered(bool)), this, SLOT(saveFilter())); + remove_action_ = bb_menu->addAction(tr("Remove this filter")); + connect(remove_action_, SIGNAL(triggered(bool)), this, SLOT(removeFilter())); + QAction *manage_action = bb_menu->addAction(tr("Manage Display Filters")); + connect(manage_action, SIGNAL(triggered(bool)), this, SLOT(showFilters())); + QAction *expr_action = bb_menu->addAction(tr("Manage Filter Expressions")); + connect(expr_action, SIGNAL(triggered(bool)), this, SLOT(showExpressionPrefs())); + bb_menu->addSeparator(); + + for (GList *df_item = get_filter_list_first(DFILTER_LIST); df_item; df_item = g_list_next(df_item)) { + if (!df_item->data) continue; + filter_def *df_def = (filter_def *) df_item->data; + if (!df_def->name || !df_def->strval) continue; + + int one_em = bb_menu->fontMetrics().height(); + QString prep_text = QString("%1: %2").arg(df_def->name).arg(df_def->strval); + prep_text = bb_menu->fontMetrics().elidedText(prep_text, Qt::ElideRight, one_em * 40); + + QAction *prep_action = bb_menu->addAction(prep_text); + prep_action->setData(df_def->strval); + connect(prep_action, SIGNAL(triggered(bool)), this, SLOT(prepareFilter())); + } + + checkFilter(); +} + // GTK+ behavior: // - Operates on words (proto.c:fld_abbrev_chars). // - Popup appears when you enter or remove text. @@ -537,6 +562,21 @@ void DisplayFilterEdit::removeFilter() remove_from_filter_list(DFILTER_LIST, df_item); } } + + char *f_path; + int f_save_errno; + + save_filter_list(DFILTER_LIST, &f_path, &f_save_errno); + if (f_path != NULL) { + // We had an error saving the filter. + QString warning_title = tr("Unable to save display filter settings."); + QString warning_msg = tr("Could not save to your display filter file\n\"%1\": %2.").arg(f_path).arg(g_strerror(f_save_errno)); + + QMessageBox::warning(this, warning_title, warning_msg, QMessageBox::Ok); + g_free(f_path); + } + + updateBookmarkMenu(); } void DisplayFilterEdit::showFilters() -- cgit v1.2.3