Categories in the settings dialog are now clickable
[quassel.git] / src / qtui / settingsdlg.cpp
index b02e711..f260fb0 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-08 by the Quassel Project                          *
+ *   Copyright (C) 2005-09 by the Quassel Project                          *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
 
 #include "settingsdlg.h"
 
-SettingsDlg::SettingsDlg(QWidget *parent) : QDialog(parent) {
-  ui.setupUi(this);
-  _currentPage = 0;
-
-  //recommendedSize = layout()->minimumSize();
+#include "iconloader.h"
 
-  // make the scrollarea behave sanely
-  ui.settingsFrame->setWidgetResizable(true);
-  ui.settingsFrame->setWidget(ui.settingsStack);
+SettingsDlg::SettingsDlg(QWidget *parent)
+  : QDialog(parent),
+    _currentPage(0)
+{
+  ui.setupUi(this);
+  setModal(true);
+  setAttribute(Qt::WA_DeleteOnClose, true);
+  setWindowIcon(SmallIcon("configure"));
 
   updateGeometry();
 
@@ -36,23 +37,14 @@ SettingsDlg::SettingsDlg(QWidget *parent) : QDialog(parent) {
 
   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;
+  setButtonStates();
 }
 
 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;
@@ -60,24 +52,37 @@ void SettingsDlg::registerSettingsPage(SettingsPage *sp) {
   if(!cats.count()) {
     cat = new QTreeWidgetItem(ui.settingsTree, QStringList(sp->category()));
     cat->setExpanded(true);
-    cat->setFlags(Qt::ItemIsEnabled);
-  } else cat = cats[0];
-  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());
+    cat->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+  } else {
+    cat = cats[0];
+  }
+
+  QTreeWidgetItem *item;
+  if(sp->title().isEmpty())
+    item = cat;
+  else
+    item = new QTreeWidgetItem(cat, QStringList(sp->title()));
+
+  item->setData(0, SettingsPageRole, QVariant::fromValue<QObject *>(sp));
+  ui.settingsTree->setMinimumWidth(ui.settingsTree->header()->sectionSizeHint(0) + 5);
+  pageIsLoaded[sp] = false;
+  if(!ui.settingsTree->selectedItems().count())
+    ui.settingsTree->setCurrentItem(item);
 }
 
-void SettingsDlg::selectPage(const QString &cat, const QString &title) {
-  SettingsPage *sp = pages[QString("%1$%2").arg(cat, title)];
+void SettingsDlg::selectPage(SettingsPage *sp) {
   if(!sp) {
     _currentPage = 0;
     ui.settingsStack->setCurrentIndex(0);
-    ui.settingsTree->setCurrentItem(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?"),
@@ -88,27 +93,23 @@ void SettingsDlg::selectPage(const QString &cat, const QString &title) {
       undoChanges();
     } else sp = currentPage();
   }
+
   if(sp != currentPage()) {
     ui.pageTitle->setText(sp->title());
+    setWindowTitle(tr("Configure %1").arg(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() {
   QList<QTreeWidgetItem *> 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);
+  SettingsPage *sp = 0;
+  if(!items.isEmpty()) {
+    sp = qobject_cast<SettingsPage *>(items[0]->data(0, SettingsPageRole).value<QObject *>());
   }
+  selectPage(sp);
 }
 
 void SettingsDlg::setButtonStates() {
@@ -121,7 +122,9 @@ void SettingsDlg::setButtonStates() {
 void SettingsDlg::buttonClicked(QAbstractButton *button) {
   switch(ui.buttonBox->standardButton(button)) {
     case QDialogButtonBox::Ok:
-      if(applyChanges()) accept();
+      if(currentPage() && currentPage()->hasChanged()) {
+        if(applyChanges()) accept();
+      } else accept();
       break;
     case QDialogButtonBox::Apply:
       applyChanges();