X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fsettingspages%2Fidentitiessettingspage.cpp;h=47463f6dc6a46ff5e1a5526cf02e65ef23f80a58;hp=2817b84b471f312f918068e753c35407001e7fcd;hb=8e56bbef20a6d13a05fa20ba85ff54e4a5817ee1;hpb=21d8d7f0a79eeeb541664aa80ce481fdbfc41f09 diff --git a/src/qtui/settingspages/identitiessettingspage.cpp b/src/qtui/settingspages/identitiessettingspage.cpp index 2817b84b..47463f6d 100644 --- a/src/qtui/settingspages/identitiessettingspage.cpp +++ b/src/qtui/settingspages/identitiessettingspage.cpp @@ -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 * @@ -18,49 +18,54 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#include - #include "identitiessettingspage.h" +#include +#include + #include "client.h" +#include "iconloader.h" +#include "signalproxy.h" IdentitiesSettingsPage::IdentitiesSettingsPage(QWidget *parent) - : SettingsPage(tr("General"), tr("Identities"), parent) { - + : SettingsPage(tr("Misc"), tr("Identities"), parent), + _editSsl(false) +{ ui.setupUi(this); - setEnabled(false); // need a core connection! + ui.renameIdentity->setIcon(BarIcon("edit-rename")); + ui.addIdentity->setIcon(BarIcon("list-add-user")); + ui.deleteIdentity->setIcon(BarIcon("list-remove-user")); + + coreConnectionStateChanged(Client::isConnected()); // need a core connection! connect(Client::instance(), SIGNAL(coreConnectionStateChanged(bool)), this, SLOT(coreConnectionStateChanged(bool))); + connect(Client::instance(), SIGNAL(identityCreated(IdentityId)), this, SLOT(clientIdentityCreated(IdentityId))); connect(Client::instance(), SIGNAL(identityRemoved(IdentityId)), this, SLOT(clientIdentityRemoved(IdentityId))); + connect(ui.identityEditor, SIGNAL(widgetHasChanged()), this, SLOT(widgetHasChanged())); +#ifdef HAVE_SSL + connect(ui.identityEditor, SIGNAL(requestEditSsl()), this, SLOT(continueUnsecured())); +#endif + currentId = 0; - // We need to know whenever the state of input widgets changes... //connect(ui.identityList, SIGNAL(editTextChanged(const QString &)), this, SLOT(widgetHasChanged())); - connect(ui.realName, SIGNAL(textEdited(const QString &)), this, SLOT(widgetHasChanged())); - connect(ui.nicknameList, SIGNAL(itemChanged(QListWidgetItem *)), this, SLOT(widgetHasChanged())); - connect(ui.awayNick, SIGNAL(textEdited(const QString &)), this, SLOT(widgetHasChanged())); - connect(ui.awayNickEnabled, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); - connect(ui.awayReason, SIGNAL(textEdited(const QString &)), this, SLOT(widgetHasChanged())); - connect(ui.awayReasonEnabled, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); - connect(ui.returnMessage, SIGNAL(textEdited(const QString &)), this, SLOT(widgetHasChanged())); - connect(ui.returnMessageEnabled, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); - connect(ui.autoAwayEnabled, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); - connect(ui.autoAwayTime, SIGNAL(valueChanged(int)), this, SLOT(widgetHasChanged())); - connect(ui.autoAwayReason, SIGNAL(textEdited(const QString &)), this, SLOT(widgetHasChanged())); - connect(ui.autoAwayReasonEnabled, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); - connect(ui.autoReturnMessage, SIGNAL(textEdited(const QString &)), this, SLOT(widgetHasChanged())); - connect(ui.autoReturnMessageEnabled, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); - connect(ui.ident, SIGNAL(textEdited(const QString &)), this, SLOT(widgetHasChanged())); - connect(ui.kickReason, SIGNAL(textEdited(const QString &)), this, SLOT(widgetHasChanged())); - connect(ui.partReason, SIGNAL(textEdited(const QString &)), this, SLOT(widgetHasChanged())); - connect(ui.quitReason, SIGNAL(textEdited(const QString &)), this, SLOT(widgetHasChanged())); - } -void IdentitiesSettingsPage::coreConnectionStateChanged(bool state) { - this->setEnabled(state); - if(state) { +void IdentitiesSettingsPage::coreConnectionStateChanged(bool connected) { + setEnabled(connected); + if(connected) { +#ifdef HAVE_SSL + if(Client::signalProxy()->isSecure()) { + ui.identityEditor->setSslState(IdentityEditWidget::AllowSsl); + _editSsl = true; + } else { + ui.identityEditor->setSslState(IdentityEditWidget::UnsecureSsl); + _editSsl = false; + } +#else + ui.identityEditor->setSslState(IdentityEditWidget::NoSsl); +#endif load(); } else { // reset @@ -68,21 +73,36 @@ void IdentitiesSettingsPage::coreConnectionStateChanged(bool state) { } } +#ifdef HAVE_SSL +void IdentitiesSettingsPage::continueUnsecured() { + _editSsl = true; + + QHash::iterator idIter; + for(idIter = identities.begin(); idIter != identities.end(); idIter++) { + idIter.value()->enableEditSsl(); + } + + ui.identityEditor->setSslState(IdentityEditWidget::AllowSsl); +} +#endif + void IdentitiesSettingsPage::save() { setEnabled(false); - QList toCreate, toUpdate; + QList toCreate, toUpdate; // we need to remove our temporarily created identities. // these are going to be re-added after the core has propagated them back... - for(QHash::iterator i = identities.begin(); i != identities.end(); ++i) { + QHash::iterator i = identities.begin(); + while(i != identities.end()) { if((*i)->id() < 0) { - Identity *temp = *i; + CertIdentity *temp = *i; i = identities.erase(i); toCreate.append(temp); - ui.identityList->removeItem(ui.identityList->findData(temp->id())); + ui.identityList->removeItem(ui.identityList->findData(temp->id().toInt())); } else { - if(**i != *Client::identity((*i)->id())) { + if(**i != *Client::identity((*i)->id()) || (*i)->isDirty()) { toUpdate.append(*i); } + ++i; } } SaveIdentitiesDlg dlg(toCreate, toUpdate, deletedIdentities, this); @@ -94,9 +114,10 @@ void IdentitiesSettingsPage::save() { foreach(Identity *id, toCreate) { id->deleteLater(); } - changeState(false); + changedIdentities.clear(); + deletedIdentities.clear(); + setChangedState(false); setEnabled(true); - } void IdentitiesSettingsPage::load() { @@ -108,19 +129,23 @@ void IdentitiesSettingsPage::load() { deletedIdentities.clear(); changedIdentities.clear(); ui.identityList->clear(); + setWidgetStates(); foreach(IdentityId id, Client::identityIds()) { clientIdentityCreated(id); } - changeState(false); -} - -void IdentitiesSettingsPage::defaults() { - // TODO implement bool hasDefaults() + setChangedState(false); } void IdentitiesSettingsPage::widgetHasChanged() { bool changed = testHasChanged(); - if(changed != hasChanged()) changeState(changed); + if(changed != hasChanged()) setChangedState(changed); +} + +void IdentitiesSettingsPage::setWidgetStates() { + bool enabled = (ui.identityList->count() > 0); + ui.identityEditor->setEnabled(enabled); + ui.renameIdentity->setEnabled(enabled); + ui.deleteIdentity->setEnabled(ui.identityList->count() > 1); } bool IdentitiesSettingsPage::testHasChanged() { @@ -128,16 +153,20 @@ bool IdentitiesSettingsPage::testHasChanged() { if(currentId < 0) { return true; // new identity } else { - changedIdentities.removeAll(currentId); - Identity temp(currentId, this); - saveToIdentity(&temp); - if(temp != *identities[currentId]) changedIdentities.append(currentId); + if(currentId != 0) { + changedIdentities.removeAll(currentId); + CertIdentity temp(currentId, this); + ui.identityEditor->saveToIdentity(&temp); + temp.setIdentityName(identities[currentId]->identityName()); + if(temp != *Client::identity(currentId) || temp.isDirty()) + changedIdentities.append(currentId); + } return changedIdentities.count(); } } bool IdentitiesSettingsPage::aboutToSave() { - saveToIdentity(identities[currentId]); + ui.identityEditor->saveToIdentity(identities[currentId]); QList errors; foreach(Identity *id, identities.values()) { if(id->identityName().isEmpty()) errors.append(1); @@ -157,23 +186,37 @@ bool IdentitiesSettingsPage::aboutToSave() { } void IdentitiesSettingsPage::clientIdentityCreated(IdentityId id) { - insertIdentity(new Identity(*Client::identity(id), this)); + CertIdentity *identity = new CertIdentity(*Client::identity(id), this); +#ifdef HAVE_SSL + identity->enableEditSsl(_editSsl); +#endif + insertIdentity(identity); +#ifdef HAVE_SSL + connect(identity, SIGNAL(sslSettingsUpdated()), this, SLOT(clientIdentityUpdated())); +#endif connect(Client::identity(id), SIGNAL(updatedRemotely()), this, SLOT(clientIdentityUpdated())); } void IdentitiesSettingsPage::clientIdentityUpdated() { - Identity *identity = qobject_cast(sender()); - if(!identity) { + const Identity *clientIdentity = qobject_cast(sender()); + if(!clientIdentity) { qWarning() << "Invalid identity to update!"; return; } - if(!identities.contains(identity->id())) { - qWarning() << "Unknown identity to update:" << identity->identityName(); + if(!identities.contains(clientIdentity->id())) { + qWarning() << "Unknown identity to update:" << clientIdentity->identityName(); return; } - identities[identity->id()]->update(*identity); - ui.identityList->setItemText(ui.identityList->findData(identity->id()), identity->identityName()); - if(identity->id() == currentId) displayIdentity(identity, true); + + CertIdentity *identity = identities[clientIdentity->id()]; + + if(identity->identityName() != clientIdentity->identityName()) + renameIdentity(identity->id(), clientIdentity->identityName()); + + identity->copyFrom(*clientIdentity); + + if(identity->id() == currentId) + ui.identityEditor->displayIdentity(identity); } void IdentitiesSettingsPage::clientIdentityRemoved(IdentityId id) { @@ -184,102 +227,56 @@ void IdentitiesSettingsPage::clientIdentityRemoved(IdentityId id) { } } -void IdentitiesSettingsPage::insertIdentity(Identity *identity) { +void IdentitiesSettingsPage::insertIdentity(CertIdentity *identity) { IdentityId id = identity->id(); identities[id] = identity; - if(id == 1) { - // default identity is always the first one! - ui.identityList->insertItem(0, identity->identityName(), id); - } else { - QString name = identity->identityName(); - for(int j = 0; j < ui.identityList->count(); j++) { - if((j>0 || ui.identityList->itemData(0).toInt() != 1) && name.localeAwareCompare(ui.identityList->itemText(j)) < 0) { - ui.identityList->insertItem(j, name, id); - widgetHasChanged(); - return; - } + + QString name = identity->identityName(); + for(int j = 0; j < ui.identityList->count(); j++) { + if((j>0 || ui.identityList->itemData(0).toInt() != 1) && name.localeAwareCompare(ui.identityList->itemText(j)) < 0) { + ui.identityList->insertItem(j, name, id.toInt()); + widgetHasChanged(); + return; } - // append - ui.identityList->insertItem(ui.identityList->count(), name, id); - widgetHasChanged(); } + // append + ui.identityList->insertItem(ui.identityList->count(), name, id.toInt()); + setWidgetStates(); + widgetHasChanged(); +} + +void IdentitiesSettingsPage::renameIdentity(IdentityId id, const QString &newName) { + Identity *identity = identities[id]; + ui.identityList->setItemText(ui.identityList->findData(identity->id().toInt()), newName); + identity->setIdentityName(newName); } void IdentitiesSettingsPage::removeIdentity(Identity *id) { - ui.identityList->removeItem(ui.identityList->findData(id->id())); identities.remove(id->id()); + ui.identityList->removeItem(ui.identityList->findData(id->id().toInt())); + changedIdentities.removeAll(id->id()); + if(currentId == id->id()) currentId = 0; id->deleteLater(); + setWidgetStates(); widgetHasChanged(); } void IdentitiesSettingsPage::on_identityList_currentIndexChanged(int index) { + CertIdentity *previousIdentity = 0; + if(currentId != 0 && identities.contains(currentId)) + previousIdentity = identities[currentId]; + if(index < 0) { //ui.identityList->setEditable(false); - displayIdentity(0); + ui.identityEditor->displayIdentity(0, previousIdentity); + currentId = 0; } else { IdentityId id = ui.identityList->itemData(index).toInt(); - if(identities.contains(id)) displayIdentity(identities[id]); - ui.deleteIdentity->setEnabled(id != 1); // default identity cannot be deleted - //ui.identityList->setEditable(id != 1); // ...or renamed - } -} - -void IdentitiesSettingsPage::displayIdentity(Identity *id, bool dontsave) { - if(currentId != 0 && !dontsave && identities.contains(currentId)) { - saveToIdentity(identities[currentId]); - } - if(id) { - currentId = id->id(); - ui.realName->setText(id->realName()); - ui.nicknameList->clear(); - ui.nicknameList->addItems(id->nicks()); - //for(int i = 0; i < ui.nicknameList->count(); i++) { - // ui.nicknameList->item(i)->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEditable|Qt::ItemIsEnabled); - //} - if(ui.nicknameList->count()) ui.nicknameList->setCurrentRow(0); - ui.awayNick->setText(id->awayNick()); - ui.awayNickEnabled->setChecked(id->awayNickEnabled()); - ui.awayReason->setText(id->awayReason()); - ui.awayReasonEnabled->setChecked(id->awayReasonEnabled()); - ui.returnMessage->setText(id->returnMessage()); - ui.returnMessageEnabled->setChecked(id->returnMessageEnabled()); - ui.autoAwayEnabled->setChecked(id->autoAwayEnabled()); - ui.autoAwayTime->setValue(id->autoAwayTime()); - ui.autoAwayReason->setText(id->autoAwayReason()); - ui.autoAwayReasonEnabled->setChecked(id->autoAwayReasonEnabled()); - ui.autoReturnMessage->setText(id->autoReturnMessage()); - ui.autoReturnMessageEnabled->setChecked(id->autoReturnMessageEnabled()); - ui.ident->setText(id->ident()); - ui.kickReason->setText(id->kickReason()); - ui.partReason->setText(id->partReason()); - ui.quitReason->setText(id->quitReason()); - } -} - -void IdentitiesSettingsPage::saveToIdentity(Identity *id) { - id->setIdentityName(ui.identityList->currentText()); - id->setRealName(ui.realName->text()); - QStringList nicks; - for(int i = 0; i < ui.nicknameList->count(); i++) { - nicks << ui.nicknameList->item(i)->text(); + if(identities.contains(id)) { + ui.identityEditor->displayIdentity(identities[id], previousIdentity); + currentId = id; + } } - id->setNicks(nicks); - id->setAwayNick(ui.awayNick->text()); - id->setAwayNickEnabled(ui.awayNickEnabled->isChecked()); - id->setAwayReason(ui.awayReason->text()); - id->setAwayReasonEnabled(ui.awayReasonEnabled->isChecked()); - id->setReturnMessage(ui.returnMessage->text()); - id->setReturnMessageEnabled(ui.returnMessageEnabled->isChecked()); - id->setAutoAwayEnabled(ui.autoAwayEnabled->isChecked()); - id->setAutoAwayTime(ui.autoAwayTime->value()); - id->setAutoAwayReason(ui.autoAwayReason->text()); - id->setAutoAwayReasonEnabled(ui.autoAwayReasonEnabled->isChecked()); - id->setAutoReturnMessage(ui.autoReturnMessage->text()); - id->setAutoReturnMessageEnabled(ui.autoReturnMessageEnabled->isChecked()); - id->setIdent(ui.ident->text()); - id->setKickReason(ui.kickReason->text()); - id->setPartReason(ui.partReason->text()); - id->setQuitReason(ui.quitReason->text()); } void IdentitiesSettingsPage::on_addIdentity_clicked() { @@ -288,19 +285,22 @@ void IdentitiesSettingsPage::on_addIdentity_clicked() { // find a free (negative) ID IdentityId id; for(id = 1; id <= identities.count(); id++) { - if(!identities.keys().contains(-id)) break; + if(!identities.keys().contains(-id.toInt())) break; } - id *= -1; - Identity *newId = new Identity(id, this); + id = -id.toInt(); + CertIdentity *newId = new CertIdentity(id, this); +#ifdef HAVE_SSL + newId->enableEditSsl(_editSsl); +#endif if(dlg.duplicateId() != 0) { // duplicate - newId->update(*identities[dlg.duplicateId()]); + newId->copyFrom(*identities[dlg.duplicateId()]); newId->setId(id); } newId->setIdentityName(dlg.identityName()); identities[id] = newId; insertIdentity(newId); - ui.identityList->setCurrentIndex(ui.identityList->findData(id)); + ui.identityList->setCurrentIndex(ui.identityList->findData(id.toInt())); widgetHasChanged(); } } @@ -312,16 +312,27 @@ void IdentitiesSettingsPage::on_deleteIdentity_clicked() { QMessageBox::Yes|QMessageBox::No, QMessageBox::No); if(ret != QMessageBox::Yes) return; if(id->id() > 0) deletedIdentities.append(id->id()); + currentId = 0; removeIdentity(id); } -void IdentitiesSettingsPage::on_identityList_editTextChanged(const QString &text) { - ui.identityList->setItemText(ui.identityList->currentIndex(), text); +void IdentitiesSettingsPage::on_renameIdentity_clicked() { + QString oldName = identities[currentId]->identityName(); + bool ok = false; + QString name = QInputDialog::getText(this, tr("Rename Identity"), + tr("Please enter a new name for the identity \"%1\"!").arg(oldName), + QLineEdit::Normal, oldName, &ok); + if(ok && !name.isEmpty()) { + renameIdentity(currentId, name); + widgetHasChanged(); + } } /*****************************************************************************************/ -CreateIdentityDlg::CreateIdentityDlg(QAbstractItemModel *model, QWidget *parent) : QDialog(parent) { +CreateIdentityDlg::CreateIdentityDlg(QAbstractItemModel *model, QWidget *parent) + : QDialog(parent) +{ ui.setupUi(this); ui.identityList->setModel(model); // now we use the identity list of the main page... Trolltech <3 @@ -347,9 +358,12 @@ void CreateIdentityDlg::on_identityName_textChanged(const QString &text) { /*********************************************************************************************/ -SaveIdentitiesDlg::SaveIdentitiesDlg(QList tocreate, QList toupdate, QList toremove, QWidget *parent) - : QDialog(parent), toCreate(tocreate), toUpdate(toupdate), toRemove(toremove) { +SaveIdentitiesDlg::SaveIdentitiesDlg(const QList &toCreate, const QList &toUpdate, const QList &toRemove, QWidget *parent) + : QDialog(parent) +{ ui.setupUi(this); + ui.abort->setIcon(SmallIcon("dialog-cancel")); + numevents = toCreate.count() + toUpdate.count() + toRemove.count(); rcvevents = 0; if(numevents) { @@ -359,10 +373,10 @@ SaveIdentitiesDlg::SaveIdentitiesDlg(QList tocreate, QListid()); if(!cid) { qWarning() << "Invalid client identity!"; @@ -370,7 +384,10 @@ SaveIdentitiesDlg::SaveIdentitiesDlg(QList tocreate, QListid(), id->toVariantMap()); +#ifdef HAVE_SSL + id->requestUpdateSslSettings(); +#endif } foreach(IdentityId id, toRemove) { Client::removeIdentity(id); @@ -385,3 +402,34 @@ void SaveIdentitiesDlg::clientEvent() { ui.progressBar->setValue(++rcvevents); if(rcvevents >= numevents) accept(); } + +/*************************************************************************************************/ + +NickEditDlg::NickEditDlg(const QString &old, const QStringList &exist, QWidget *parent) + : QDialog(parent), oldNick(old), existing(exist) { + ui.setupUi(this); + + // define a regexp for valid nicknames + // TODO: add max nicklength according to ISUPPORT + QString letter = "A-Za-z"; + QString special = "\x5b-\x60\x7b-\x7d"; + QRegExp rx(QString("[%1%2][%1%2\\d-]*").arg(letter, special)); + ui.nickEdit->setValidator(new QRegExpValidator(rx, ui.nickEdit)); + if(old.isEmpty()) { + // new nick + setWindowTitle(tr("Add Nickname")); + on_nickEdit_textChanged(""); // disable ok button + } else ui.nickEdit->setText(old); +} + +QString NickEditDlg::nick() const { + return ui.nickEdit->text(); + +} + +void NickEditDlg::on_nickEdit_textChanged(const QString &text) { + ui.buttonBox->button(QDialogButtonBox::Ok)->setDisabled(text.isEmpty() || existing.contains(text)); +} + + +