summaryrefslogtreecommitdiffstats
path: root/ui/qt/module_preferences_scroll_area.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ui/qt/module_preferences_scroll_area.cpp')
-rw-r--r--ui/qt/module_preferences_scroll_area.cpp659
1 files changed, 659 insertions, 0 deletions
diff --git a/ui/qt/module_preferences_scroll_area.cpp b/ui/qt/module_preferences_scroll_area.cpp
new file mode 100644
index 0000000..56503e0
--- /dev/null
+++ b/ui/qt/module_preferences_scroll_area.cpp
@@ -0,0 +1,659 @@
+/* module_preferences_scroll_area.cpp
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "module_preferences_scroll_area.h"
+#include <ui_module_preferences_scroll_area.h>
+#include <ui/qt/widgets/syntax_line_edit.h>
+#include "ui/qt/widgets/wireshark_file_dialog.h"
+#include <ui/qt/utils/qt_ui_utils.h>
+#include "uat_dialog.h"
+#include "main_application.h"
+#include "ui/qt/main_window.h"
+
+#include <ui/qt/utils/variant_pointer.h>
+
+#include <epan/prefs-int.h>
+
+#include <wsutil/utf8_entities.h>
+
+#include <QAbstractButton>
+#include <QButtonGroup>
+#include <QCheckBox>
+#include <QComboBox>
+#include <QHBoxLayout>
+#include <QLabel>
+#include <QLineEdit>
+#include <QMainWindow>
+#include <QPushButton>
+#include <QRadioButton>
+#include <QScrollBar>
+#include <QSpacerItem>
+#include <QRegularExpression>
+
+const char *pref_prop_ = "pref_ptr";
+
+// Escape our ampersands so that Qt won't try to interpret them as
+// mnemonics.
+static const QString title_to_shortcut(const char *title) {
+ QString shortcut_str(title);
+ shortcut_str.replace('&', "&&");
+ return shortcut_str;
+}
+
+typedef struct
+{
+ QVBoxLayout *layout;
+ QString moduleName;
+} prefSearchData;
+
+extern "C" {
+// Callbacks prefs routines
+
+/* Add a single preference to the QVBoxLayout of a preference page */
+static guint
+pref_show(pref_t *pref, gpointer user_data)
+{
+ prefSearchData * data = static_cast<prefSearchData *>(user_data);
+
+ if (!pref || !data) return 0;
+
+ QVBoxLayout *vb = data->layout;
+
+ // Convert the pref description from plain text to rich text.
+ QString description = html_escape(prefs_get_description(pref));
+ QString name = QString("%1.%2").arg(data->moduleName).arg(prefs_get_name(pref));
+ description.replace('\n', "<br/>");
+ QString tooltip = QString("<span>%1</span><br/><br/>%2").arg(description).arg(name);
+
+ switch (prefs_get_type(pref)) {
+ case PREF_UINT:
+ case PREF_DECODE_AS_UINT:
+ {
+ QHBoxLayout *hb = new QHBoxLayout();
+ QLabel *label = new QLabel(prefs_get_title(pref));
+ label->setToolTip(tooltip);
+ hb->addWidget(label);
+ QLineEdit *uint_le = new QLineEdit();
+ uint_le->setToolTip(tooltip);
+ uint_le->setProperty(pref_prop_, VariantPointer<pref_t>::asQVariant(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(title_to_shortcut(prefs_get_title(pref)));
+ bool_cb->setToolTip(tooltip);
+ bool_cb->setProperty(pref_prop_, VariantPointer<pref_t>::asQVariant(pref));
+ vb->addWidget(bool_cb);
+ break;
+ }
+ case PREF_ENUM:
+ {
+ const enum_val_t *ev;
+ ev = prefs_get_enumvals(pref);
+ if (!ev || !ev->description)
+ return 0;
+
+ if (prefs_get_enum_radiobuttons(pref)) {
+ QLabel *label = new QLabel(prefs_get_title(pref));
+ label->setToolTip(tooltip);
+ vb->addWidget(label);
+ QButtonGroup *enum_bg = new QButtonGroup(vb);
+ while (ev->description) {
+ QRadioButton *enum_rb = new QRadioButton(title_to_shortcut(ev->description));
+ enum_rb->setToolTip(tooltip);
+ QStyleOption style_opt;
+ enum_rb->setProperty(pref_prop_, VariantPointer<pref_t>::asQVariant(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);
+ ev++;
+ }
+ } else {
+ QHBoxLayout *hb = new QHBoxLayout();
+ QComboBox *enum_cb = new QComboBox();
+ enum_cb->setToolTip(tooltip);
+ enum_cb->setProperty(pref_prop_, VariantPointer<pref_t>::asQVariant(pref));
+ for (ev = prefs_get_enumvals(pref); ev && ev->description; ev++) {
+ enum_cb->addItem(ev->description, QVariant(ev->value));
+ }
+ QLabel * lbl = new QLabel(prefs_get_title(pref));
+ lbl->setToolTip(tooltip);
+ hb->addWidget(lbl);
+ 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();
+ QLabel *label = new QLabel(prefs_get_title(pref));
+ label->setToolTip(tooltip);
+ hb->addWidget(label);
+ QLineEdit *string_le = new QLineEdit();
+ string_le->setToolTip(tooltip);
+ string_le->setProperty(pref_prop_, VariantPointer<pref_t>::asQVariant(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_PASSWORD:
+ {
+ QHBoxLayout *hb = new QHBoxLayout();
+ QLabel *label = new QLabel(prefs_get_title(pref));
+ label->setToolTip(tooltip);
+ hb->addWidget(label);
+ QLineEdit *string_le = new QLineEdit();
+ string_le->setToolTip(tooltip);
+ string_le->setProperty(pref_prop_, VariantPointer<pref_t>::asQVariant(pref));
+ string_le->setMinimumWidth(string_le->fontMetrics().height() * 20);
+ string_le->setEchoMode(QLineEdit::PasswordEchoOnEdit);
+ hb->addWidget(string_le);
+ hb->addSpacerItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum));
+ vb->addLayout(hb);
+ break;
+ }
+ case PREF_DECODE_AS_RANGE:
+ case PREF_RANGE:
+ {
+ QHBoxLayout *hb = new QHBoxLayout();
+ QLabel *label = new QLabel(prefs_get_title(pref));
+ label->setToolTip(tooltip);
+ hb->addWidget(label);
+ SyntaxLineEdit *range_se = new SyntaxLineEdit();
+ range_se->setToolTip(tooltip);
+ range_se->setProperty(pref_prop_, VariantPointer<pref_t>::asQVariant(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:
+ {
+ QLabel *label = new QLabel(prefs_get_title(pref));
+ label->setToolTip(tooltip);
+ label->setWordWrap(true);
+ vb->addWidget(label);
+ break;
+ }
+ case PREF_UAT:
+ {
+ QHBoxLayout *hb = new QHBoxLayout();
+ QLabel *label = new QLabel(prefs_get_title(pref));
+ label->setToolTip(tooltip);
+ hb->addWidget(label);
+ QPushButton *uat_pb = new QPushButton(QObject::tr("Edit…"));
+ uat_pb->setToolTip(tooltip);
+ uat_pb->setProperty(pref_prop_, VariantPointer<pref_t>::asQVariant(pref));
+ hb->addWidget(uat_pb);
+ hb->addSpacerItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum));
+ vb->addLayout(hb);
+ break;
+ }
+ case PREF_SAVE_FILENAME:
+ case PREF_OPEN_FILENAME:
+ case PREF_DIRNAME:
+ {
+ QLabel *label = new QLabel(prefs_get_title(pref));
+ label->setToolTip(tooltip);
+ vb->addWidget(label);
+ QHBoxLayout *hb = new QHBoxLayout();
+ QLineEdit *path_le = new QLineEdit();
+ path_le->setToolTip(tooltip);
+ QStyleOption style_opt;
+ path_le->setProperty(pref_prop_, VariantPointer<pref_t>::asQVariant(pref));
+ path_le->setMinimumWidth(path_le->fontMetrics().height() * 20);
+ path_le->setStyleSheet(QString(
+ "QLineEdit {"
+ " margin-left: %1px;"
+ "}"
+ )
+ .arg(path_le->style()->subElementRect(QStyle::SE_CheckBoxContents, &style_opt).left()));
+ hb->addWidget(path_le);
+ QPushButton *path_pb = new QPushButton(QObject::tr("Browse…"));
+ path_pb->setProperty(pref_prop_, VariantPointer<pref_t>::asQVariant(pref));
+ hb->addWidget(path_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;
+ }
+ case PREF_PROTO_TCP_SNDAMB_ENUM:
+ {
+ const enum_val_t *ev;
+ ev = prefs_get_enumvals(pref);
+ if (!ev || !ev->description)
+ return 0;
+
+ if (prefs_get_enum_radiobuttons(pref)) {
+ QLabel *label = new QLabel(prefs_get_title(pref));
+ label->setToolTip(tooltip);
+ vb->addWidget(label);
+ QButtonGroup *enum_bg = new QButtonGroup(vb);
+ while (ev->description) {
+ QRadioButton *enum_rb = new QRadioButton(title_to_shortcut(ev->description));
+ enum_rb->setToolTip(tooltip);
+ QStyleOption style_opt;
+ enum_rb->setProperty(pref_prop_, VariantPointer<pref_t>::asQVariant(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);
+ ev++;
+ }
+ } else {
+ QHBoxLayout *hb = new QHBoxLayout();
+ QComboBox *enum_cb = new QComboBox();
+ enum_cb->setToolTip(tooltip);
+ enum_cb->setProperty(pref_prop_, VariantPointer<pref_t>::asQVariant(pref));
+ for (ev = prefs_get_enumvals(pref); ev && ev->description; ev++) {
+ enum_cb->addItem(ev->description, QVariant(ev->value));
+ }
+ QLabel * lbl = new QLabel(prefs_get_title(pref));
+ lbl->setToolTip(tooltip);
+ hb->addWidget(lbl);
+ hb->addWidget(enum_cb);
+ hb->addSpacerItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum));
+ vb->addLayout(hb);
+ }
+ 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;
+
+ /* Show the preference's description at the top of the page */
+ QFont font;
+ font.setBold(TRUE);
+ QLabel *label = new QLabel(module->description);
+ label->setFont(font);
+ ui->verticalLayout->addWidget(label);
+
+ prefSearchData searchData;
+ searchData.layout = ui->verticalLayout;
+ searchData.moduleName = module->name;
+
+ /* Add items for each of the preferences */
+ prefs_pref_foreach(module, pref_show, &searchData);
+
+ foreach (QLineEdit *le, findChildren<QLineEdit *>()) {
+ pref_t *pref = VariantPointer<pref_t>::asPtr(le->property(pref_prop_));
+ if (!pref) continue;
+
+ switch (prefs_get_type(pref)) {
+ case PREF_DECODE_AS_UINT:
+ connect(le, &QLineEdit::textEdited, this, &ModulePreferencesScrollArea::uintLineEditTextEdited);
+ break;
+ case PREF_UINT:
+ connect(le, &QLineEdit::textEdited, this, &ModulePreferencesScrollArea::uintLineEditTextEdited);
+ break;
+ case PREF_STRING:
+ case PREF_SAVE_FILENAME:
+ case PREF_OPEN_FILENAME:
+ case PREF_DIRNAME:
+ case PREF_PASSWORD:
+ connect(le, &QLineEdit::textEdited, this, &ModulePreferencesScrollArea::stringLineEditTextEdited);
+ break;
+ case PREF_RANGE:
+ case PREF_DECODE_AS_RANGE:
+ connect(le, &QLineEdit::textEdited, this, &ModulePreferencesScrollArea::rangeSyntaxLineEditTextEdited);
+ break;
+ default:
+ break;
+ }
+ }
+
+ foreach (QCheckBox *cb, findChildren<QCheckBox *>()) {
+ pref_t *pref = VariantPointer<pref_t>::asPtr(cb->property(pref_prop_));
+ if (!pref) continue;
+
+ if (prefs_get_type(pref) == PREF_BOOL) {
+ connect(cb, &QCheckBox::toggled, this, &ModulePreferencesScrollArea::boolCheckBoxToggled);
+ }
+ }
+
+ foreach (QRadioButton *rb, findChildren<QRadioButton *>()) {
+ pref_t *pref = VariantPointer<pref_t>::asPtr(rb->property(pref_prop_));
+ if (!pref) continue;
+
+ if (prefs_get_type(pref) == PREF_ENUM && prefs_get_enum_radiobuttons(pref)) {
+ connect(rb, &QRadioButton::toggled, this, &ModulePreferencesScrollArea::enumRadioButtonToggled);
+ }
+ }
+
+ foreach (QComboBox *combo, findChildren<QComboBox *>()) {
+ pref_t *pref = VariantPointer<pref_t>::asPtr(combo->property(pref_prop_));
+ if (!pref) continue;
+
+ if (prefs_get_type(pref) == PREF_ENUM && !prefs_get_enum_radiobuttons(pref)) {
+ connect(combo, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
+ this, &ModulePreferencesScrollArea::enumComboBoxCurrentIndexChanged);
+ }
+ }
+
+ foreach (QComboBox *combo, findChildren<QComboBox *>()) {
+ pref_t *pref = VariantPointer<pref_t>::asPtr(combo->property(pref_prop_));
+ if (!pref) continue;
+
+ if (prefs_get_type(pref) == PREF_PROTO_TCP_SNDAMB_ENUM && !prefs_get_enum_radiobuttons(pref)) {
+ connect(combo, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
+ this, &ModulePreferencesScrollArea::enumComboBoxCurrentIndexChanged_PROTO_TCP);
+ }
+ }
+
+ foreach (QPushButton *pb, findChildren<QPushButton *>()) {
+ pref_t *pref = VariantPointer<pref_t>::asPtr(pb->property(pref_prop_));
+ if (!pref) continue;
+
+ switch (prefs_get_type(pref)) {
+ case PREF_UAT:
+ connect(pb, &QPushButton::clicked, this, &ModulePreferencesScrollArea::uatPushButtonClicked);
+ break;
+ case PREF_SAVE_FILENAME:
+ connect(pb, &QPushButton::clicked, this, &ModulePreferencesScrollArea::saveFilenamePushButtonClicked);
+ break;
+ case PREF_OPEN_FILENAME:
+ connect(pb, &QPushButton::clicked, this, &ModulePreferencesScrollArea::openFilenamePushButtonClicked);
+ break;
+ case PREF_DIRNAME:
+ connect(pb, &QPushButton::clicked, this, &ModulePreferencesScrollArea::dirnamePushButtonClicked);
+ break;
+ }
+ }
+
+ ui->verticalLayout->addSpacerItem(new QSpacerItem(10, 1, QSizePolicy::Minimum, QSizePolicy::Expanding));
+}
+
+ModulePreferencesScrollArea::~ModulePreferencesScrollArea()
+{
+ delete ui;
+}
+
+void ModulePreferencesScrollArea::showEvent(QShowEvent *)
+{
+ 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 = VariantPointer<pref_t>::asPtr(le->property(pref_prop_));
+ if (!pref) continue;
+
+ le->setText(gchar_free_to_qstring(prefs_pref_to_str(pref, pref_stashed)).remove(QRegularExpression("\n\t")));
+ }
+
+ foreach (QCheckBox *cb, findChildren<QCheckBox *>()) {
+ pref_t *pref = VariantPointer<pref_t>::asPtr(cb->property(pref_prop_));
+ if (!pref) continue;
+
+ if (prefs_get_type(pref) == PREF_BOOL) {
+ cb->setChecked(prefs_get_bool_value(pref, pref_stashed));
+ }
+ }
+
+ foreach (QRadioButton *enum_rb, findChildren<QRadioButton *>()) {
+ pref_t *pref = VariantPointer<pref_t>::asPtr(enum_rb->property(pref_prop_));
+ if (!pref) continue;
+
+ QButtonGroup *enum_bg = enum_rb->group();
+ if (!enum_bg) continue;
+
+ if (prefs_get_type(pref) == PREF_ENUM && prefs_get_enum_radiobuttons(pref)) {
+ if (prefs_get_enum_value(pref, pref_stashed) == enum_bg->id(enum_rb)) {
+ enum_rb->setChecked(true);
+ }
+ }
+ }
+
+ foreach (QComboBox *enum_cb, findChildren<QComboBox *>()) {
+ pref_t *pref = VariantPointer<pref_t>::asPtr(enum_cb->property(pref_prop_));
+ if (!pref) continue;
+
+ if (prefs_get_type(pref) == PREF_ENUM && !prefs_get_enum_radiobuttons(pref)) {
+ for (int i = 0; i < enum_cb->count(); i++) {
+ if (prefs_get_enum_value(pref, pref_stashed) == enum_cb->itemData(i).toInt()) {
+ enum_cb->setCurrentIndex(i);
+ }
+ }
+ }
+
+ if (prefs_get_type(pref) == PREF_PROTO_TCP_SNDAMB_ENUM && !prefs_get_enum_radiobuttons(pref)) {
+ MainWindow* topWidget = dynamic_cast<MainWindow*> (mainApp->mainWindow());
+ /* Ensure there is one unique or multiple selections. See issue 18642 */
+ if (topWidget->hasSelection() || topWidget->hasUniqueSelection()) {
+ frame_data * fdata = topWidget->frameDataForRow((topWidget->selectedRows()).at(0));
+ enum_cb->setCurrentIndex(fdata->tcp_snd_manual_analysis);
+ }
+ }
+ }
+}
+
+void ModulePreferencesScrollArea::uintLineEditTextEdited(const QString &new_str)
+{
+ QLineEdit *uint_le = qobject_cast<QLineEdit*>(sender());
+ if (!uint_le) return;
+
+ pref_t *pref = VariantPointer<pref_t>::asPtr(uint_le->property(pref_prop_));
+ if (!pref) return;
+
+ bool ok;
+ uint new_uint = new_str.toUInt(&ok, 0);
+ if (ok) {
+ prefs_set_uint_value(pref, new_uint, pref_stashed);
+ }
+}
+
+void ModulePreferencesScrollArea::boolCheckBoxToggled(bool checked)
+{
+ QCheckBox *bool_cb = qobject_cast<QCheckBox*>(sender());
+ if (!bool_cb) return;
+
+ pref_t *pref = VariantPointer<pref_t>::asPtr(bool_cb->property(pref_prop_));
+ if (!pref) return;
+
+ prefs_set_bool_value(pref, checked, pref_stashed);
+}
+
+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 = VariantPointer<pref_t>::asPtr(enum_rb->property(pref_prop_));
+ if (!pref) return;
+
+ if (enum_bg->checkedId() >= 0) {
+ prefs_set_enum_value(pref, enum_bg->checkedId(), pref_stashed);
+ }
+}
+
+void ModulePreferencesScrollArea::enumComboBoxCurrentIndexChanged(int index)
+{
+ QComboBox *enum_cb = qobject_cast<QComboBox*>(sender());
+ if (!enum_cb) return;
+
+ pref_t *pref = VariantPointer<pref_t>::asPtr(enum_cb->property(pref_prop_));
+ if (!pref) return;
+
+ prefs_set_enum_value(pref, enum_cb->itemData(index).toInt(), pref_stashed);
+}
+
+void ModulePreferencesScrollArea::stringLineEditTextEdited(const QString &new_str)
+{
+ QLineEdit *string_le = qobject_cast<QLineEdit*>(sender());
+ if (!string_le) return;
+
+ pref_t *pref = VariantPointer<pref_t>::asPtr(string_le->property(pref_prop_));
+ if (!pref) return;
+
+ prefs_set_string_value(pref, new_str.toStdString().c_str(), pref_stashed);
+}
+
+void ModulePreferencesScrollArea::rangeSyntaxLineEditTextEdited(const QString &new_str)
+{
+ SyntaxLineEdit *range_se = qobject_cast<SyntaxLineEdit*>(sender());
+ if (!range_se) return;
+
+ pref_t *pref = VariantPointer<pref_t>::asPtr(range_se->property(pref_prop_));
+ if (!pref) return;
+
+ if (prefs_set_stashed_range_value(pref, new_str.toUtf8().constData())) {
+ if (new_str.isEmpty()) {
+ range_se->setSyntaxState(SyntaxLineEdit::Empty);
+ } else {
+ range_se->setSyntaxState(SyntaxLineEdit::Valid);
+ }
+ } else {
+ range_se->setSyntaxState(SyntaxLineEdit::Invalid);
+ }
+}
+
+void ModulePreferencesScrollArea::uatPushButtonClicked()
+{
+ QPushButton *uat_pb = qobject_cast<QPushButton*>(sender());
+ if (!uat_pb) return;
+
+ pref_t *pref = VariantPointer<pref_t>::asPtr(uat_pb->property(pref_prop_));
+ if (!pref) return;
+
+ UatDialog *uat_dlg = new UatDialog(this, prefs_get_uat_value(pref));
+ uat_dlg->setWindowModality(Qt::ApplicationModal);
+ uat_dlg->setAttribute(Qt::WA_DeleteOnClose);
+ uat_dlg->show();
+}
+
+void ModulePreferencesScrollArea::saveFilenamePushButtonClicked()
+{
+ QPushButton *filename_pb = qobject_cast<QPushButton*>(sender());
+ if (!filename_pb) return;
+
+ pref_t *pref = VariantPointer<pref_t>::asPtr(filename_pb->property(pref_prop_));
+ if (!pref) return;
+
+ QString filename = WiresharkFileDialog::getSaveFileName(this, mainApp->windowTitleString(prefs_get_title(pref)),
+ prefs_get_string_value(pref, pref_stashed));
+
+ if (!filename.isEmpty()) {
+ prefs_set_string_value(pref, QDir::toNativeSeparators(filename).toStdString().c_str(), pref_stashed);
+ updateWidgets();
+ }
+}
+
+void ModulePreferencesScrollArea::openFilenamePushButtonClicked()
+{
+ QPushButton *filename_pb = qobject_cast<QPushButton*>(sender());
+ if (!filename_pb) return;
+
+ pref_t *pref = VariantPointer<pref_t>::asPtr(filename_pb->property(pref_prop_));
+ if (!pref) return;
+
+ QString filename = WiresharkFileDialog::getOpenFileName(this, mainApp->windowTitleString(prefs_get_title(pref)),
+ prefs_get_string_value(pref, pref_stashed));
+ if (!filename.isEmpty()) {
+ prefs_set_string_value(pref, QDir::toNativeSeparators(filename).toStdString().c_str(), pref_stashed);
+ updateWidgets();
+ }
+}
+
+void ModulePreferencesScrollArea::dirnamePushButtonClicked()
+{
+ QPushButton *dirname_pb = qobject_cast<QPushButton*>(sender());
+ if (!dirname_pb) return;
+
+ pref_t *pref = VariantPointer<pref_t>::asPtr(dirname_pb->property(pref_prop_));
+ if (!pref) return;
+
+ QString dirname = WiresharkFileDialog::getExistingDirectory(this, mainApp->windowTitleString(prefs_get_title(pref)),
+ prefs_get_string_value(pref, pref_stashed));
+
+ if (!dirname.isEmpty()) {
+ prefs_set_string_value(pref, QDir::toNativeSeparators(dirname).toStdString().c_str(), pref_stashed);
+ updateWidgets();
+ }
+}
+
+/*
+ * Dedicated event handling for TCP SEQ Analysis overriding.
+ */
+void ModulePreferencesScrollArea::enumComboBoxCurrentIndexChanged_PROTO_TCP(int index)
+{
+ QComboBox *enum_cb = qobject_cast<QComboBox*>(sender());
+ if (!enum_cb) return;
+
+ pref_t *pref = VariantPointer<pref_t>::asPtr(enum_cb->property(pref_prop_));
+ if (!pref) return;
+
+ MainWindow* topWidget = dynamic_cast<MainWindow*> (mainApp->mainWindow());
+
+ // method 1 : apply to one single packet
+ /* frame_data * fdata = topWidget->frameDataForRow((topWidget->selectedRows()).at(0));
+ fdata->tcp_snd_manual_analysis = enum_cb->itemData(index).toInt();*/
+
+ // method 2 : we can leverage the functionality by allowing multiple selections
+ QList<int> rows = topWidget->selectedRows();
+ foreach (int row, rows) {
+ frame_data * fdata = topWidget->frameDataForRow(row);
+ fdata->tcp_snd_manual_analysis = enum_cb->itemData(index).toInt();
+ }
+
+ prefs_set_enum_value(pref, enum_cb->itemData(index).toInt(), pref_current);
+ //prefs_set_enum_value(pref, enum_cb->itemData(index).toInt(), pref_stashed);
+ updateWidgets();
+}