X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fcoreconnectdlg.cpp;h=4811e2e0ad2bbcf6e4e54887c03376e150d43053;hp=0e3fa4f79287594c41206107e2dde8a83ddb6fe6;hb=f2e4609f070221a010eef8be98524c5ce88d228b;hpb=e733408e4759473bf38831f498f48a0f2f5e6dc7 diff --git a/src/qtui/coreconnectdlg.cpp b/src/qtui/coreconnectdlg.cpp index 0e3fa4f7..4811e2e0 100644 --- a/src/qtui/coreconnectdlg.cpp +++ b/src/qtui/coreconnectdlg.cpp @@ -20,47 +20,64 @@ #include #include +#include #include "coreconnectdlg.h" #include "clientsettings.h" #include "clientsyncer.h" +#include "coreconfigwizard.h" -CoreConnectDlg::CoreConnectDlg(QWidget *parent, bool autoconnect) : QDialog(parent) { +CoreConnectDlg::CoreConnectDlg(QWidget *parent, bool autoconnect) + : QDialog(parent) +{ ui.setupUi(this); + // make it look more native under Mac OS X: + setWindowFlags(Qt::Sheet); + clientSyncer = new ClientSyncer(this); + wizard = 0; setAttribute(Qt::WA_DeleteOnClose); doingAutoConnect = false; ui.stackedWidget->setCurrentWidget(ui.accountPage); - ui.accountButtonBox->setFocus(); - ui.accountButtonBox->button(QDialogButtonBox::Ok)->setDefault(true); CoreAccountSettings s; - QString lastacc = s.lastAccount(); + AccountId lastacc = s.lastAccount(); autoConnectAccount = s.autoConnectAccount(); - accounts = s.retrieveAllAccounts(); - ui.accountList->addItems(accounts.keys()); - QList l = ui.accountList->findItems(lastacc, Qt::MatchExactly); - if(l.count()) ui.accountList->setCurrentItem(l[0]); + QListWidgetItem *currentItem = 0; + foreach(AccountId id, s.knownAccounts()) { + if(!id.isValid()) continue; + QVariantMap data = s.retrieveAccountData(id); + accounts[id] = data; + QListWidgetItem *item = new QListWidgetItem(data["AccountName"].toString(), ui.accountList); + item->setData(Qt::UserRole, QVariant::fromValue(id)); + if(id == lastacc) currentItem = item; + } + if(currentItem) ui.accountList->setCurrentItem(currentItem); else ui.accountList->setCurrentRow(0); setAccountWidgetStates(); + ui.accountButtonBox->button(QDialogButtonBox::Ok)->setFocus(); + //ui.accountButtonBox->button(QDialogButtonBox::Ok)->setAutoDefault(true); + connect(clientSyncer, SIGNAL(socketStateChanged(QAbstractSocket::SocketState)),this, SLOT(initPhaseSocketState(QAbstractSocket::SocketState))); connect(clientSyncer, SIGNAL(connectionError(const QString &)), this, SLOT(initPhaseError(const QString &))); connect(clientSyncer, SIGNAL(connectionMsg(const QString &)), this, SLOT(initPhaseMsg(const QString &))); + connect(clientSyncer, SIGNAL(encrypted(bool)), this, SLOT(encrypted(bool))); connect(clientSyncer, SIGNAL(startLogin()), this, SLOT(startLogin())); connect(clientSyncer, SIGNAL(loginFailed(const QString &)), this, SLOT(loginFailed(const QString &))); connect(clientSyncer, SIGNAL(loginSuccess()), this, SLOT(startSync())); + connect(clientSyncer, SIGNAL(startCoreSetup(const QVariantList &)), this, SLOT(startCoreConfig(const QVariantList &))); connect(clientSyncer, SIGNAL(sessionProgress(quint32, quint32)), this, SLOT(coreSessionProgress(quint32, quint32))); connect(clientSyncer, SIGNAL(networksProgress(quint32, quint32)), this, SLOT(coreNetworksProgress(quint32, quint32))); connect(clientSyncer, SIGNAL(channelsProgress(quint32, quint32)), this, SLOT(coreChannelsProgress(quint32, quint32))); connect(clientSyncer, SIGNAL(ircUsersProgress(quint32, quint32)), this, SLOT(coreIrcUsersProgress(quint32, quint32))); - connect(clientSyncer, SIGNAL(syncFinished()), this, SLOT(accept())); + connect(clientSyncer, SIGNAL(syncFinished()), this, SLOT(syncFinished())); connect(ui.user, SIGNAL(textChanged(const QString &)), this, SLOT(setLoginWidgetStates())); connect(ui.password, SIGNAL(textChanged(const QString &)), this, SLOT(setLoginWidgetStates())); @@ -68,7 +85,8 @@ CoreConnectDlg::CoreConnectDlg(QWidget *parent, bool autoconnect) : QDialog(pare connect(ui.loginButtonBox, SIGNAL(rejected()), this, SLOT(restartPhaseNull())); connect(ui.syncButtonBox->button(QDialogButtonBox::Abort), SIGNAL(clicked()), this, SLOT(restartPhaseNull())); - if(autoconnect && ui.accountList->count() && !autoConnectAccount.isEmpty() && autoConnectAccount == ui.accountList->currentItem()->text()) { + if(autoconnect && ui.accountList->count() && autoConnectAccount.isValid() + && autoConnectAccount == ui.accountList->currentItem()->data(Qt::UserRole).value()) { doingAutoConnect = true; on_accountButtonBox_accepted(); } @@ -77,7 +95,7 @@ CoreConnectDlg::CoreConnectDlg(QWidget *parent, bool autoconnect) : QDialog(pare CoreConnectDlg::~CoreConnectDlg() { if(ui.accountList->selectedItems().count()) { CoreAccountSettings s; - s.setLastAccount(ui.accountList->selectedItems()[0]->text()); + s.setLastAccount(ui.accountList->selectedItems()[0]->data(Qt::UserRole).value()); } } @@ -96,19 +114,20 @@ void CoreConnectDlg::setAccountWidgetStates() { ui.deleteAccount->setEnabled(selectedItems.count()); ui.autoConnect->setEnabled(selectedItems.count()); if(selectedItems.count()) { - ui.autoConnect->setChecked(selectedItems[0]->text() == autoConnectAccount); + ui.autoConnect->setChecked(selectedItems[0]->data(Qt::UserRole).value() == autoConnectAccount); } + ui.accountButtonBox->button(QDialogButtonBox::Ok)->setEnabled(ui.accountList->count()); } void CoreConnectDlg::on_autoConnect_clicked(bool state) { if(!state) { - autoConnectAccount = QString(); + autoConnectAccount = 0; } else { if(ui.accountList->selectedItems().count()) { - autoConnectAccount = ui.accountList->selectedItems()[0]->text(); + autoConnectAccount = ui.accountList->selectedItems()[0]->data(Qt::UserRole).value(); } else { qWarning() << "Checked auto connect without an enabled item!"; // should never happen! - autoConnectAccount = QString(); + autoConnectAccount = 0; } } setAccountWidgetStates(); @@ -117,43 +136,50 @@ void CoreConnectDlg::on_autoConnect_clicked(bool state) { void CoreConnectDlg::on_addAccount_clicked() { QStringList existing; for(int i = 0; i < ui.accountList->count(); i++) existing << ui.accountList->item(i)->text(); - CoreAccountEditDlg dlg(QString(), QVariantMap(), existing, this); + CoreAccountEditDlg dlg(0, QVariantMap(), existing, this); if(dlg.exec() == QDialog::Accepted) { - accounts[dlg.accountName()] = dlg.accountData(); - ui.accountList->addItem(dlg.accountName()); - ui.accountList->setCurrentItem(ui.accountList->findItems(dlg.accountName(), Qt::MatchExactly)[0]); + // find free ID + AccountId id = accounts.count() + 1; + for(AccountId i = 1; i <= accounts.count(); i++) { + if(!accounts.keys().contains(i)) { + id = i; + break; + } + } + QVariantMap data = dlg.accountData(); + data["AccountId"] = QVariant::fromValue(id); + accounts[id] = data; + QListWidgetItem *item = new QListWidgetItem(data["AccountName"].toString(), ui.accountList); + item->setData(Qt::UserRole, QVariant::fromValue(id)); + ui.accountList->setCurrentItem(item); } } void CoreConnectDlg::on_editAccount_clicked() { QStringList existing; for(int i = 0; i < ui.accountList->count(); i++) existing << ui.accountList->item(i)->text(); - QString current = ui.accountList->currentItem()->text(); - QVariantMap acct = accounts[current]; - CoreAccountEditDlg dlg(current, acct, existing, this); + AccountId id = ui.accountList->currentItem()->data(Qt::UserRole).value(); + QVariantMap acct = accounts[id]; + CoreAccountEditDlg dlg(id, acct, existing, this); if(dlg.exec() == QDialog::Accepted) { - if(current != dlg.accountName()) { - if(autoConnectAccount == current) autoConnectAccount = dlg.accountName(); - accounts.remove(current); - current = dlg.accountName(); - ui.accountList->currentItem()->setText(current); - } - accounts[current] = dlg.accountData(); + QVariantMap data = dlg.accountData(); + ui.accountList->currentItem()->setText(data["AccountName"].toString()); + accounts[id] = data; } - //ui.accountList->setCurrent } void CoreConnectDlg::on_deleteAccount_clicked() { - QString current = ui.accountList->currentItem()->text(); + AccountId id = ui.accountList->currentItem()->data(Qt::UserRole).value(); int ret = QMessageBox::question(this, tr("Remove Account Settings"), tr("Do you really want to remove your local settings for this Quassel Core account?
" "Note: This will not remove or change any data on the Core itself!"), QMessageBox::Yes|QMessageBox::No, QMessageBox::No); if(ret == QMessageBox::Yes) { int idx = ui.accountList->currentRow(); - delete ui.accountList->item(idx); - ui.accountList->setCurrentRow(qMin(idx, ui.accountList->count())); - accounts.remove(current); + delete ui.accountList->takeItem(idx); + ui.accountList->setCurrentRow(qMin(idx, ui.accountList->count()-1)); + accounts[id]["Delete"] = true; // we only flag this here, actual deletion happens on accept! + setAccountWidgetStates(); } } @@ -165,13 +191,20 @@ void CoreConnectDlg::on_accountList_itemDoubleClicked(QListWidgetItem *item) { void CoreConnectDlg::on_accountButtonBox_accepted() { // save accounts CoreAccountSettings s; - s.storeAllAccounts(accounts); + foreach(QVariantMap acct, accounts.values()) { + AccountId id = acct["AccountId"].value(); + if(acct.contains("Delete")) { + s.removeAccount(id); + } else { + s.storeAccountData(id, acct); + } + } s.setAutoConnectAccount(autoConnectAccount); ui.stackedWidget->setCurrentWidget(ui.loginPage); - accountName = ui.accountList->currentItem()->text(); - account = s.retrieveAccount(accountName); - s.setLastAccount(accountName); + account = ui.accountList->currentItem()->data(Qt::UserRole).value(); + accountData = accounts[account]; + s.setLastAccount(account); connectToCore(); } @@ -182,8 +215,9 @@ void CoreConnectDlg::on_accountButtonBox_accepted() { /*** Phase One: initializing the core connection ***/ void CoreConnectDlg::connectToCore() { + ui.secureConnection->hide(); ui.connectIcon->setPixmap(QPixmap::fromImage(QImage(":/22x22/actions/network-disconnect"))); - ui.connectLabel->setText(tr("Connect to %1").arg(account["Host"].toString())); + ui.connectLabel->setText(tr("Connect to %1").arg(accountData["Host"].toString())); ui.coreInfoLabel->setText(""); ui.loginStack->setCurrentWidget(ui.loginEmptyPage); ui.loginButtonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok); @@ -192,19 +226,18 @@ void CoreConnectDlg::connectToCore() { disconnect(ui.loginButtonBox, 0, this, 0); connect(ui.loginButtonBox, SIGNAL(rejected()), this, SLOT(restartPhaseNull())); - - //connect(Client::instance(), SIGNAL(coreConnectionPhaseOne(const QVariantMap &)), this, SLOT(phaseOneFinished - clientSyncer->connectToCore(account); + clientSyncer->connectToCore(accountData); } void CoreConnectDlg::initPhaseError(const QString &error) { doingAutoConnect = false; + ui.secureConnection->hide(); ui.connectIcon->setPixmap(QPixmap::fromImage(QImage(":/22x22/status/dialog-error"))); //ui.connectLabel->setBrush(QBrush("red")); - ui.connectLabel->setText(tr("
Connection to %1 failed!
").arg(account["Host"].toString())); + ui.connectLabel->setText(tr("
Connection to %1 failed!
").arg(accountData["Host"].toString())); ui.coreInfoLabel->setText(error); ui.loginButtonBox->setStandardButtons(QDialogButtonBox::Retry|QDialogButtonBox::Cancel); - ui.loginButtonBox->button(QDialogButtonBox::Retry)->setDefault(true); + ui.loginButtonBox->button(QDialogButtonBox::Retry)->setFocus(); disconnect(ui.loginButtonBox, 0, this, 0); connect(ui.loginButtonBox, SIGNAL(accepted()), this, SLOT(restartPhaseNull())); connect(ui.loginButtonBox, SIGNAL(rejected()), this, SLOT(reject())); @@ -214,9 +247,16 @@ void CoreConnectDlg::initPhaseMsg(const QString &msg) { ui.coreInfoLabel->setText(msg); } +void CoreConnectDlg::encrypted(bool useSsl) { + if(useSsl) + ui.secureConnection->show(); + else + ui.secureConnection->hide(); +} + void CoreConnectDlg::initPhaseSocketState(QAbstractSocket::SocketState state) { QString s; - QString host = account["Host"].toString(); + QString host = accountData["Host"].toString(); switch(state) { case QAbstractSocket::UnconnectedState: s = tr("Not connected to %1.").arg(host); break; case QAbstractSocket::HostLookupState: s = tr("Looking up %1...").arg(host); break; @@ -240,15 +280,16 @@ void CoreConnectDlg::restartPhaseNull() { void CoreConnectDlg::startLogin() { ui.connectIcon->setPixmap(QPixmap::fromImage(QImage(":/22x22/actions/network-connect"))); ui.loginStack->setCurrentWidget(ui.loginCredentialsPage); - ui.loginStack->setMinimumSize(ui.loginStack->sizeHint()); ui.loginStack->updateGeometry(); + //ui.loginStack->setMinimumSize(ui.loginStack->sizeHint()); ui.loginStack->updateGeometry(); ui.loginButtonBox->setStandardButtons(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); ui.loginButtonBox->button(QDialogButtonBox::Ok)->setDefault(true); - if(!account["User"].toString().isEmpty()) { - ui.user->setText(account["User"].toString()); - if(account["RememberPasswd"].toBool()) { - ui.password->setText(account["Password"].toString()); + ui.loginButtonBox->button(QDialogButtonBox::Ok)->setFocus(); + if(!accountData["User"].toString().isEmpty()) { + ui.user->setText(accountData["User"].toString()); + if(accountData["RememberPasswd"].toBool()) { + ui.password->setText(accountData["Password"].toString()); ui.rememberPasswd->setChecked(true); - ui.loginButtonBox->setFocus(); + ui.loginButtonBox->button(QDialogButtonBox::Ok)->setFocus(); } else { ui.rememberPasswd->setChecked(false); ui.password->setFocus(); @@ -261,18 +302,33 @@ void CoreConnectDlg::startLogin() { } void CoreConnectDlg::doLogin() { + QVariantMap loginData; + loginData["User"] = ui.user->text(); + loginData["Password"] = ui.password->text(); + loginData["RememberPasswd"] = ui.rememberPasswd->isChecked(); + doLogin(loginData); +} + +void CoreConnectDlg::doLogin(const QVariantMap &loginData) { + disconnect(ui.loginButtonBox, 0, this, 0); + connect(ui.loginButtonBox, SIGNAL(accepted()), this, SLOT(doLogin())); + connect(ui.loginButtonBox, SIGNAL(rejected()), this, SLOT(restartPhaseNull())); + ui.loginStack->setCurrentWidget(ui.loginCredentialsPage); ui.loginGroup->setTitle(tr("Logging in...")); ui.user->setDisabled(true); ui.password->setDisabled(true); ui.rememberPasswd->setDisabled(true); ui.loginButtonBox->button(QDialogButtonBox::Ok)->setDisabled(true); - account["User"] = ui.user->text(); - account["RememberPasswd"] = ui.rememberPasswd->isChecked(); - if(ui.rememberPasswd->isChecked()) account["Password"] = ui.password->text(); - else account.remove("Password"); + accountData["User"] = loginData["User"]; + accountData["RememberPasswd"] = loginData["RememberPasswd"]; + if(loginData["RememberPasswd"].toBool()) accountData["Password"] = loginData["Password"]; + else accountData.remove("Password"); + ui.user->setText(loginData["User"].toString()); + ui.password->setText(loginData["Password"].toString()); + ui.rememberPasswd->setChecked(loginData["RememberPasswd"].toBool()); CoreAccountSettings s; - s.storeAccount(accountName, account); - clientSyncer->loginToCore(account["User"].toString(), account["Password"].toString()); + s.storeAccountData(account, accountData); + clientSyncer->loginToCore(loginData["User"].toString(), loginData["Password"].toString()); } void CoreConnectDlg::setLoginWidgetStates() { @@ -280,6 +336,10 @@ void CoreConnectDlg::setLoginWidgetStates() { } void CoreConnectDlg::loginFailed(const QString &error) { + if(wizard) { + wizard->reject(); + } + ui.loginStack->setCurrentWidget(ui.loginCredentialsPage); ui.loginGroup->setTitle(tr("Login")); ui.user->setEnabled(true); ui.password->setEnabled(true); @@ -290,6 +350,42 @@ void CoreConnectDlg::loginFailed(const QString &error) { doingAutoConnect = false; } +void CoreConnectDlg::startCoreConfig(const QVariantList &backends) { + storageBackends = backends; + ui.loginStack->setCurrentWidget(ui.coreConfigPage); + + //on_launchCoreConfigWizard_clicked(); + +} + +void CoreConnectDlg::on_launchCoreConfigWizard_clicked() { + Q_ASSERT(!wizard); + wizard = new CoreConfigWizard(storageBackends, this); + connect(wizard, SIGNAL(setupCore(const QVariant &)), clientSyncer, SLOT(doCoreSetup(const QVariant &))); + connect(wizard, SIGNAL(loginToCore(const QVariantMap &)), this, SLOT(doLogin(const QVariantMap &))); + connect(clientSyncer, SIGNAL(coreSetupSuccess()), wizard, SLOT(coreSetupSuccess())); + connect(clientSyncer, SIGNAL(coreSetupFailed(const QString &)), wizard, SLOT(coreSetupFailed(const QString &))); + connect(wizard, SIGNAL(accepted()), this, SLOT(configWizardAccepted())); + connect(wizard, SIGNAL(rejected()), this, SLOT(configWizardRejected())); + connect(clientSyncer, SIGNAL(loginSuccess()), wizard, SLOT(loginSuccess())); + connect(clientSyncer, SIGNAL(syncFinished()), wizard, SLOT(syncFinished())); + wizard->show(); +} + +void CoreConnectDlg::configWizardAccepted() { + + wizard->deleteLater(); + wizard = 0; +} + +void CoreConnectDlg::configWizardRejected() { + + wizard->deleteLater(); + wizard = 0; + //exit(1); // FIXME +} + + /************************************************************ * Phase Three: Syncing ************************************************************/ @@ -313,7 +409,6 @@ void CoreConnectDlg::startSync() { ui.loginButtonBox->button(QDialogButtonBox::Ok)->setEnabled(true); } - void CoreConnectDlg::coreSessionProgress(quint32 val, quint32 max) { ui.sessionProgress->setRange(0, max); ui.sessionProgress->setValue(val); @@ -350,44 +445,74 @@ void CoreConnectDlg::coreIrcUsersProgress(quint32 val, quint32 max) { ui.ircUsersProgress->setRange(0, 1); ui.ircUsersProgress->setValue(1); } else { + if(val % 100) return; ui.ircUsersProgress->setFormat("%v/%m"); ui.ircUsersProgress->setRange(0, max); ui.ircUsersProgress->setValue(val); } } +void CoreConnectDlg::syncFinished() { + if(!wizard) accept(); + else { + hide(); + disconnect(wizard, 0, this, 0); + connect(wizard, SIGNAL(finished(int)), this, SLOT(accept())); + } +} + /***************************************************************************************** * CoreAccountEditDlg *****************************************************************************************/ - -CoreAccountEditDlg::CoreAccountEditDlg(const QString &name, const QVariantMap &acct, const QStringList &_existing, QWidget *parent) : QDialog(parent) { +CoreAccountEditDlg::CoreAccountEditDlg(AccountId id, const QVariantMap &acct, const QStringList &_existing, QWidget *parent) + : QDialog(parent) +{ ui.setupUi(this); existing = _existing; - account = acct; - if(!name.isEmpty()) { - existing.removeAll(name); + if(id.isValid()) { + existing.removeAll(acct["AccountName"].toString()); ui.host->setText(acct["Host"].toString()); ui.port->setValue(acct["Port"].toUInt()); ui.useInternal->setChecked(acct["UseInternal"].toBool()); - ui.accountName->setText(name); + ui.accountName->setText(acct["AccountName"].toString()); +#ifndef QT_NO_OPENSSL + ui.useSsl->setChecked(acct["useSsl"].toBool()); +#else + ui.useSsl->setChecked(false); + ui.useSsl->setEnabled(false); +#endif + ui.useProxy->setChecked(acct["useProxy"].toBool()); + ui.proxyHost->setText(acct["proxyHost"].toString()); + ui.proxyPort->setValue(acct["proxyPort"].toUInt()); + ui.proxyType->setCurrentIndex(acct["proxyType"].toInt() == QNetworkProxy::Socks5Proxy ? 0 : 1); + ui.proxyUser->setText(acct["proxyUser"].toString()); + ui.proxyPassword->setText(acct["proxyPassword"].toString()); } else { setWindowTitle(tr("Add Core Account")); +#ifdef QT_NO_OPENSSL + ui.useSsl->setChecked(false); + ui.useSsl->setEnabled(false); +#endif } } -QString CoreAccountEditDlg::accountName() const { - return ui.accountName->text(); -} - QVariantMap CoreAccountEditDlg::accountData() { - account["Host"] = ui.host->text(); + account["AccountName"] = ui.accountName->text().trimmed(); + account["Host"] = ui.host->text().trimmed(); account["Port"] = ui.port->value(); account["UseInternal"] = ui.useInternal->isChecked(); + account["useSsl"] = ui.useSsl->isChecked(); + account["useProxy"] = ui.useProxy->isChecked(); + account["proxyHost"] = ui.proxyHost->text().trimmed(); + account["proxyPort"] = ui.proxyPort->value(); + account["proxyType"] = ui.proxyType->currentIndex() == 0 ? QNetworkProxy::Socks5Proxy : QNetworkProxy::HttpProxy; + account["proxyUser"] = ui.proxyUser->text().trimmed(); + account["proxyPassword"] = ui.proxyPassword->text().trimmed(); return account; } void CoreAccountEditDlg::setWidgetStates() { - bool ok = !accountName().isEmpty() && !existing.contains(accountName()) && (ui.useInternal->isChecked() || !ui.host->text().isEmpty()); + bool ok = !ui.accountName->text().trimmed().isEmpty() && !existing.contains(ui.accountName->text()) && (ui.useInternal->isChecked() || !ui.host->text().isEmpty()); ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(ok); }