Who stole the ! from main.cpp?
[quassel.git] / src / qtui / settingsdlg.cpp
index 3945cd1..6c7d24a 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  *
@@ -22,6 +22,7 @@
 
 SettingsDlg::SettingsDlg(QWidget *parent) : QDialog(parent) {
   ui.setupUi(this);
+  _currentPage = 0;
 
   //ui.settingsFrame->setWidgetResizable(true);
   //ui.settingsFrame->setWidget(ui.settingsStack);
@@ -31,10 +32,14 @@ SettingsDlg::SettingsDlg(QWidget *parent) : QDialog(parent) {
   connect(ui.buttonBox, SIGNAL(clicked(QAbstractButton *)), this, SLOT(buttonClicked(QAbstractButton *)));
 }
 
+SettingsPage *SettingsDlg::currentPage() const {
+  return _currentPage;
+}
 
 void SettingsDlg::registerSettingsPage(SettingsPage *sp) {
   sp->setParent(ui.settingsStack);
   ui.settingsStack->addWidget(sp);
+  connect(sp, SIGNAL(changed(bool)), this, SLOT(setButtonStates()));
 
   QTreeWidgetItem *cat;
   QList<QTreeWidgetItem *> cats = ui.settingsTree->findItems(sp->category(), Qt::MatchExactly);
@@ -47,16 +52,21 @@ void SettingsDlg::registerSettingsPage(SettingsPage *sp) {
   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)];
+  Q_ASSERT(sp); // FIXME allow for invalid settings pages
+  ui.settingsStack->setCurrentWidget(sp);
+  _currentPage = sp;
+  setButtonStates();
 }
 
 void SettingsDlg::itemSelected() {
+  // Check if we have changed anything...
+  // TODO
+
   QList<QTreeWidgetItem *> items = ui.settingsTree->selectedItems();
   if(!items.count()) {
     return;
@@ -70,11 +80,17 @@ 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());
+}
+
 void SettingsDlg::buttonClicked(QAbstractButton *button) {
   switch(ui.buttonBox->standardButton(button)) {
     case QDialogButtonBox::Ok:
-      applyChanges();
-      accept();
+      if(applyChanges()) accept();
       break;
     case QDialogButtonBox::Apply:
       applyChanges();
@@ -93,12 +109,16 @@ 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;
 }
 
+// TODO add messagebox
 void SettingsDlg::reload() {
   SettingsPage *page = qobject_cast<SettingsPage *>(ui.settingsStack->currentWidget());
   if(page) page->load();