Integrate DesktopNotification into system tray/status notifier
[quassel.git] / src / qtui / coreconfigwizard.cpp
index 799801a..837b084 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-08 by the Quassel IRC Team                         *
+ *   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 <QDebug>
 #include <QAbstractButton>
+#include <QFormLayout>
+#include <QSpinBox>
 
 #include "coreconfigwizard.h"
+#include "coreconnection.h"
+#include "iconloader.h"
 
-//#include "client.h"
-//#include "identitiessettingspage.h"
+CoreConfigWizard::CoreConfigWizard(CoreConnection *connection, const QList<QVariant> &backends, QWidget *parent)
+  : QWizard(parent),
+  _connection(connection)
+{
+  setModal(true);
+  setAttribute(Qt::WA_DeleteOnClose);
+
+  foreach(const QVariant &v, backends)
+    _backends[v.toMap()["DisplayName"].toString()] = v;
 
-CoreConfigWizard::CoreConfigWizard(const QList<QVariant> &backends, QWidget *parent) : QWizard(parent) {
-  foreach(QVariant v, backends) _backends[v.toMap()["DisplayName"].toString()] = v;
   setPage(IntroPage, new CoreConfigWizardPages::IntroPage(this));
   setPage(AdminUserPage, new CoreConfigWizardPages::AdminUserPage(this));
   setPage(StorageSelectionPage, new CoreConfigWizardPages::StorageSelectionPage(_backends, this));
   syncPage = new CoreConfigWizardPages::SyncPage(this);
-  connect(syncPage, SIGNAL(setupCore(const QString &)), this, SLOT(prepareCoreSetup(const QString &)));
+  connect(syncPage, SIGNAL(setupCore(const QString &, const QVariantMap &)), SLOT(prepareCoreSetup(const QString &, const QVariantMap &)));
   setPage(SyncPage, syncPage);
   syncRelayPage = new CoreConfigWizardPages::SyncRelayPage(this);
   connect(syncRelayPage, SIGNAL(startOver()), this, SLOT(startOver()));
@@ -58,32 +67,37 @@ CoreConfigWizard::CoreConfigWizard(const QList<QVariant> &backends, QWidget *par
   setModal(true);
 
   setWindowTitle(tr("Core Configuration Wizard"));
-  setPixmap(QWizard::LogoPixmap, QPixmap(":icons/quassel-icon.png"));
+  setPixmap(QWizard::LogoPixmap, DesktopIcon("quassel"));
+
+  connect(connection, SIGNAL(coreSetupSuccess()), SLOT(coreSetupSuccess()));
+  connect(connection, SIGNAL(coreSetupFailed(QString)), SLOT(coreSetupFailed(QString)));
+  //connect(connection, SIGNAL(loginSuccess()), SLOT(loginSuccess()));
+  connect(connection, SIGNAL(synchronized()), SLOT(syncFinished()));
+  connect(this, SIGNAL(rejected()), connection, SLOT(disconnectFromCore()));
 }
 
 QHash<QString, QVariant> CoreConfigWizard::backends() const {
   return _backends;
 }
 
-void CoreConfigWizard::prepareCoreSetup(const QString &backend) {
+void CoreConfigWizard::prepareCoreSetup(const QString &backend, const QVariantMap &properties) {
   // Prevent the user from changing any settings he already specified...
-  foreach(int idx, visitedPages()) page(idx)->setEnabled(false);
+  foreach(int idx, visitedPages())
+    page(idx)->setEnabled(false);
+
   QVariantMap foo;
   foo["AdminUser"] = field("adminUser.user").toString();
   foo["AdminPasswd"] = field("adminUser.password").toString();
   foo["Backend"] = backend;
-  emit setupCore(foo);
+  foo["ConnectionProperties"] = properties;
+  coreConnection()->doCoreSetup(foo);
 }
 
 void CoreConfigWizard::coreSetupSuccess() {
   syncPage->setStatus(tr("Your core has been successfully configured. Logging you in..."));
   syncPage->setError(false);
   syncRelayPage->setMode(CoreConfigWizardPages::SyncRelayPage::Error);
-  QVariantMap loginData;
-  loginData["User"] = field("adminUser.user");
-  loginData["Password"] = field("adminUser.password");
-  loginData["RememberPasswd"] = field("adminUser.rememberPasswd");
-  emit loginToCore(loginData);
+  coreConnection()->loginToCore(field("adminUser.user").toString(), field("adminUser.password").toString(), field("adminUser.rememberPasswd").toBool());
 }
 
 void CoreConfigWizard::coreSetupFailed(const QString &error) {
@@ -93,7 +107,6 @@ void CoreConfigWizard::coreSetupFailed(const QString &error) {
   //foreach(int idx, visitedPages()) page(idx)->setEnabled(true);
   //setStartId(SyncPage);
   //restart();
-
 }
 
 void CoreConfigWizard::startOver() {
@@ -110,8 +123,7 @@ void CoreConfigWizard::loginSuccess() {
 }
 
 void CoreConfigWizard::syncFinished() {
-  // TODO: display identities and networks settings if appropriate!
-  // accept();
+  accept();
 }
 
 namespace CoreConfigWizardPages {
@@ -160,9 +172,12 @@ bool AdminUserPage::isComplete() const {
 
 /*** Storage Selection Page ***/
 
-StorageSelectionPage::StorageSelectionPage(const QHash<QString, QVariant> &backends, QWidget *parent) : QWizardPage(parent) {
+StorageSelectionPage::StorageSelectionPage(const QHash<QString, QVariant> &backends, QWidget *parent)
+  : QWizardPage(parent),
+    _connectionBox(0),
+    _backends(backends)
+{
   ui.setupUi(this);
-  _backends = backends;
 
   setTitle(tr("Select Storage Backend"));
   setSubTitle(tr("Please select a database backend for the Quassel Core storage to store the backlog and other data in."));
@@ -185,9 +200,114 @@ QString StorageSelectionPage::selectedBackend() const {
   return ui.backendList->currentText();
 }
 
+QVariantMap StorageSelectionPage::connectionProperties() const {
+  QString backend = ui.backendList->itemData(ui.backendList->currentIndex()).toString();
+
+  QVariantMap properties;
+  QStringList setupKeys = _backends[backend].toMap()["SetupKeys"].toStringList();
+  if(!setupKeys.isEmpty()) {
+    QVariantMap defaults = _backends[backend].toMap()["SetupDefaults"].toMap();
+    foreach(QString key, setupKeys) {
+      QWidget *widget = _connectionBox->findChild<QWidget *>(key);
+      QVariant def;
+      if(defaults.contains(key)) {
+        def = defaults[key];
+      }
+      switch(def.type()) {
+      case QVariant::Int:
+        {
+          QSpinBox *spinbox = qobject_cast<QSpinBox *>(widget);
+          Q_ASSERT(spinbox);
+          def = QVariant(spinbox->value());
+        }
+        break;
+      default:
+        {
+          QLineEdit *lineEdit = qobject_cast<QLineEdit *>(widget);
+          Q_ASSERT(lineEdit);
+          def = QVariant(lineEdit->text());
+        }
+      }
+      properties[key] = def;
+    }
+  }
+  qDebug() << properties;
+
+
+//   QVariantMap properties = _backends[backend].toMap()["ConnectionProperties"].toMap();
+//   if(!properties.isEmpty() && _connectionBox) {
+//     QVariantMap::iterator propertyIter = properties.begin();
+//     while(propertyIter != properties.constEnd()) {
+//       QWidget *widget = _connectionBox->findChild<QWidget *>(propertyIter.key());
+//       switch(propertyIter.value().type()) {
+//       case QVariant::Int:
+//     {
+//       QSpinBox *spinbox = qobject_cast<QSpinBox *>(widget);
+//       Q_ASSERT(spinbox);
+//       propertyIter.value() = QVariant(spinbox->value());
+//     }
+//     break;
+//       default:
+//     {
+//       QLineEdit *lineEdit = qobject_cast<QLineEdit *>(widget);
+//       Q_ASSERT(lineEdit);
+//       propertyIter.value() = QVariant(lineEdit->text());
+//     }
+//       }
+//       propertyIter++;
+//     }
+//   }
+  return properties;
+}
+
 void StorageSelectionPage::on_backendList_currentIndexChanged() {
   QString backend = ui.backendList->itemData(ui.backendList->currentIndex()).toString();
   ui.description->setText(_backends[backend].toMap()["Description"].toString());
+
+  if(_connectionBox) {
+    layout()->removeWidget(_connectionBox);
+    _connectionBox->deleteLater();
+    _connectionBox = 0;
+  }
+
+  QStringList setupKeys = _backends[backend].toMap()["SetupKeys"].toStringList();
+  if(!setupKeys.isEmpty()) {
+    QVariantMap defaults = _backends[backend].toMap()["SetupDefaults"].toMap();
+    QGroupBox *propertyBox = new QGroupBox(this);
+    propertyBox->setTitle(tr("Connection Properties"));
+    QFormLayout *formlayout = new QFormLayout;
+
+    foreach(QString key, setupKeys) {
+      QWidget *widget = 0;
+      QVariant def;
+      if(defaults.contains(key)) {
+        def = defaults[key];
+      }
+      switch(def.type()) {
+      case QVariant::Int:
+        {
+          QSpinBox *spinbox = new QSpinBox(propertyBox);
+          spinbox->setMaximum(64000);
+          spinbox->setValue(def.toInt());
+          widget = spinbox;
+        }
+        break;
+      default:
+        {
+          QLineEdit *lineEdit = new QLineEdit(def.toString(), propertyBox);
+          if(key.toLower().contains("password")) {
+            lineEdit->setEchoMode(QLineEdit::Password);
+          }
+          widget = lineEdit;
+        }
+      }
+      widget->setObjectName(key);
+      formlayout->addRow(key + ":", widget);
+    }
+    propertyBox->setLayout(formlayout);
+    static_cast<QVBoxLayout *>(layout())->insertWidget(layout()->indexOf(ui.descriptionBox) + 1, propertyBox);
+    _connectionBox = propertyBox;
+  }
 }
 
 /*** Sync Page ***/
@@ -201,11 +321,14 @@ SyncPage::SyncPage(QWidget *parent) : QWizardPage(parent) {
 void SyncPage::initializePage() {
   complete = false;
   hasError = false;
-  QString backend = qobject_cast<StorageSelectionPage *>(wizard()->page(CoreConfigWizard::StorageSelectionPage))->selectedBackend();
+
+  StorageSelectionPage *storagePage = qobject_cast<StorageSelectionPage *>(wizard()->page(CoreConfigWizard::StorageSelectionPage));
+  QString backend = storagePage->selectedBackend();
+  QVariantMap properties = storagePage->connectionProperties();
   Q_ASSERT(!backend.isEmpty());
   ui.user->setText(wizard()->field("adminUser.user").toString());
   ui.backend->setText(backend);
-  emit setupCore(backend);
+  emit setupCore(backend, properties);
 }
 
 int SyncPage::nextId() const {