Fixed restore-to-defaults in settings dialog.
[quassel.git] / src / qtui / settingsdlg.cpp
index 9d9d4e6..035993b 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   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()));
   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) {
-  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);
@@ -43,14 +62,40 @@ void SettingsDlg::registerSettingsPage(SettingsPage *sp) {
     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() {
@@ -66,24 +111,66 @@ void SettingsDlg::itemSelected() {
   }
 }
 
+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->buttonRole(button)) {
-    case QDialogButtonBox::AcceptRole:
-      applyChanges();
-      accept();
+  switch(ui.buttonBox->standardButton(button)) {
+    case QDialogButtonBox::Ok:
+      if(applyChanges()) 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();
+  }
 }