forked from osmocom/wireshark
Qt: Preferences dialog performance improvements.
Fill in advanced and module tree item text when requested. Create ModulePreferencesScrollAreas only when we need to show them. Change-Id: I5aa7d5dba8f5d20de088de3a9d1ee9d58e779269 Reviewed-on: https://code.wireshark.org/review/16181 Reviewed-by: Gerald Combs <gerald@wireshark.org> Petri-Dish: Gerald Combs <gerald@wireshark.org> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Anders Broman <a.broman58@gmail.com>
This commit is contained in:
parent
ee6c1f5d29
commit
e5a1afc6f9
|
@ -2462,7 +2462,7 @@ prefs_register_modules(void)
|
|||
* preference "string compare list" in set_pref()
|
||||
*/
|
||||
console_module = prefs_register_module(NULL, "console", "Console",
|
||||
"CONSOLE", NULL, FALSE);
|
||||
"Console logging and debugging output", NULL, FALSE);
|
||||
|
||||
custom_cbs.free_cb = custom_pref_no_cb;
|
||||
custom_cbs.reset_cb = console_log_level_reset_cb;
|
||||
|
@ -2472,7 +2472,7 @@ prefs_register_modules(void)
|
|||
custom_cbs.is_default_cb = console_log_level_is_default_cb;
|
||||
custom_cbs.to_str_cb = console_log_level_to_str_cb;
|
||||
prefs_register_uint_custom_preference(console_module, "log.level", "logging level",
|
||||
"A bitmask of glib log levels", &custom_cbs, &prefs.console_log_level);
|
||||
"A bitmask of GLib log levels", &custom_cbs, &prefs.console_log_level);
|
||||
|
||||
/* Capture
|
||||
* These are preferences that can be read/written using the
|
||||
|
@ -2481,7 +2481,7 @@ prefs_register_modules(void)
|
|||
* preference "string compare list" in set_pref()
|
||||
*/
|
||||
capture_module = prefs_register_module(NULL, "capture", "Capture",
|
||||
"CAPTURE", NULL, FALSE);
|
||||
"Capture preferences", NULL, FALSE);
|
||||
|
||||
register_string_like_preference(capture_module, "device", "Default capture device",
|
||||
"Default capture device",
|
||||
|
|
|
@ -51,8 +51,6 @@
|
|||
#include <QSpacerItem>
|
||||
#include <QTreeWidgetItemIterator>
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
Q_DECLARE_METATYPE(pref_t *)
|
||||
Q_DECLARE_METATYPE(QStackedWidget *)
|
||||
|
||||
|
@ -63,7 +61,205 @@ pref_t *prefFromPrefPtr(void *pref_ptr)
|
|||
return pref_ptr_to_pref_[pref_ptr];
|
||||
}
|
||||
|
||||
guint
|
||||
enum {
|
||||
module_type_ = 1000,
|
||||
advanced_type_,
|
||||
};
|
||||
|
||||
enum {
|
||||
adv_name_col_,
|
||||
adv_status_col_,
|
||||
adv_type_col_,
|
||||
adv_value_col_
|
||||
};
|
||||
|
||||
enum {
|
||||
stacked_role_ = Qt::UserRole + 1,
|
||||
module_name_role_,
|
||||
mpsa_role_
|
||||
};
|
||||
|
||||
class AdvancedPrefTreeWidgetItem : public QTreeWidgetItem
|
||||
{
|
||||
public:
|
||||
AdvancedPrefTreeWidgetItem(pref_t *pref, module_t *module) :
|
||||
QTreeWidgetItem (advanced_type_),
|
||||
pref_(pref),
|
||||
module_(module)
|
||||
{}
|
||||
pref_t *pref() { return pref_; }
|
||||
void updatePref() { emitDataChanged(); }
|
||||
|
||||
virtual QVariant data(int column, int role) const {
|
||||
bool is_default = stashedPrefIsDefault();
|
||||
switch (role) {
|
||||
case Qt::DisplayRole:
|
||||
switch (column) {
|
||||
case adv_name_col_:
|
||||
{
|
||||
QString full_name = QString(module_->name ? module_->name : module_->parent->name);
|
||||
full_name += QString(".%1").arg(pref_->name);
|
||||
return full_name;
|
||||
}
|
||||
case adv_status_col_:
|
||||
if ((pref_->type == PREF_UAT && (pref_->gui == GUI_ALL || pref_->gui == GUI_QT))|| pref_->type == PREF_CUSTOM) {
|
||||
return QObject::tr("Unknown");
|
||||
} else if (is_default) {
|
||||
return QObject::tr("Default");
|
||||
} else {
|
||||
return QObject::tr("Changed");
|
||||
}
|
||||
case adv_type_col_:
|
||||
return QString(prefs_pref_type_name(pref_));
|
||||
case adv_value_col_:
|
||||
{
|
||||
QString cur_value = gchar_free_to_qstring(prefs_pref_to_str(pref_, pref_stashed)).remove(QRegExp("\n\t"));
|
||||
return cur_value;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
case Qt::ToolTipRole:
|
||||
switch (column) {
|
||||
case adv_name_col_:
|
||||
return QString("<span>%1</span>").arg(pref_->description);
|
||||
case adv_status_col_:
|
||||
return QObject::tr("Has this preference been changed?");
|
||||
case adv_type_col_:
|
||||
{
|
||||
QString type_desc = gchar_free_to_qstring(prefs_pref_type_description(pref_));
|
||||
return QString("<span>%1</span>").arg(type_desc);
|
||||
}
|
||||
case adv_value_col_:
|
||||
{
|
||||
QString default_value = gchar_free_to_qstring(prefs_pref_to_str(pref_, pref_stashed));
|
||||
return QString("<span>%1</span>").arg(
|
||||
default_value.isEmpty() ? default_value : QObject::tr("Default value is empty"));
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
case Qt::FontRole:
|
||||
if (!is_default && treeWidget()) {
|
||||
QFont font = treeWidget()->font();
|
||||
font.setBold(true);
|
||||
return font;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return QTreeWidgetItem::data(column, role);
|
||||
}
|
||||
|
||||
private:
|
||||
// Copied from prefs.c:prefs_pref_is_default. We may want to move this to
|
||||
// prefs.c as well.
|
||||
bool stashedPrefIsDefault() const
|
||||
{
|
||||
if (!pref_) return false;
|
||||
|
||||
switch (pref_->type) {
|
||||
|
||||
case PREF_UINT:
|
||||
if (pref_->default_val.uint == pref_->stashed_val.uint)
|
||||
return true;
|
||||
break;
|
||||
|
||||
case PREF_BOOL:
|
||||
if (pref_->default_val.boolval == pref_->stashed_val.boolval)
|
||||
return true;
|
||||
break;
|
||||
|
||||
case PREF_ENUM:
|
||||
if (pref_->default_val.enumval == pref_->stashed_val.enumval)
|
||||
return true;
|
||||
break;
|
||||
|
||||
case PREF_STRING:
|
||||
case PREF_FILENAME:
|
||||
case PREF_DIRNAME:
|
||||
if (!(g_strcmp0(pref_->default_val.string, pref_->stashed_val.string)))
|
||||
return true;
|
||||
break;
|
||||
|
||||
case PREF_RANGE:
|
||||
{
|
||||
if ((ranges_are_equal(pref_->default_val.range, pref_->stashed_val.range)))
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
|
||||
case PREF_COLOR:
|
||||
{
|
||||
if ((pref_->default_val.color.red == pref_->stashed_val.color.red) &&
|
||||
(pref_->default_val.color.green == pref_->stashed_val.color.green) &&
|
||||
(pref_->default_val.color.blue == pref_->stashed_val.color.blue))
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
|
||||
case PREF_CUSTOM:
|
||||
case PREF_OBSOLETE:
|
||||
case PREF_STATIC_TEXT:
|
||||
case PREF_UAT:
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
pref_t *pref_;
|
||||
module_t *module_;
|
||||
};
|
||||
|
||||
class ModulePrefTreeWidgetItem : public QTreeWidgetItem
|
||||
{
|
||||
public:
|
||||
ModulePrefTreeWidgetItem(QTreeWidgetItem *parent, module_t *module) :
|
||||
QTreeWidgetItem (parent, module_type_),
|
||||
module_(module),
|
||||
mpsa_(0)
|
||||
{}
|
||||
void ensureModulePreferencesScrollArea(QStackedWidget *sw) {
|
||||
/*
|
||||
* 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 */
|
||||
if (!mpsa_) {
|
||||
mpsa_ = new ModulePreferencesScrollArea(module_);
|
||||
if (sw->indexOf(mpsa_) < 0) sw->addWidget(mpsa_);
|
||||
}
|
||||
}
|
||||
|
||||
virtual QVariant data(int column, int role) const {
|
||||
if (column == 0) {
|
||||
switch (role) {
|
||||
case Qt::DisplayRole:
|
||||
return QString(module_->title);
|
||||
case module_name_role_:
|
||||
return QString (module_->name);
|
||||
case mpsa_role_:
|
||||
return qVariantFromValue(mpsa_);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return QTreeWidgetItem::data(column, role);
|
||||
}
|
||||
|
||||
private:
|
||||
module_t *module_;
|
||||
ModulePreferencesScrollArea *mpsa_;
|
||||
};
|
||||
|
||||
extern "C" {
|
||||
// Callbacks prefs routines
|
||||
|
||||
static guint
|
||||
fill_advanced_prefs(module_t *module, gpointer root_ptr)
|
||||
{
|
||||
QTreeWidgetItem *root_item = static_cast<QTreeWidgetItem *>(root_ptr);
|
||||
|
@ -78,6 +274,10 @@ fill_advanced_prefs(module_t *module, gpointer root_ptr)
|
|||
tl_item->setText(0, module_title);
|
||||
tl_item->setToolTip(0, QString("<span>%1</span>").arg(module->description));
|
||||
tl_item->setFirstColumnSpanned(true);
|
||||
Qt::ItemFlags item_flags = tl_item->flags();
|
||||
item_flags &= ~(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
|
||||
tl_item->setFlags(item_flags);
|
||||
|
||||
|
||||
QList<QTreeWidgetItem *>tl_children;
|
||||
for (GList *pref_l = module->prefs; pref_l && pref_l->data; pref_l = g_list_next(pref_l)) {
|
||||
|
@ -90,19 +290,7 @@ fill_advanced_prefs(module_t *module, gpointer root_ptr)
|
|||
|
||||
pref_stash(pref, NULL);
|
||||
|
||||
QTreeWidgetItem *item = new QTreeWidgetItem();
|
||||
QString full_name = QString(module->name ? module->name : module->parent->name) + "." + pref->name;
|
||||
QString type_desc = gchar_free_to_qstring(prefs_pref_type_description(pref));
|
||||
QString default_value = gchar_free_to_qstring(prefs_pref_to_str(pref, pref_stashed));
|
||||
|
||||
item->setData(0, Qt::UserRole, qVariantFromValue(pref));
|
||||
item->setText(0, full_name);
|
||||
item->setToolTip(0, QString("<span>%1</span>").arg(pref->description));
|
||||
item->setToolTip(1, QObject::tr("Has this preference been changed?"));
|
||||
item->setText(2, type_name);
|
||||
item->setToolTip(2, QString("<span>%1</span>").arg(type_desc));
|
||||
item->setToolTip(3, QString("<span>%1</span>").arg(
|
||||
default_value.isEmpty() ? default_value : QObject::tr("Default value is empty")));
|
||||
AdvancedPrefTreeWidgetItem *item = new AdvancedPrefTreeWidgetItem(pref, module);
|
||||
tl_children << item;
|
||||
|
||||
// .uat is a void * so it wins the "useful key value" prize.
|
||||
|
@ -118,10 +306,6 @@ fill_advanced_prefs(module_t *module, gpointer root_ptr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
extern "C" {
|
||||
// Callbacks prefs routines
|
||||
|
||||
static guint
|
||||
pref_exists(pref_t *, gpointer)
|
||||
{
|
||||
|
@ -129,13 +313,13 @@ pref_exists(pref_t *, gpointer)
|
|||
}
|
||||
|
||||
static guint
|
||||
module_prefs_show(module_t *module, gpointer ti_ptr)
|
||||
fill_module_prefs(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 *>();
|
||||
QStackedWidget *stacked_widget = item->data(0, stacked_role_).value<QStackedWidget *>();
|
||||
|
||||
if (!stacked_widget) return 0;
|
||||
|
||||
|
@ -170,9 +354,8 @@ module_prefs_show(module_t *module, gpointer ti_ptr)
|
|||
/*
|
||||
* 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));
|
||||
ModulePrefTreeWidgetItem *new_mpti = new ModulePrefTreeWidgetItem(item, module);
|
||||
new_mpti->setData(0, stacked_role_, item->data(0, stacked_role_));
|
||||
|
||||
/*
|
||||
* Is this an interior node?
|
||||
|
@ -181,24 +364,9 @@ module_prefs_show(module_t *module, gpointer ti_ptr)
|
|||
/*
|
||||
* Yes. Walk the subtree and attach stuff to it.
|
||||
*/
|
||||
prefs_modules_foreach_submodules(module, module_prefs_show, (gpointer) new_item);
|
||||
prefs_modules_foreach_submodules(module, fill_module_prefs, (gpointer) new_mpti);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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);
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
||||
|
@ -251,9 +419,6 @@ module_prefs_clean_stash(module_t *module, gpointer)
|
|||
const int appearance_item_ = 0;
|
||||
const int capture_item_ = 1;
|
||||
|
||||
// We store the saved and current preference values in the "Advanced" tree columns
|
||||
const int pref_ptr_col_ = 0;
|
||||
|
||||
PreferencesDialog::PreferencesDialog(QWidget *parent) :
|
||||
GeometryStateDialog(parent),
|
||||
pd_ui_(new Ui::PreferencesDialog),
|
||||
|
@ -270,12 +435,6 @@ PreferencesDialog::PreferencesDialog(QWidget *parent) :
|
|||
|
||||
setWindowTitle(wsApp->windowTitleString(tr("Preferences")));
|
||||
pd_ui_->advancedTree->invisibleRootItem()->addChildren(tmp_item.takeChildren());
|
||||
QTreeWidgetItemIterator pref_it(pd_ui_->advancedTree, QTreeWidgetItemIterator::NoChildren);
|
||||
while (*pref_it) {
|
||||
updateItem(*(*pref_it));
|
||||
++pref_it;
|
||||
}
|
||||
qDebug() << "FIX: Auto-size each preference pane.";
|
||||
|
||||
pd_ui_->splitter->setStretchFactor(0, 1);
|
||||
pd_ui_->splitter->setStretchFactor(1, 5);
|
||||
|
@ -297,11 +456,11 @@ PreferencesDialog::PreferencesDialog(QWidget *parent) :
|
|||
|
||||
// PreferencesPane, prefsTree, and stackedWidget must all correspond to each other.
|
||||
// This may not be the best way to go about enforcing that.
|
||||
QTreeWidgetItem *item = pd_ui_->prefsTree->itemAt(0,0);
|
||||
QTreeWidgetItem *item = pd_ui_->prefsTree->topLevelItem(0);
|
||||
item->setSelected(true);
|
||||
pd_ui_->stackedWidget->setCurrentIndex(0);
|
||||
for (int i = 0; i < pd_ui_->stackedWidget->count() && item; i++) {
|
||||
item->setData(0, Qt::UserRole, qVariantFromValue(pd_ui_->stackedWidget->widget(i)));
|
||||
item->setData(0, mpsa_role_, qVariantFromValue(pd_ui_->stackedWidget->widget(i)));
|
||||
item = pd_ui_->prefsTree->itemBelow(item);
|
||||
}
|
||||
item = pd_ui_->prefsTree->topLevelItem(0);
|
||||
|
@ -320,8 +479,8 @@ PreferencesDialog::PreferencesDialog(QWidget *parent) :
|
|||
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);
|
||||
tmp_item.setData(0, stacked_role_, qVariantFromValue(pd_ui_->stackedWidget));
|
||||
prefs_modules_foreach_submodules(NULL, fill_module_prefs, (gpointer) &tmp_item);
|
||||
pd_ui_->prefsTree->invisibleRootItem()->insertChildren(
|
||||
pd_ui_->prefsTree->invisibleRootItem()->childCount() - 1, tmp_item.takeChildren());
|
||||
}
|
||||
|
@ -343,10 +502,21 @@ void PreferencesDialog::setPane(const QString module_name)
|
|||
{
|
||||
QTreeWidgetItemIterator pref_it(pd_ui_->prefsTree);
|
||||
while (*pref_it) {
|
||||
ModulePreferencesScrollArea *mpsa = qobject_cast<ModulePreferencesScrollArea *>((*pref_it)->data(0, Qt::UserRole).value<QWidget *>());
|
||||
if (mpsa && mpsa->name() == module_name) {
|
||||
pd_ui_->prefsTree->setCurrentItem((*pref_it));
|
||||
break;
|
||||
if ((*pref_it)->type() == module_type_) {
|
||||
ModulePrefTreeWidgetItem *mp_ti = dynamic_cast<ModulePrefTreeWidgetItem *>(*pref_it);
|
||||
// Ensure that the module's scroll area exists and that it's in the
|
||||
// widget stack.
|
||||
if (mp_ti) {
|
||||
QString mpsa_name = (*pref_it)->data(0, module_name_role_).toString();
|
||||
if (mpsa_name == module_name) {
|
||||
mp_ti->ensureModulePreferencesScrollArea(pd_ui_->stackedWidget);
|
||||
QWidget *mpsa = (*pref_it)->data(0, mpsa_role_).value<QWidget *>();
|
||||
if (mpsa) {
|
||||
pd_ui_->prefsTree->setCurrentItem((*pref_it));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
++pref_it;
|
||||
}
|
||||
|
@ -367,15 +537,17 @@ void PreferencesDialog::showEvent(QShowEvent *)
|
|||
sizes[1] += sizes[0] - new_prefs_tree_width;
|
||||
sizes[0] = new_prefs_tree_width;
|
||||
pd_ui_->splitter->setSizes(sizes);
|
||||
pd_ui_->splitter->setStretchFactor(0, 0);
|
||||
pd_ui_->splitter->setStretchFactor(0, 1);
|
||||
|
||||
pd_ui_->advancedTree->expandAll();
|
||||
pd_ui_->advancedTree->setSortingEnabled(true);
|
||||
pd_ui_->advancedTree->sortByColumn(0, Qt::AscendingOrder);
|
||||
pd_ui_->advancedTree->setColumnWidth(0, pd_ui_->stackedWidget->width() / 2); // Don't let long items widen things too much
|
||||
pd_ui_->advancedTree->resizeColumnToContents(1);
|
||||
pd_ui_->advancedTree->resizeColumnToContents(2);
|
||||
pd_ui_->advancedTree->resizeColumnToContents(3);
|
||||
|
||||
int one_em = fontMetrics().height();
|
||||
pd_ui_->advancedTree->setColumnWidth(adv_name_col_, one_em * 12); // Don't let long items widen things too much
|
||||
pd_ui_->advancedTree->resizeColumnToContents(adv_status_col_);
|
||||
pd_ui_->advancedTree->resizeColumnToContents(adv_type_col_);
|
||||
pd_ui_->advancedTree->setColumnWidth(adv_value_col_, one_em * 30);
|
||||
}
|
||||
|
||||
void PreferencesDialog::keyPressEvent(QKeyEvent *evt)
|
||||
|
@ -424,134 +596,51 @@ void PreferencesDialog::keyPressEvent(QKeyEvent *evt)
|
|||
QDialog::keyPressEvent(evt);
|
||||
}
|
||||
|
||||
// Copied from prefs.c:prefs_pref_is_default. We may want to move this to
|
||||
// prefs.c as well.
|
||||
bool PreferencesDialog::stashedPrefIsDefault(pref_t *pref)
|
||||
{
|
||||
if (!pref) return false;
|
||||
|
||||
switch (pref->type) {
|
||||
|
||||
case PREF_UINT:
|
||||
if (pref->default_val.uint == pref->stashed_val.uint)
|
||||
return true;
|
||||
break;
|
||||
|
||||
case PREF_BOOL:
|
||||
if (pref->default_val.boolval == pref->stashed_val.boolval)
|
||||
return true;
|
||||
break;
|
||||
|
||||
case PREF_ENUM:
|
||||
if (pref->default_val.enumval == pref->stashed_val.enumval)
|
||||
return true;
|
||||
break;
|
||||
|
||||
case PREF_STRING:
|
||||
case PREF_FILENAME:
|
||||
case PREF_DIRNAME:
|
||||
if (!(g_strcmp0(pref->default_val.string, pref->stashed_val.string)))
|
||||
return true;
|
||||
break;
|
||||
|
||||
case PREF_RANGE:
|
||||
{
|
||||
if ((ranges_are_equal(pref->default_val.range, pref->stashed_val.range)))
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
|
||||
case PREF_COLOR:
|
||||
{
|
||||
if ((pref->default_val.color.red == pref->stashed_val.color.red) &&
|
||||
(pref->default_val.color.green == pref->stashed_val.color.green) &&
|
||||
(pref->default_val.color.blue == pref->stashed_val.color.blue))
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
|
||||
case PREF_CUSTOM:
|
||||
case PREF_OBSOLETE:
|
||||
case PREF_STATIC_TEXT:
|
||||
case PREF_UAT:
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void PreferencesDialog::updateItem(QTreeWidgetItem &item)
|
||||
{
|
||||
pref_t *pref = item.data(pref_ptr_col_, Qt::UserRole).value<pref_t *>();
|
||||
if (!pref) return;
|
||||
|
||||
QString cur_value = gchar_free_to_qstring(prefs_pref_to_str(pref, pref_stashed)).remove(QRegExp("\n\t"));
|
||||
bool is_changed = false;
|
||||
QFont font = item.font(0);
|
||||
|
||||
if ((pref->type == PREF_UAT && (pref->gui == GUI_ALL || pref->gui == GUI_QT))|| pref->type == PREF_CUSTOM) {
|
||||
item.setText(1, tr("Unknown"));
|
||||
} else if (stashedPrefIsDefault(pref)) {
|
||||
item.setText(1, tr("Default"));
|
||||
} else {
|
||||
item.setText(1, tr("Changed"));
|
||||
is_changed = true;
|
||||
}
|
||||
font.setBold(is_changed);
|
||||
item.setFont(0, font);
|
||||
item.setFont(0, font);
|
||||
item.setFont(1, font);
|
||||
item.setFont(2, font);
|
||||
item.setFont(3, font);
|
||||
|
||||
item.setText(3, cur_value);
|
||||
}
|
||||
|
||||
void PreferencesDialog::on_prefsTree_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *)
|
||||
{
|
||||
if (!current) return;
|
||||
QWidget *new_item = current->data(0, Qt::UserRole).value<QWidget *>();
|
||||
QWidget *new_item = NULL;
|
||||
|
||||
if (current->type() == module_type_) {
|
||||
ModulePrefTreeWidgetItem *mp_ti = dynamic_cast<ModulePrefTreeWidgetItem *>(current);
|
||||
// Ensure that the module's scroll area exists and that it's in the
|
||||
// widget stack.
|
||||
if (mp_ti) mp_ti->ensureModulePreferencesScrollArea(pd_ui_->stackedWidget);
|
||||
}
|
||||
|
||||
new_item = current->data(0, mpsa_role_).value<QWidget *>();
|
||||
if (new_item) {
|
||||
pd_ui_->stackedWidget->setCurrentWidget(new_item);
|
||||
if (new_item == pd_ui_->advancedFrame) {
|
||||
QTreeWidgetItemIterator it(pd_ui_->advancedTree, QTreeWidgetItemIterator::NoChildren);
|
||||
while (*it) {
|
||||
updateItem(*(*it));
|
||||
++it;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PreferencesDialog::on_advancedSearchLineEdit_textEdited(const QString &search_re)
|
||||
{
|
||||
// Hide or show each branch
|
||||
QTreeWidgetItemIterator branch_it(pd_ui_->advancedTree);
|
||||
QRegExp regex(search_re, Qt::CaseInsensitive);
|
||||
|
||||
// Hide or show everything
|
||||
while (*branch_it) {
|
||||
if ((*branch_it)->data(pref_ptr_col_, Qt::UserRole).value<pref_t *>() == NULL) {
|
||||
(*branch_it)->setHidden(!search_re.isEmpty());
|
||||
}
|
||||
(*branch_it)->setHidden(!search_re.isEmpty());
|
||||
++branch_it;
|
||||
}
|
||||
if (search_re.isEmpty()) return;
|
||||
|
||||
// Hide or show each item, showing its parents if needed
|
||||
QTreeWidgetItemIterator pref_it(pd_ui_->advancedTree);
|
||||
while (*pref_it) {
|
||||
bool hidden = true;
|
||||
|
||||
if ((*pref_it)->data(pref_ptr_col_, Qt::UserRole).value<pref_t *>()) {
|
||||
QTreeWidgetItem *parent = (*pref_it)->parent();
|
||||
if ((*pref_it)->type() == advanced_type_) {
|
||||
|
||||
if (search_re.isEmpty() ||
|
||||
(*pref_it)->text(0).contains(regex) ||
|
||||
if ((*pref_it)->text(0).contains(regex) ||
|
||||
(*pref_it)->toolTip(0).contains(regex)) {
|
||||
hidden = false;
|
||||
}
|
||||
|
||||
(*pref_it)->setHidden(hidden);
|
||||
if (!hidden) {
|
||||
QTreeWidgetItem *parent = (*pref_it)->parent();
|
||||
while (parent) {
|
||||
parent->setHidden(false);
|
||||
parent = parent->parent();
|
||||
|
@ -571,12 +660,19 @@ void PreferencesDialog::on_advancedTree_currentItemChanged(QTreeWidgetItem *, QT
|
|||
|
||||
void PreferencesDialog::on_advancedTree_itemActivated(QTreeWidgetItem *item, int column)
|
||||
{
|
||||
pref_t *pref = item->data(pref_ptr_col_, Qt::UserRole).value<pref_t *>();
|
||||
AdvancedPrefTreeWidgetItem *adv_ti;
|
||||
pref_t *pref = NULL;
|
||||
|
||||
if (item->type() == advanced_type_) {
|
||||
adv_ti = dynamic_cast<AdvancedPrefTreeWidgetItem *>(item);
|
||||
if (adv_ti) pref = adv_ti->pref();
|
||||
}
|
||||
|
||||
if (!pref || cur_line_edit_ || cur_combo_box_) return;
|
||||
|
||||
if (column < 3) { // Reset to default
|
||||
reset_stashed_pref(pref);
|
||||
updateItem(*item);
|
||||
adv_ti->updatePref();
|
||||
} else {
|
||||
QWidget *editor = NULL;
|
||||
|
||||
|
@ -592,7 +688,7 @@ void PreferencesDialog::on_advancedTree_itemActivated(QTreeWidgetItem *item, int
|
|||
}
|
||||
case PREF_BOOL:
|
||||
pref->stashed_val.boolval = !pref->stashed_val.boolval;
|
||||
updateItem(*item);
|
||||
adv_ti->updatePref();
|
||||
break;
|
||||
case PREF_ENUM:
|
||||
{
|
||||
|
@ -631,7 +727,7 @@ void PreferencesDialog::on_advancedTree_itemActivated(QTreeWidgetItem *item, int
|
|||
if (!filename.isEmpty()) {
|
||||
g_free((void *)pref->stashed_val.string);
|
||||
pref->stashed_val.string = qstring_strdup(QDir::toNativeSeparators(filename));
|
||||
updateItem(*item);
|
||||
adv_ti->updatePref();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -660,7 +756,7 @@ void PreferencesDialog::on_advancedTree_itemActivated(QTreeWidgetItem *item, int
|
|||
pref->stashed_val.color.red = cc.red() << 8 | cc.red();
|
||||
pref->stashed_val.color.green = cc.green() << 8 | cc.green();
|
||||
pref->stashed_val.color.blue = cc.blue() << 8 | cc.blue();
|
||||
updateItem(*item);
|
||||
adv_ti->updatePref();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -718,53 +814,53 @@ void PreferencesDialog::enumPrefDestroyed()
|
|||
|
||||
void PreferencesDialog::uintPrefEditingFinished()
|
||||
{
|
||||
QTreeWidgetItem *item = pd_ui_->advancedTree->currentItem();
|
||||
if (!cur_line_edit_ || !item) return;
|
||||
AdvancedPrefTreeWidgetItem *adv_ti = dynamic_cast<AdvancedPrefTreeWidgetItem *>(pd_ui_->advancedTree->currentItem());
|
||||
if (!cur_line_edit_ || !adv_ti) return;
|
||||
|
||||
pref_t *pref = item->data(pref_ptr_col_, Qt::UserRole).value<pref_t *>();
|
||||
pref_t *pref = adv_ti->pref();
|
||||
if (!pref) return;
|
||||
|
||||
bool ok;
|
||||
guint new_val = cur_line_edit_->text().toUInt(&ok, pref->info.base);
|
||||
|
||||
if (ok) pref->stashed_val.uint = new_val;
|
||||
pd_ui_->advancedTree->removeItemWidget(item, 3);
|
||||
updateItem(*item);
|
||||
pd_ui_->advancedTree->removeItemWidget(adv_ti, 3);
|
||||
adv_ti->updatePref();
|
||||
}
|
||||
|
||||
void PreferencesDialog::enumPrefCurrentIndexChanged(int index)
|
||||
{
|
||||
QTreeWidgetItem *item = pd_ui_->advancedTree->currentItem();
|
||||
if (!cur_combo_box_ || !item || index < 0) return;
|
||||
AdvancedPrefTreeWidgetItem *adv_ti = dynamic_cast<AdvancedPrefTreeWidgetItem *>(pd_ui_->advancedTree->currentItem());
|
||||
if (!cur_combo_box_ || !adv_ti || index < 0) return;
|
||||
|
||||
pref_t *pref = item->data(pref_ptr_col_, Qt::UserRole).value<pref_t *>();
|
||||
pref_t *pref = adv_ti->pref();
|
||||
if (!pref) return;
|
||||
|
||||
pref->stashed_val.enumval = cur_combo_box_->itemData(index).toInt();
|
||||
updateItem(*item);
|
||||
adv_ti->updatePref();
|
||||
}
|
||||
|
||||
void PreferencesDialog::stringPrefEditingFinished()
|
||||
{
|
||||
QTreeWidgetItem *item = pd_ui_->advancedTree->currentItem();
|
||||
if (!cur_line_edit_ || !item) return;
|
||||
AdvancedPrefTreeWidgetItem *adv_ti = dynamic_cast<AdvancedPrefTreeWidgetItem *>(pd_ui_->advancedTree->currentItem());
|
||||
if (!cur_line_edit_ || !adv_ti) return;
|
||||
|
||||
pref_t *pref = item->data(pref_ptr_col_, Qt::UserRole).value<pref_t *>();
|
||||
pref_t *pref = adv_ti->pref();
|
||||
if (!pref) return;
|
||||
|
||||
g_free((void *)pref->stashed_val.string);
|
||||
pref->stashed_val.string = qstring_strdup(cur_line_edit_->text());
|
||||
pd_ui_->advancedTree->removeItemWidget(item, 3);
|
||||
updateItem(*item);
|
||||
pd_ui_->advancedTree->removeItemWidget(adv_ti, 3);
|
||||
adv_ti->updatePref();
|
||||
}
|
||||
|
||||
void PreferencesDialog::rangePrefTextChanged(const QString &text)
|
||||
{
|
||||
SyntaxLineEdit *syntax_edit = qobject_cast<SyntaxLineEdit *>(cur_line_edit_);
|
||||
QTreeWidgetItem *item = pd_ui_->advancedTree->currentItem();
|
||||
if (!syntax_edit || !item) return;
|
||||
AdvancedPrefTreeWidgetItem *adv_ti = dynamic_cast<AdvancedPrefTreeWidgetItem *>(pd_ui_->advancedTree->currentItem());
|
||||
if (!syntax_edit || !adv_ti) return;
|
||||
|
||||
pref_t *pref = item->data(pref_ptr_col_, Qt::UserRole).value<pref_t *>();
|
||||
pref_t *pref = adv_ti->pref();
|
||||
if (!pref) return;
|
||||
|
||||
if (text.isEmpty()) {
|
||||
|
@ -785,10 +881,10 @@ void PreferencesDialog::rangePrefTextChanged(const QString &text)
|
|||
void PreferencesDialog::rangePrefEditingFinished()
|
||||
{
|
||||
SyntaxLineEdit *syntax_edit = qobject_cast<SyntaxLineEdit *>(QObject::sender());
|
||||
QTreeWidgetItem *item = pd_ui_->advancedTree->currentItem();
|
||||
if (!syntax_edit || !item) return;
|
||||
AdvancedPrefTreeWidgetItem *adv_ti = dynamic_cast<AdvancedPrefTreeWidgetItem *>(pd_ui_->advancedTree->currentItem());
|
||||
if (!syntax_edit || !adv_ti) return;
|
||||
|
||||
pref_t *pref = item->data(pref_ptr_col_, Qt::UserRole).value<pref_t *>();
|
||||
pref_t *pref = adv_ti->pref();
|
||||
if (!pref) return;
|
||||
|
||||
range_t *newrange;
|
||||
|
@ -798,8 +894,8 @@ void PreferencesDialog::rangePrefEditingFinished()
|
|||
g_free(pref->stashed_val.range);
|
||||
pref->stashed_val.range = newrange;
|
||||
}
|
||||
pd_ui_->advancedTree->removeItemWidget(item, 3);
|
||||
updateItem(*item);
|
||||
pd_ui_->advancedTree->removeItemWidget(adv_ti, 3);
|
||||
adv_ti->updatePref();
|
||||
}
|
||||
|
||||
void PreferencesDialog::on_buttonBox_accepted()
|
||||
|
|
|
@ -36,7 +36,6 @@
|
|||
class QComboBox;
|
||||
|
||||
extern pref_t *prefFromPrefPtr(void *pref_ptr);
|
||||
extern guint fill_advanced_prefs(module_t *module, gpointer root_ptr);
|
||||
|
||||
namespace Ui {
|
||||
class PreferencesDialog;
|
||||
|
|
Loading…
Reference in New Issue