+
+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()) {
+ if (sp->title().isEmpty()) {
+ ui.pageTitle->setText(sp->category());
+ setWindowTitle(tr("Configure %1").arg(sp->category()));
+ }
+ else {
+ ui.pageTitle->setText(sp->title());
+ setWindowTitle(tr("Configure %1").arg(sp->title()));
+ }
+
+ ui.settingsStack->setCurrentWidget(sp);
+ _currentPage = sp;
+ }
+ setButtonStates();
+}
+
+
+void SettingsDlg::itemSelected()
+{
+ QList<QTreeWidgetItem *> items = ui.settingsTree->selectedItems();
+ SettingsPage *sp = 0;
+ if (!items.isEmpty()) {
+ sp = qobject_cast<SettingsPage *>(items[0]->data(0, SettingsPageRole).value<QObject *>());
+ }
+ 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:
+ if (currentPage() && currentPage()->hasChanged()) {
+ if (applyChanges()) accept();
+ }
+ else accept();
+ break;
+ case QDialogButtonBox::Apply:
+ applyChanges();
+ break;
+ case QDialogButtonBox::Cancel:
+ undoChanges();
+ reject();
+ break;
+ case QDialogButtonBox::Reset:
+ reload();
+ break;
+ case QDialogButtonBox::RestoreDefaults:
+ loadDefaults();
+ break;