static guint module_prefs_unstash(module_t *module, gpointer data) { gboolean *must_redissect_p = (gboolean *)data; pref_unstash_data_t unstashed_data; unstashed_data.handle_decode_as = TRUE; module->prefs_changed_flags = 0; /* assume none of them changed */ for (GList *pref_l = module->prefs; pref_l && pref_l->data; pref_l = g_list_next(pref_l)) { pref_t *pref = (pref_t *) pref_l->data; if (prefs_get_type(pref) == PREF_OBSOLETE || prefs_get_type(pref) == PREF_STATIC_TEXT) continue; unstashed_data.module = module; pref_unstash(pref, &unstashed_data); } /* If any of them changed, indicate that we must redissect and refilter the current capture (if we have one), as the preference change could cause packets to be dissected differently. */ *must_redissect_p |= module->prefs_changed_flags; if(prefs_module_has_submodules(module)) return prefs_modules_foreach_submodules(module, module_prefs_unstash, data); return 0; /* Keep unstashing. */ }
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, SIGNAL(toggled(bool)), this, SLOT(boolCheckBoxToggled(bool))); }
static guint module_prefs_clean_stash(module_t *module, gpointer) { for (GList *pref_l = module->prefs; pref_l && pref_l->data; pref_l = g_list_next(pref_l)) { pref_t *pref = (pref_t *) pref_l->data; if (prefs_get_type(pref) == PREF_OBSOLETE || prefs_get_type(pref) == PREF_STATIC_TEXT) continue; pref_clean_stash(pref, NULL); } if(prefs_module_has_submodules(module)) return prefs_modules_foreach_submodules(module, module_prefs_clean_stash, NULL); return 0; /* Keep cleaning modules */ }
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); /* Add items for each of the preferences */ prefs_pref_foreach(module, pref_show, (gpointer) ui->verticalLayout); 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, SIGNAL(textEdited(QString)), this, SLOT(uintLineEditTextEdited(QString))); break; case PREF_UINT: connect(le, SIGNAL(textEdited(QString)), this, SLOT(uintLineEditTextEdited(QString))); break; case PREF_STRING: case PREF_SAVE_FILENAME: case PREF_OPEN_FILENAME: case PREF_DIRNAME: connect(le, SIGNAL(textEdited(QString)), this, SLOT(stringLineEditTextEdited(QString))); break; case PREF_RANGE: case PREF_DECODE_AS_RANGE: connect(le, SIGNAL(textEdited(QString)), this, SLOT(rangeSyntaxLineEditTextEdited(QString))); break; default: break; } }
/* Add a single preference to the QVBoxLayout 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; // Convert the pref description from plain text to rich text. QString description = html_escape(prefs_get_description(pref)); description.replace('\n', "<br>"); QString tooltip = QString("<span>%1</span>").arg(description); 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; if (prefs_get_enumvals(pref) == NULL) 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); for (ev = prefs_get_enumvals(pref); ev && ev->description; ev++) { 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); } } 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)); } hb->addWidget(new QLabel(prefs_get_title(pref))); 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_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" UTF8_HORIZONTAL_ELLIPSIS)); 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" UTF8_HORIZONTAL_ELLIPSIS)); 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; } default: break; } return 0; }