diff options
-rw-r--r-- | epan/addr_resolv.c | 28 | ||||
-rw-r--r-- | ui/qt/QtShark.pro | 5 | ||||
-rw-r--r-- | ui/qt/module_preferences_scroll_area.cpp | 414 | ||||
-rw-r--r-- | ui/qt/module_preferences_scroll_area.h | 70 | ||||
-rw-r--r-- | ui/qt/module_preferences_scroll_area.ui | 42 | ||||
-rw-r--r-- | ui/qt/preferences_dialog.cpp | 142 | ||||
-rw-r--r-- | ui/qt/preferences_dialog.ui | 30 |
7 files changed, 679 insertions, 52 deletions
diff --git a/epan/addr_resolv.c b/epan/addr_resolv.c index f35f39e7d1..928224b85f 100644 --- a/epan/addr_resolv.c +++ b/epan/addr_resolv.c @@ -2394,27 +2394,27 @@ void addr_resolve_pref_init(module_t *nameres) { prefs_register_bool_preference(nameres, "mac_name", - "Enable MAC name resolution", + "Resolve MAC addresses", "Resolve Ethernet MAC address to manufacturer names", &gbl_resolv_flags.mac_name); prefs_register_bool_preference(nameres, "transport_name", - "Enable transport name resolution", + "Resolve transport names", "Resolve TCP/UDP ports into service names", &gbl_resolv_flags.transport_name); prefs_register_bool_preference(nameres, "network_name", - "Enable network name resolution", - "Resolve IP addresses into host names." + "Resolve network (IP) addresses", + "Resolve IPv4, IPv6, and IPX addresses into host names." " Next set of check boxes determines how name resolution should be performed" " If unchecked name resolution is made from Wiresharks host file," " name resolution block and DNS packets in the capture", &gbl_resolv_flags.network_name); prefs_register_bool_preference(nameres, "use_external_name_resolver", - "Use external network name resolver", + "Use an external network name resolver", "Use the (system's) configured name resolver" - " (e.g., DNS) to resolve network names." + " (usually DNS) to resolve network names." " Only applies when network name resolution" " is enabled", &gbl_resolv_flags.use_external_net_name_resolver); @@ -2422,14 +2422,17 @@ addr_resolve_pref_init(module_t *nameres) #if defined(HAVE_C_ARES) || defined(HAVE_GNU_ADNS) prefs_register_bool_preference(nameres, "concurrent_dns", "Enable concurrent DNS name resolution", - "Enable concurrent DNS name resolution. Only" + "Enable concurrent DNS name resolution. Only" " applies when network name resolution is" - " enabled", + " enabled. You probably want to enable this.", &gbl_resolv_flags.concurrent_dns); prefs_register_uint_preference(nameres, "name_resolve_concurrency", "Maximum concurrent requests", - "Maximum parallel running DNS requests", + "The maximum number of DNS requests that may" + " be active at any time. A large value (many" + " thousands) might overload the network or make" + " your DNS server behave badly.", 10, &name_resolve_concurrency); #else @@ -2440,10 +2443,9 @@ addr_resolve_pref_init(module_t *nameres) #endif prefs_register_bool_preference(nameres, "hosts_file_handling", - "Use hosts file from profile dir only", - "By default hosts file(s) will be loaded from multiple sources" - " by checking this box only the hostfile for the current profile will be loaded" - " if the default profile is used the hosts file must be in the same dir as preferences", + "Only use the profile \"hosts\" file", + "By default \"hosts\" files will be loaded from multiple sources." + " Checking this box only loads the \"hosts\" in the current profile.", &gbl_resolv_flags.load_hosts_file_from_profile_only); } diff --git a/ui/qt/QtShark.pro b/ui/qt/QtShark.pro index 2a891bbf71..b8b6bf5341 100644 --- a/ui/qt/QtShark.pro +++ b/ui/qt/QtShark.pro @@ -196,6 +196,7 @@ FORMS += \ main_welcome.ui \ main_window.ui \ main_window_preferences_frame.ui \ + module_preferences_scroll_area.ui \ packet_comment_dialog.ui \ packet_format_group_box.ui \ packet_range_group_box.ui \ @@ -238,6 +239,7 @@ HEADERS += $$HEADERS_WS_C \ font_color_preferences_frame.h \ layout_preferences_frame.h \ main_window_preferences_frame.h \ + module_preferences_scroll_area.h \ packet_comment_dialog.h \ packet_format_group_box.h \ preferences_dialog.h \ @@ -453,6 +455,7 @@ SOURCES += \ main_window.cpp \ main_window_preferences_frame.cpp \ main_window_slots.cpp \ + module_preferences_scroll_area.cpp \ packet_comment_dialog.cpp \ packet_format_group_box.cpp \ packet_list.cpp \ @@ -472,4 +475,4 @@ SOURCES += \ splash_overlay.cpp \ syntax_line_edit.cpp \ time_shift_dialog.cpp \ - wireshark_application.cpp + wireshark_application.cpp \ diff --git a/ui/qt/module_preferences_scroll_area.cpp b/ui/qt/module_preferences_scroll_area.cpp new file mode 100644 index 0000000000..ada6e557d2 --- /dev/null +++ b/ui/qt/module_preferences_scroll_area.cpp @@ -0,0 +1,414 @@ +/* module_preferences_scroll_area.cpp + * + * $Id$ + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "module_preferences_scroll_area.h" +#include "ui_module_preferences_scroll_area.h" +#include "syntax_line_edit.h" +#include "qt_ui_utils.h" + +#include <epan/prefs-int.h> + +#include <QAbstractButton> +#include <QButtonGroup> +#include <QCheckBox> +#include <QComboBox> +#include <QHBoxLayout> +#include <QLabel> +#include <QLineEdit> +#include <QPushButton> +#include <QRadioButton> +#include <QScrollBar> +#include <QSpacerItem> + +#include <QDebug> + +Q_DECLARE_METATYPE(pref_t *) + +const char *pref_prop_ = "pref_ptr"; + +extern "C" { +// Callbacks prefs routines + +/* show a single preference on the GtkGrid of a preference page */ +static guint +pref_show(pref_t *pref, gpointer layout_ptr) +{ + QVBoxLayout *vb = static_cast<QVBoxLayout *>(layout_ptr); + + if (!pref || !vb) return 0; + + switch (pref->type) { + case PREF_UINT: + { + QHBoxLayout *hb = new QHBoxLayout(); + hb->addWidget(new QLabel(pref->title)); + QLineEdit *uint_le = new QLineEdit(); + uint_le->setProperty(pref_prop_, qVariantFromValue(pref)); + uint_le->setMinimumWidth(uint_le->fontMetrics().height() * 8); + hb->addWidget(uint_le); + hb->addSpacerItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum)); + vb->addLayout(hb); + break; + } + case PREF_BOOL: + { + QCheckBox *bool_cb = new QCheckBox(pref->title); + bool_cb->setProperty(pref_prop_, qVariantFromValue(pref)); + vb->addWidget(bool_cb); + break; + } + case PREF_ENUM: + { + const enum_val_t *ev; + if (!pref->info.enum_info.enumvals) return 0; + + if (pref->info.enum_info.radio_buttons) { + vb->addWidget(new QLabel(pref->title)); + QButtonGroup *enum_bg = new QButtonGroup(); + for (ev = pref->info.enum_info.enumvals; ev && ev->description; ev++) { + QRadioButton *enum_rb = new QRadioButton(ev->description); + QStyleOption style_opt; + enum_rb->setProperty(pref_prop_, qVariantFromValue(pref)); + enum_rb->setStyleSheet(QString( + "QRadioButton {" + " margin-left: %1px;" + "}" + ) + .arg(enum_rb->style()->subElementRect(QStyle::SE_CheckBoxContents, &style_opt).left())); + enum_bg->addButton(enum_rb, ev->value); + vb->addWidget(enum_rb); + } + } else { + QHBoxLayout *hb = new QHBoxLayout(); + QComboBox *enum_cb = new QComboBox(); + enum_cb->setProperty(pref_prop_, qVariantFromValue(pref)); + for (ev = pref->info.enum_info.enumvals; ev && ev->description; ev++) { + enum_cb->addItem(ev->description, QVariant(ev->value)); + } + hb->addWidget(new QLabel(pref->title)); + hb->addWidget(enum_cb); + hb->addSpacerItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum)); + vb->addLayout(hb); + } + break; + } + case PREF_STRING: + { + QHBoxLayout *hb = new QHBoxLayout(); + hb->addWidget(new QLabel(pref->title)); + QLineEdit *string_le = new QLineEdit(); + string_le->setProperty(pref_prop_, qVariantFromValue(pref)); + string_le->setMinimumWidth(string_le->fontMetrics().height() * 20); + hb->addWidget(string_le); + hb->addSpacerItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum)); + vb->addLayout(hb); + break; + } + case PREF_RANGE: + { + QHBoxLayout *hb = new QHBoxLayout(); + hb->addWidget(new QLabel(pref->title)); + SyntaxLineEdit *range_se = new SyntaxLineEdit(); + range_se->setProperty(pref_prop_, qVariantFromValue(pref)); + range_se->setMinimumWidth(range_se->fontMetrics().height() * 20); + hb->addWidget(range_se); + hb->addSpacerItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum)); + vb->addLayout(hb); + break; + } + case PREF_STATIC_TEXT: + { + vb->addWidget(new QLabel(pref->title)); + break; + } + case PREF_UAT: + { + QHBoxLayout *hb = new QHBoxLayout(); + hb->addWidget(new QLabel(pref->title)); + QPushButton *uat_pb = new QPushButton("Edit..."); + uat_pb->setProperty(pref_prop_, qVariantFromValue(pref)); + hb->addWidget(uat_pb); + hb->addSpacerItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum)); + vb->addLayout(hb); + break; + } + case PREF_COLOR: + { + // XXX - Not needed yet. When it is needed we can add a label + QFrame which pops up a + // color picker similar to the Font and Colors prefs. + break; + } + default: + break; + } + return 0; +} + +} // extern "C" + +ModulePreferencesScrollArea::ModulePreferencesScrollArea(module_t *module, QWidget *parent) : + QScrollArea(parent), + ui(new Ui::ModulePreferencesScrollArea), + module_(module) +{ + ui->setupUi(this); + + if (!module) return; + + /* Add items for each of the preferences */ + prefs_pref_foreach(module, pref_show, (gpointer) ui->verticalLayout); + + foreach (QLineEdit *le, findChildren<QLineEdit *>()) { + pref_t *pref = le->property(pref_prop_).value<pref_t *>(); + if (!pref) continue; + + if (pref->type == PREF_UINT) { + connect(le, SIGNAL(textEdited(QString)), this, SLOT(uintLineEditTextEdited(QString))); + } else if (pref->type == PREF_STRING) { + connect(le, SIGNAL(textEdited(QString)), this, SLOT(stringLineEditTextEdited(QString))); + } else if (pref->type == PREF_RANGE) { + connect(le, SIGNAL(textEdited(QString)), this, SLOT(rangeSyntaxLineEditTextEdited(QString))); + } + } + + foreach (QCheckBox *cb, findChildren<QCheckBox *>()) { + pref_t *pref = cb->property(pref_prop_).value<pref_t *>(); + if (!pref) continue; + + if (pref->type == PREF_BOOL) { + connect(cb, SIGNAL(toggled(bool)), this, SLOT(boolCheckBoxToggled(bool))); + } + } + + foreach (QRadioButton *enum_rb, findChildren<QRadioButton *>()) { + pref_t *pref = enum_rb->property(pref_prop_).value<pref_t *>(); + if (!pref) continue; + + if (pref->type == PREF_ENUM && pref->info.enum_info.radio_buttons) { + connect(enum_rb, SIGNAL(toggled(bool)), this, SLOT(enumRadioButtonToggled(bool))); + } + } + + foreach (QComboBox *enum_cb, findChildren<QComboBox *>()) { + pref_t *pref = enum_cb->property(pref_prop_).value<pref_t *>(); + if (!pref) continue; + + if (pref->type == PREF_ENUM && !pref->info.enum_info.radio_buttons) { + connect(enum_cb, SIGNAL(currentIndexChanged(int)), this, SLOT(enumComboBoxCurrentIndexChanged(int))); + } + } + + foreach (QPushButton *uat_pb, findChildren<QPushButton *>()) { + pref_t *pref = uat_pb->property(pref_prop_).value<pref_t *>(); + if (!pref) continue; + + if (pref->type == PREF_UAT) { + connect(uat_pb, SIGNAL(pressed()), this, SLOT(uatPushButtonPressed())); + } + } + + ui->verticalLayout->addSpacerItem(new QSpacerItem(10, 1, QSizePolicy::Minimum, QSizePolicy::Expanding)); +} + +ModulePreferencesScrollArea::~ModulePreferencesScrollArea() +{ + delete ui; +} + +void ModulePreferencesScrollArea::showEvent(QShowEvent *evt) +{ + Q_UNUSED(evt) + updateWidgets(); +} + +void ModulePreferencesScrollArea::resizeEvent(QResizeEvent *evt) +{ + QScrollArea::resizeEvent(evt); + + if (verticalScrollBar()->isVisible()) { + setFrameStyle(QFrame::StyledPanel); + } else { + setFrameStyle(QFrame::NoFrame); + } +} + +void ModulePreferencesScrollArea::updateWidgets() +{ + foreach (QLineEdit *le, findChildren<QLineEdit *>()) { + pref_t *pref = le->property(pref_prop_).value<pref_t *>(); + if (!pref) continue; + + le->setText(gchar_free_to_qstring(prefs_pref_to_str(pref, pref_stashed)).remove(QRegExp("\n\t"))); + } + + foreach (QCheckBox *cb, findChildren<QCheckBox *>()) { + pref_t *pref = cb->property(pref_prop_).value<pref_t *>(); + if (!pref) continue; + + if (pref->type == PREF_BOOL) { + cb->setChecked(pref->stashed_val.boolval); + } + } + + foreach (QRadioButton *enum_rb, findChildren<QRadioButton *>()) { + pref_t *pref = enum_rb->property(pref_prop_).value<pref_t *>(); + if (!pref) continue; + + QButtonGroup *enum_bg = enum_rb->group(); + if (!enum_bg) continue; + + if (pref->type == PREF_ENUM && pref->info.enum_info.radio_buttons) { + if (pref->stashed_val.enumval == enum_bg->id(enum_rb)) { + enum_rb->setChecked(true); + } + } + } + + foreach (QComboBox *enum_cb, findChildren<QComboBox *>()) { + pref_t *pref = enum_cb->property(pref_prop_).value<pref_t *>(); + if (!pref) continue; + + if (pref->type == PREF_ENUM && !pref->info.enum_info.radio_buttons) { + for (int i = 0; i < enum_cb->count(); i++) { + if (pref->stashed_val.enumval == enum_cb->itemData(i).toInt()) { + enum_cb->setCurrentIndex(i); + } + } + } + } +} + +void ModulePreferencesScrollArea::uintLineEditTextEdited(const QString &new_str) +{ + QLineEdit *uint_le = qobject_cast<QLineEdit*>(sender()); + if (!uint_le) return; + + pref_t *pref = uint_le->property(pref_prop_).value<pref_t *>(); + if (!pref) return; + + bool ok; + uint new_uint = new_str.toUInt(&ok); + if (ok) { + pref->stashed_val.uint = new_uint; + } +} + +void ModulePreferencesScrollArea::boolCheckBoxToggled(bool checked) +{ + QCheckBox *bool_cb = qobject_cast<QCheckBox*>(sender()); + if (!bool_cb) return; + + pref_t *pref = bool_cb->property(pref_prop_).value<pref_t *>(); + if (!pref) return; + + pref->stashed_val.boolval = checked; +} + +void ModulePreferencesScrollArea::enumRadioButtonToggled(bool checked) +{ + if (!checked) return; + QRadioButton *enum_rb = qobject_cast<QRadioButton*>(sender()); + if (!enum_rb) return; + + QButtonGroup *enum_bg = enum_rb->group(); + if (!enum_bg) return; + + pref_t *pref = enum_rb->property(pref_prop_).value<pref_t *>(); + if (!pref) return; + + if (enum_bg->checkedId() >= 0) { + pref->stashed_val.enumval = enum_bg->checkedId(); + } +} + +void ModulePreferencesScrollArea::enumComboBoxCurrentIndexChanged(int index) +{ + QComboBox *enum_cb = qobject_cast<QComboBox*>(sender()); + if (!enum_cb) return; + + pref_t *pref = enum_cb->property(pref_prop_).value<pref_t *>(); + if (!pref) return; + + pref->stashed_val.enumval = enum_cb->itemData(index).toInt(); +} + +void ModulePreferencesScrollArea::stringLineEditTextEdited(const QString &new_str) +{ + QLineEdit *string_le = qobject_cast<QLineEdit*>(sender()); + if (!string_le) return; + + pref_t *pref = string_le->property(pref_prop_).value<pref_t *>(); + if (!pref) return; + + g_free((void *)pref->stashed_val.string); + pref->stashed_val.string = qstring_strdup(new_str); +} + +void ModulePreferencesScrollArea::rangeSyntaxLineEditTextEdited(const QString &new_str) +{ + SyntaxLineEdit *range_se = qobject_cast<SyntaxLineEdit*>(sender()); + if (!range_se) return; + + pref_t *pref = range_se->property(pref_prop_).value<pref_t *>(); + if (!pref) return; + + range_t *newrange; + convert_ret_t ret = range_convert_str(&newrange, new_str.toUtf8().constData(), pref->info.max_value); + + if (ret == CVT_NO_ERROR) { + g_free(pref->stashed_val.range); + pref->stashed_val.range = newrange; + + if (new_str.isEmpty()) { + range_se->setSyntaxState(SyntaxLineEdit::Empty); + } else { + range_se->setSyntaxState(SyntaxLineEdit::Valid); + } + } else { + range_se->setSyntaxState(SyntaxLineEdit::Invalid); + } +} + +void ModulePreferencesScrollArea::uatPushButtonPressed() +{ + QPushButton *uat_pb = qobject_cast<QPushButton*>(sender()); + if (!uat_pb) return; + + pref_t *pref = uat_pb->property(pref_prop_).value<pref_t *>(); + if (!pref) return; + + qDebug() << "FIX Implement UATs:" << pref->title; +} + +/* + * Editor modelines + * + * Local Variables: + * c-basic-offset: 4 + * tab-width: 8 + * indent-tabs-mode: nil + * End: + * + * ex: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: + */ diff --git a/ui/qt/module_preferences_scroll_area.h b/ui/qt/module_preferences_scroll_area.h new file mode 100644 index 0000000000..8a297ef86c --- /dev/null +++ b/ui/qt/module_preferences_scroll_area.h @@ -0,0 +1,70 @@ +/* module_preferences_scroll_area.h + * + * $Id$ + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef MODULE_PREFERENCES_SCROLL_AREA_H +#define MODULE_PREFERENCES_SCROLL_AREA_H + +#include "config.h" + +#include <glib.h> + +#include "color.h" +#include "packet-range.h" + +#include <epan/prefs.h> + +#include <QScrollArea> + +namespace Ui { +class ModulePreferencesScrollArea; +} + +class ModulePreferencesScrollArea : public QScrollArea +{ + Q_OBJECT + +public: + explicit ModulePreferencesScrollArea(module_t *module, QWidget *parent = 0); + ~ModulePreferencesScrollArea(); + +protected: + void showEvent(QShowEvent *evt); + void resizeEvent(QResizeEvent *evt); + +private: + Ui::ModulePreferencesScrollArea *ui; + + module_t *module_; + void updateWidgets(); + +private slots: + void uintLineEditTextEdited(const QString &new_str); + void boolCheckBoxToggled(bool checked); + void enumRadioButtonToggled(bool checked); + void enumComboBoxCurrentIndexChanged(int index); + void stringLineEditTextEdited(const QString &new_str); + void rangeSyntaxLineEditTextEdited(const QString &new_str); + void uatPushButtonPressed(); +}; + +#endif // MODULE_PREFERENCES_SCROLL_AREA_H diff --git a/ui/qt/module_preferences_scroll_area.ui b/ui/qt/module_preferences_scroll_area.ui new file mode 100644 index 0000000000..af3809d86a --- /dev/null +++ b/ui/qt/module_preferences_scroll_area.ui @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ModulePreferencesScrollArea</class> + <widget class="QScrollArea" name="ModulePreferencesScrollArea"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>300</height> + </rect> + </property> + <property name="windowTitle"> + <string>ScrollArea</string> + </property> + <property name="frameShape"> + <enum>QFrame::NoFrame</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Plain</enum> + </property> + <property name="horizontalScrollBarPolicy"> + <enum>Qt::ScrollBarAlwaysOff</enum> + </property> + <property name="widgetResizable"> + <bool>true</bool> + </property> + <widget class="QWidget" name="scrollAreaWidgetContents"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>300</height> + </rect> + </property> + <layout class="QVBoxLayout" name="verticalLayout"/> + </widget> + </widget> + <resources/> + <connections/> +</ui> diff --git a/ui/qt/preferences_dialog.cpp b/ui/qt/preferences_dialog.cpp index 588d015e55..4c2da2c703 100644 --- a/ui/qt/preferences_dialog.cpp +++ b/ui/qt/preferences_dialog.cpp @@ -23,28 +23,39 @@ #include "preferences_dialog.h" #include "ui_preferences_dialog.h" + +#include "module_preferences_scroll_area.h" #include "wireshark_application.h" +#ifdef HAVE_LIBPCAP +#ifdef _WIN32 +#include "capture-wpcap.h" +#endif /* _WIN32 */ +#endif /* HAVE_LIBPCAP */ + #include <epan/prefs-int.h> #include <ui/preference_utils.h> +#include "module_preferences_scroll_area.h" #include "syntax_line_edit.h" #include "qt_ui_utils.h" -#include <QTreeWidgetItemIterator> +#include <QColorDialog> +#include <QFileDialog> #include <QFrame> #include <QHBoxLayout> -#include <QSpacerItem> +#include <QKeyEvent> #include <QLineEdit> -#include <QFileDialog> -#include <QColorDialog> #include <QMessageBox> #include <QPushButton> -#include <QKeyEvent> +#include <QSpacerItem> +#include <QTreeWidgetItemIterator> + #include <QDebug> Q_DECLARE_METATYPE(pref_t *) +Q_DECLARE_METATYPE(QStackedWidget *) // XXX Should we move this to ui/preference_utils? static QHash<void *, pref_t *> pref_ptr_to_pref_; @@ -57,6 +68,91 @@ extern "C" { // Callbacks prefs routines static guint +pref_exists(pref_t *pref, gpointer user_data) +{ + Q_UNUSED(pref) + Q_UNUSED(user_data) + return 1; +} + +static guint +module_prefs_show(module_t *module, gpointer ti_ptr) +{ + QTreeWidgetItem *item = static_cast<QTreeWidgetItem *>(ti_ptr); + + if (!item) return 0; + + QStackedWidget *stacked_widget = item->data(0, Qt::UserRole).value<QStackedWidget *>(); + + if (!stacked_widget) return 0; + + if (!module->use_gui) { + /* This module uses its own GUI interface to modify its + * preferences, so ignore it + */ + return 0; + } + + /* + * Is this module an interior node, with modules underneath it? + */ + if (!prefs_module_has_submodules(module)) { + /* + * No. + * Does it have any preferences (other than possibly obsolete ones)? + */ + if (prefs_pref_foreach(module, pref_exists, NULL) == 0) { + /* + * No. Don't put the module into the preferences window, + * as there's nothing to show. + * + * XXX - we should do the same for interior ndes; if the module + * has no non-obsolete preferences *and* nothing under it has + * non-obsolete preferences, don't put it into the window. + */ + return 0; + } + } + + /* + * Add this module to the tree. + */ + QTreeWidgetItem *new_item = new QTreeWidgetItem(item); + new_item->setText(0, module->title); + new_item->setData(0, Qt::UserRole, item->data(0, Qt::UserRole)); + + /* + * Is this an interior node? + */ + if (prefs_module_has_submodules(module)) { + /* + * Yes. Walk the subtree and attach stuff to it. + */ + prefs_modules_foreach_submodules(module, module_prefs_show, (gpointer) new_item); + } + + /* + * We create pages for interior nodes even if they don't have + * preferences, so that we at least have something to show + * if the user clicks on them, even if it's empty. + */ + + /* Scrolled window */ + ModulePreferencesScrollArea *mpsa = new ModulePreferencesScrollArea(module); + +// /* Associate this module with the page's frame. */ +// g_object_set_data(G_OBJECT(frame), E_PAGE_MODULE_KEY, module); + + /* Add the page to the notebook */ + stacked_widget->addWidget(mpsa); + + /* Attach the page to the tree item */ + new_item->setData(0, Qt::UserRole, qVariantFromValue(qobject_cast<QWidget *>(mpsa))); + + return 0; +} + +static guint fill_advanced_prefs(module_t *module, gpointer root_ptr) { QTreeWidgetItem *root_item = static_cast<QTreeWidgetItem *>(root_ptr); @@ -160,9 +256,7 @@ module_prefs_clean_stash(module_t *module, gpointer unused) // Preference tree items const int appearance_item_ = 0; -const int protocols_item_ = 4; -const int statistics_item_ = 5; -const int advanced_item_ = 6; +const int capture_item_ = 1; // We store the saved and current preference values in the "Advanced" tree columns const int pref_ptr_col_ = 0; @@ -194,6 +288,19 @@ PreferencesDialog::PreferencesDialog(QWidget *parent) : pd_ui_->prefsTree->invisibleRootItem()->child(appearance_item_)->setExpanded(true); pd_ui_->prefsTree->setCurrentItem(pd_ui_->prefsTree->invisibleRootItem()->child(appearance_item_)); + bool disable_capture = true; +#ifdef HAVE_LIBPCAP +#ifdef _WIN32 + /* Is WPcap loaded? */ + if (has_wpcap) { +#endif /* _WIN32 */ + disable_capture = false; +#ifdef _WIN32 + } +#endif /* _WIN32 */ +#endif /* HAVE_LIBPCAP */ + pd_ui_->prefsTree->invisibleRootItem()->child(capture_item_)->setDisabled(disable_capture); + // This assumes that the prefs tree and stacked widget contents exactly // correspond to each other. QTreeWidgetItem *item = pd_ui_->prefsTree->itemAt(0,0); @@ -203,6 +310,19 @@ PreferencesDialog::PreferencesDialog(QWidget *parent) : item->setData(0, Qt::UserRole, qVariantFromValue(pd_ui_->stackedWidget->widget(i))); item = pd_ui_->prefsTree->itemBelow(item); } + + // Printing prefs don't apply here. + module_t *print_module = prefs_find_module("print"); + if (print_module) print_module->use_gui = FALSE; + + // We called takeChildren above so this shouldn't be necessary. + while (tmp_item.childCount() > 0) { + tmp_item.removeChild(tmp_item.child(0)); + } + tmp_item.setData(0, Qt::UserRole, qVariantFromValue(pd_ui_->stackedWidget)); + prefs_modules_foreach_submodules(NULL, module_prefs_show, (gpointer) &tmp_item); + pd_ui_->prefsTree->invisibleRootItem()->insertChildren( + pd_ui_->prefsTree->invisibleRootItem()->childCount() - 1, tmp_item.takeChildren()); } PreferencesDialog::~PreferencesDialog() @@ -483,7 +603,7 @@ void PreferencesDialog::on_advancedTree_itemActivated(QTreeWidgetItem *item, int pref->stashed_val.string); if (!filename.isEmpty()) { g_free((void *)pref->stashed_val.string); - pref->stashed_val.string = g_strdup(filename.toUtf8().constData()); + pref->stashed_val.string = qstring_strdup(filename); updateItem(*item); } break; @@ -588,7 +708,7 @@ void PreferencesDialog::enumPrefCurrentIndexChanged(int index) pref_t *pref = item->data(pref_ptr_col_, Qt::UserRole).value<pref_t *>(); if (!pref) return; - pref->stashed_val.enumval = cur_combo_box_->itemData(index, Qt::UserRole).toInt(); + pref->stashed_val.enumval = cur_combo_box_->itemData(index).toInt(); updateItem(*item); } @@ -601,7 +721,7 @@ void PreferencesDialog::stringPrefEditingFinished() if (!pref) return; g_free((void *)pref->stashed_val.string); - pref->stashed_val.string = g_strdup(cur_line_edit_->text().toUtf8().constData()); + pref->stashed_val.string = qstring_strdup(cur_line_edit_->text()); pd_ui_->advancedTree->removeItemWidget(item, 3); updateItem(*item); } diff --git a/ui/qt/preferences_dialog.ui b/ui/qt/preferences_dialog.ui index 32b359a95f..cc9b0c7d92 100644 --- a/ui/qt/preferences_dialog.ui +++ b/ui/qt/preferences_dialog.ui @@ -69,30 +69,6 @@ </item> <item> <property name="text"> - <string>Name Resolution</string> - </property> - <property name="flags"> - <set>ItemIsDragEnabled|ItemIsUserCheckable</set> - </property> - </item> - <item> - <property name="text"> - <string>Protocols</string> - </property> - <property name="flags"> - <set>ItemIsDragEnabled|ItemIsUserCheckable</set> - </property> - </item> - <item> - <property name="text"> - <string>Statistics</string> - </property> - <property name="flags"> - <set>ItemIsDragEnabled|ItemIsUserCheckable</set> - </property> - </item> - <item> - <property name="text"> <string>Advanced</string> </property> </item> @@ -104,15 +80,15 @@ <verstretch>0</verstretch> </sizepolicy> </property> + <property name="currentIndex"> + <number>0</number> + </property> <widget class="MainWindowPreferencesFrame" name="appearanceFrame"/> <widget class="LayoutPreferencesFrame" name="layoutFrame"/> <widget class="ColumnPreferencesFrame" name="columnFrame"/> <widget class="FontColorPreferencesFrame" name="fontandcolorFrame"/> <widget class="CapturePreferencesFrame" name="captureFrame"/> <widget class="FilterExpressionsPreferencesFrame" name="filterExpressonsFrame"/> - <widget class="QFrame" name="nameresolutionFrame"/> - <widget class="QFrame" name="protocolsFrame"/> - <widget class="QFrame" name="statisticsFrame"/> <widget class="QFrame" name="advancedFrame"> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> |