/***************************************************************************
- * Copyright (C) 2005-07 by the Quassel IRC Team *
+ * Copyright (C) 2005-08 by the Quassel Project *
* devel@quassel-irc.org *
* *
* This program is free software; you can redistribute it and/or modify *
SettingsDlg::SettingsDlg(QWidget *parent) : QDialog(parent) {
ui.setupUi(this);
+ _currentPage = 0;
+ //recommendedSize = layout()->minimumSize();
+
+ // make the scrollarea behave sanely
ui.settingsFrame->setWidgetResizable(true);
ui.settingsFrame->setWidget(ui.settingsStack);
+
+ updateGeometry();
+
ui.settingsTree->setRootIsDecorated(false);
connect(ui.settingsTree, SIGNAL(itemSelectionChanged()), this, SLOT(itemSelected()));
}
/*
+QSize SettingsDlg::sizeHint() const {
+ return recommendedSize;
+}
+*/
+
+SettingsPage *SettingsDlg::currentPage() const {
+ return _currentPage;
+}
+
void SettingsDlg::registerSettingsPage(SettingsPage *sp) {
- QWidget *w = sp->widget();
- w->setParent(this);
- ui.settingsStack->addWidget(w);
+ sp->setParent(ui.settingsStack);
+ ui.settingsStack->addWidget(sp);
+ //recommendedSize = recommendedSize.expandedTo(sp->sizeHint());
+ //updateGeometry();
+ connect(sp, SIGNAL(changed(bool)), this, SLOT(setButtonStates()));
QTreeWidgetItem *cat;
QList<QTreeWidgetItem *> cats = ui.settingsTree->findItems(sp->category(), Qt::MatchExactly);
cat->setExpanded(true);
cat->setFlags(Qt::ItemIsEnabled);
} else cat = cats[0];
- QTreeWidgetItem *p = new QTreeWidgetItem(cat, QStringList(sp->title()));
- pages[QString("%1$%2").arg(sp->category()).arg(sp->title())] = sp;
+ QTreeWidgetItem *item = new QTreeWidgetItem(cat, QStringList(sp->title()));
+ treeItems[sp] = item;
+ pages[QString("%1$%2").arg(sp->category(), sp->title())] = sp;
+ sp->load();
+ // TESTING
+ // selectPage(sp->category(), sp->title());
}
void SettingsDlg::selectPage(const QString &cat, const QString &title) {
- QWidget *w = pages[QString("%1$%2").arg(cat).arg(title)]->widget();
- Q_ASSERT(w);
- ui.settingsStack->setCurrentWidget(w);
+ SettingsPage *sp = pages[QString("%1$%2").arg(cat, title)];
+ if(!sp) {
+ _currentPage = 0;
+ ui.settingsStack->setCurrentIndex(0);
+ ui.settingsTree->setCurrentItem(0);
+ return;
+ }
+ if(sp != currentPage() && currentPage() != 0 && currentPage()->hasChanged()) {
+ int ret = QMessageBox::warning(this, tr("Save changes"),
+ tr("There are unsaved changes on the current configuration page. Would you like to apply your changes now?"),
+ QMessageBox::Discard|QMessageBox::Save|QMessageBox::Cancel, QMessageBox::Cancel);
+ if(ret == QMessageBox::Save) {
+ if(!applyChanges()) sp = currentPage();
+ } else if(ret == QMessageBox::Discard) {
+ undoChanges();
+ } else sp = currentPage();
+ }
+ if(sp != currentPage()) {
+ ui.pageTitle->setText(sp->title());
+ ui.settingsStack->setCurrentWidget(sp);
+ ui.settingsStack->setMinimumSize(sp->minimumSizeHint()); // we don't want our page shrinked, use scrollbars instead...
+ _currentPage = sp;
+ }
+ ui.settingsTree->setCurrentItem(treeItems[sp]);
+ setButtonStates();
}
void SettingsDlg::itemSelected() {
}
}
+void SettingsDlg::setButtonStates() {
+ SettingsPage *sp = currentPage();
+ ui.buttonBox->button(QDialogButtonBox::Apply)->setEnabled(sp && sp->hasChanged());
+ ui.buttonBox->button(QDialogButtonBox::Reset)->setEnabled(sp && sp->hasChanged());
+ ui.buttonBox->button(QDialogButtonBox::RestoreDefaults)->setEnabled(sp && sp->hasDefaults());
+}
+
void SettingsDlg::buttonClicked(QAbstractButton *button) {
- switch(ui.buttonBox->buttonRole(button)) {
- case QDialogButtonBox::AcceptRole:
- applyChanges();
- accept();
+ switch(ui.buttonBox->standardButton(button)) {
+ case QDialogButtonBox::Ok:
+ if(currentPage() && currentPage()->hasChanged()) {
+ if(applyChanges()) accept();
+ } else accept();
break;
- case QDialogButtonBox::ApplyRole:
+ case QDialogButtonBox::Apply:
applyChanges();
break;
- case QDialogButtonBox::RejectRole:
+ case QDialogButtonBox::Cancel:
+ undoChanges();
reject();
break;
+ case QDialogButtonBox::Reset:
+ reload();
+ break;
+ case QDialogButtonBox::RestoreDefaults:
+ loadDefaults();
+ break;
default:
break;
}
}
-void SettingsDlg::applyChanges() {
- //SettingsInterface *sp = qobject_cast<SettingsInterface *>(ui.settingsStack->currentWidget());
- //if(sp) sp->applyChanges();
+bool SettingsDlg::applyChanges() {
+ if(!currentPage()) return false;
+ if(currentPage()->aboutToSave()) {
+ currentPage()->save();
+ return true;
+ }
+ return false;
+}
+
+void SettingsDlg::undoChanges() {
+ if(currentPage()) {
+ currentPage()->load();
+ }
+}
+
+void SettingsDlg::reload() {
+ if(!currentPage()) return;
+ int ret = QMessageBox::question(this, tr("Reload Settings"), tr("Do you like to reload the settings, undoing your changes on this page?"),
+ QMessageBox::Yes|QMessageBox::No, QMessageBox::No);
+ if(ret == QMessageBox::Yes) {
+ currentPage()->load();
+ }
+}
+
+void SettingsDlg::loadDefaults() {
+ if(!currentPage()) return;
+ int ret = QMessageBox::question(this, tr("Restore Defaults"), tr("Do you like to restore the default values for this page?"),
+ QMessageBox::RestoreDefaults|QMessageBox::Cancel, QMessageBox::Cancel);
+ if(ret == QMessageBox::RestoreDefaults) {
+ currentPage()->defaults();
+ }
}
-*/