X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fsettingsdlg.cpp;h=bde95b7e17ecb8b8edbf57b97c2b396bf81fa1ac;hp=66a646bc29b31a80fac5c358cc76b7fb440e0927;hb=0fe27b9f3c35b979eed0eaa1a89ffea57aeb52b8;hpb=8699dd758516d0ded076811e8ea656adc95e69d0 diff --git a/src/qtui/settingsdlg.cpp b/src/qtui/settingsdlg.cpp index 66a646bc..bde95b7e 100644 --- a/src/qtui/settingsdlg.cpp +++ b/src/qtui/settingsdlg.cpp @@ -20,66 +20,108 @@ #include "settingsdlg.h" -SettingsDlg::SettingsDlg(QWidget *parent) : QDialog(parent) { +#include "iconloader.h" + +SettingsDlg::SettingsDlg(QWidget *parent) + : QDialog(parent), + _currentPage(0) +{ ui.setupUi(this); + setModal(true); + setAttribute(Qt::WA_DeleteOnClose, true); + setWindowIcon(SmallIcon("configure")); + + updateGeometry(); - //ui.settingsFrame->setWidgetResizable(true); - //ui.settingsFrame->setWidget(ui.settingsStack); ui.settingsTree->setRootIsDecorated(false); connect(ui.settingsTree, SIGNAL(itemSelectionChanged()), this, SLOT(itemSelected())); connect(ui.buttonBox, SIGNAL(clicked(QAbstractButton *)), this, SLOT(buttonClicked(QAbstractButton *))); -} + setButtonStates(); +} void SettingsDlg::registerSettingsPage(SettingsPage *sp) { sp->setParent(ui.settingsStack); ui.settingsStack->addWidget(sp); + connect(sp, SIGNAL(changed(bool)), this, SLOT(setButtonStates())); + QTreeWidgetItem *cat; QList cats = ui.settingsTree->findItems(sp->category(), Qt::MatchExactly); if(!cats.count()) { cat = new QTreeWidgetItem(ui.settingsTree, QStringList(sp->category())); cat->setExpanded(true); cat->setFlags(Qt::ItemIsEnabled); - } else cat = cats[0]; - new QTreeWidgetItem(cat, QStringList(sp->title())); - pages[QString("%1$%2").arg(sp->category(), sp->title())] = sp; - updateGeometry(); - // TESTING - selectPage(sp->category(), sp->title()); + } else { + cat = cats[0]; + } + QTreeWidgetItem *item = new QTreeWidgetItem(cat, QStringList(sp->title())); + item->setData(0, SettingsPageRole, qVariantFromValue(sp)); + pageIsLoaded[sp] = false; } -void SettingsDlg::selectPage(const QString &cat, const QString &title) { - QWidget *w = pages[QString("%1$%2").arg(cat, title)]; - Q_ASSERT(w); - ui.settingsStack->setCurrentWidget(w); +void SettingsDlg::selectPage(SettingsPage *sp) { + if(!sp) { + _currentPage = 0; + ui.settingsStack->setCurrentIndex(0); + ui.pageTitle->setText(tr("Settings")); + return; + } + + if(!pageIsLoaded[sp]) { + sp->load(); + pageIsLoaded[sp] = true; + } + + 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()); + setWindowTitle(tr("Configure %1").arg(sp->title())); + ui.settingsStack->setCurrentWidget(sp); + _currentPage = sp; + } + setButtonStates(); } void SettingsDlg::itemSelected() { QList items = ui.settingsTree->selectedItems(); - if(!items.count()) { - return; - } else { - QTreeWidgetItem *parent = items[0]->parent(); - if(!parent) return; - QString cat = parent->text(0); - QString title = items[0]->text(0); - selectPage(cat, title); - ui.pageTitle->setText(title); + SettingsPage *sp = 0; + if(!items.isEmpty()) { + sp = qobject_cast(items[0]->data(0, SettingsPageRole).value()); } + selectPage(sp); +} + +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->standardButton(button)) { case QDialogButtonBox::Ok: - applyChanges(); - accept(); + if(currentPage() && currentPage()->hasChanged()) { + if(applyChanges()) accept(); + } else accept(); break; case QDialogButtonBox::Apply: applyChanges(); break; case QDialogButtonBox::Cancel: + undoChanges(); reject(); break; case QDialogButtonBox::Reset: @@ -93,18 +135,35 @@ void SettingsDlg::buttonClicked(QAbstractButton *button) { } } -void SettingsDlg::applyChanges() { - foreach(SettingsPage *page, pages.values()) { - page->save(); +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() { - SettingsPage *page = qobject_cast(ui.settingsStack->currentWidget()); - if(page) page->load(); + 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() { - SettingsPage *page = qobject_cast(ui.settingsStack->currentWidget()); - if(page) page->defaults(); + 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(); + } }