X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fsettingsdlg.cpp;h=62fbdd0acaa1bc91d19ea8ab7faa290c59bfc748;hp=66a646bc29b31a80fac5c358cc76b7fb440e0927;hb=e5ef65b239e9a128a5cf86e6eef9bce1fd098448;hpb=8699dd758516d0ded076811e8ea656adc95e69d0 diff --git a/src/qtui/settingsdlg.cpp b/src/qtui/settingsdlg.cpp index 66a646bc..62fbdd0a 100644 --- a/src/qtui/settingsdlg.cpp +++ b/src/qtui/settingsdlg.cpp @@ -22,19 +22,38 @@ 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.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 *))); } +/* +QSize SettingsDlg::sizeHint() const { + return recommendedSize; +} +*/ + +SettingsPage *SettingsDlg::currentPage() const { + return _currentPage; +} void SettingsDlg::registerSettingsPage(SettingsPage *sp) { 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 cats = ui.settingsTree->findItems(sp->category(), Qt::MatchExactly); @@ -43,17 +62,39 @@ void SettingsDlg::registerSettingsPage(SettingsPage *sp) { cat->setExpanded(true); cat->setFlags(Qt::ItemIsEnabled); } else cat = cats[0]; - new QTreeWidgetItem(cat, QStringList(sp->title())); + QTreeWidgetItem *item = new QTreeWidgetItem(cat, QStringList(sp->title())); + treeItems[sp] = item; pages[QString("%1$%2").arg(sp->category(), sp->title())] = sp; - updateGeometry(); // TESTING - selectPage(sp->category(), sp->title()); + //selectPage(sp->category(), sp->title()); } 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); + 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() { @@ -66,20 +107,27 @@ void SettingsDlg::itemSelected() { QString cat = parent->text(0); QString title = items[0]->text(0); selectPage(cat, title); - ui.pageTitle->setText(title); } } +void SettingsDlg::setButtonStates() { + SettingsPage *sp = currentPage(); + ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(sp && sp->hasChanged()); + 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(applyChanges()) accept(); break; case QDialogButtonBox::Apply: applyChanges(); break; case QDialogButtonBox::Cancel: + undoChanges(); reject(); break; case QDialogButtonBox::Reset: @@ -93,18 +141,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::Yes) { + currentPage()->defaults(); + } }