X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fsettingspages%2Fidentitiessettingspage.cpp;h=825d83354784e949fdef5b782fbbc3f319ea7681;hp=2817b84b471f312f918068e753c35407001e7fcd;hb=aa49f1a8d52fb95920c7b686ea2c7ae5c1532d87;hpb=21d8d7f0a79eeeb541664aa80ce481fdbfc41f09 diff --git a/src/qtui/settingspages/identitiessettingspage.cpp b/src/qtui/settingspages/identitiessettingspage.cpp index 2817b84b..825d8335 100644 --- a/src/qtui/settingspages/identitiessettingspage.cpp +++ b/src/qtui/settingspages/identitiessettingspage.cpp @@ -18,6 +18,7 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ +#include #include #include "identitiessettingspage.h" @@ -28,7 +29,8 @@ IdentitiesSettingsPage::IdentitiesSettingsPage(QWidget *parent) : SettingsPage(tr("General"), tr("Identities"), parent) { ui.setupUi(this); - setEnabled(false); // need a core connection! + setEnabled(Client::isConnected()); // need a core connection! + setWidgetStates(); 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))); @@ -43,19 +45,40 @@ IdentitiesSettingsPage::IdentitiesSettingsPage(QWidget *parent) 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.detachAwayEnabled, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); + connect(ui.detachAwayReason, SIGNAL(textEdited(const QString &)), this, SLOT(widgetHasChanged())); + connect(ui.detachAwayReasonEnabled, 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())); + connect(ui.nicknameList, SIGNAL(itemSelectionChanged()), this, SLOT(setWidgetStates())); + + // we would need this if we enabled drag and drop in the nicklist... + //connect(ui.nicknameList, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(setWidgetStates())); + //connect(ui.nicknameList->model(), SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(nicklistHasChanged())); + +} + +void IdentitiesSettingsPage::setWidgetStates() { + if(ui.nicknameList->selectedItems().count()) { + ui.renameNick->setEnabled(true); + ui.nickUp->setEnabled(ui.nicknameList->row(ui.nicknameList->selectedItems()[0]) > 0); + ui.nickDown->setEnabled(ui.nicknameList->row(ui.nicknameList->selectedItems()[0]) < ui.nicknameList->count()-1); + } else { + ui.renameNick->setDisabled(true); + ui.nickUp->setDisabled(true); + ui.nickDown->setDisabled(true); + } + ui.deleteNick->setEnabled(ui.nicknameList->count() > 1); + + // FIXME this is until stuff has been implemented + ui.detachAwayEnabled->setEnabled(false); } void IdentitiesSettingsPage::coreConnectionStateChanged(bool state) { @@ -73,16 +96,18 @@ void IdentitiesSettingsPage::save() { 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; 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())) { toUpdate.append(*i); } + ++i; } } SaveIdentitiesDlg dlg(toCreate, toUpdate, deletedIdentities, this); @@ -94,9 +119,10 @@ void IdentitiesSettingsPage::save() { foreach(Identity *id, toCreate) { id->deleteLater(); } - changeState(false); + changedIdentities.clear(); + deletedIdentities.clear(); + setChangedState(false); setEnabled(true); - } void IdentitiesSettingsPage::load() { @@ -111,16 +137,12 @@ void IdentitiesSettingsPage::load() { 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); } bool IdentitiesSettingsPage::testHasChanged() { @@ -128,10 +150,13 @@ 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); + Identity temp(currentId, this); + saveToIdentity(&temp); + temp.setIdentityName(identities[currentId]->identityName()); + if(temp != *Client::identity(currentId)) changedIdentities.append(currentId); + } return changedIdentities.count(); } } @@ -162,17 +187,18 @@ void IdentitiesSettingsPage::clientIdentityCreated(IdentityId id) { } 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()); + Identity *identity = identities[clientIdentity->id()]; + if(identity->identityName() != clientIdentity->identityName()) renameIdentity(identity->id(), clientIdentity->identityName()); + identity->update(*clientIdentity); if(identity->id() == currentId) displayIdentity(identity, true); } @@ -189,25 +215,33 @@ void IdentitiesSettingsPage::insertIdentity(Identity *identity) { identities[id] = identity; if(id == 1) { // default identity is always the first one! - ui.identityList->insertItem(0, identity->identityName(), id); + ui.identityList->insertItem(0, identity->identityName(), id.toInt()); } 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); + ui.identityList->insertItem(j, name, id.toInt()); widgetHasChanged(); return; } } // append - ui.identityList->insertItem(ui.identityList->count(), name, id); + ui.identityList->insertItem(ui.identityList->count(), name, id.toInt()); 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(); widgetHasChanged(); } @@ -220,7 +254,7 @@ void IdentitiesSettingsPage::on_identityList_currentIndexChanged(int index) { 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 + ui.renameIdentity->setEnabled(id != 1); // ...or renamed } } @@ -241,14 +275,13 @@ void IdentitiesSettingsPage::displayIdentity(Identity *id, bool dontsave) { 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.detachAwayEnabled->setChecked(id->detachAwayEnabled()); + ui.detachAwayReason->setText(id->detachAwayReason()); + ui.detachAwayReasonEnabled->setChecked(id->detachAwayReasonEnabled()); ui.ident->setText(id->ident()); ui.kickReason->setText(id->kickReason()); ui.partReason->setText(id->partReason()); @@ -257,7 +290,6 @@ void IdentitiesSettingsPage::displayIdentity(Identity *id, bool dontsave) { } 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++) { @@ -268,14 +300,13 @@ void IdentitiesSettingsPage::saveToIdentity(Identity *id) { 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->setDetachAwayEnabled(ui.detachAwayEnabled->isChecked()); + id->setDetachAwayReason(ui.detachAwayReason->text()); + id->setDetachAwayReasonEnabled(ui.detachAwayReasonEnabled->isChecked()); id->setIdent(ui.ident->text()); id->setKickReason(ui.kickReason->text()); id->setPartReason(ui.partReason->text()); @@ -288,9 +319,9 @@ 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; + id = -id.toInt(); Identity *newId = new Identity(id, this); if(dlg.duplicateId() != 0) { // duplicate @@ -300,7 +331,7 @@ void IdentitiesSettingsPage::on_addIdentity_clicked() { 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,11 +343,76 @@ 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(); + } +} + +void IdentitiesSettingsPage::on_addNick_clicked() { + QStringList existing; + for(int i = 0; i < ui.nicknameList->count(); i++) existing << ui.nicknameList->item(i)->text(); + NickEditDlg dlg(QString(), existing, this); + if(dlg.exec() == QDialog::Accepted) { + ui.nicknameList->addItem(dlg.nick()); + ui.nicknameList->setCurrentRow(ui.nicknameList->count()-1); + setWidgetStates(); + widgetHasChanged(); + } +} + +void IdentitiesSettingsPage::on_deleteNick_clicked() { + // no confirmation, since a nickname is really nothing hard to recreate + if(ui.nicknameList->selectedItems().count()) { + delete ui.nicknameList->takeItem(ui.nicknameList->row(ui.nicknameList->selectedItems()[0])); + ui.nicknameList->setCurrentRow(qMin(ui.nicknameList->currentRow()+1, ui.nicknameList->count()-1)); + setWidgetStates(); + widgetHasChanged(); + } +} + +void IdentitiesSettingsPage::on_renameNick_clicked() { + if(!ui.nicknameList->selectedItems().count()) return; + QString old = ui.nicknameList->selectedItems()[0]->text(); + QStringList existing; + for(int i = 0; i < ui.nicknameList->count(); i++) existing << ui.nicknameList->item(i)->text(); + NickEditDlg dlg(old, existing, this); + if(dlg.exec() == QDialog::Accepted) { + ui.nicknameList->selectedItems()[0]->setText(dlg.nick()); + } + +} + +void IdentitiesSettingsPage::on_nickUp_clicked() { + if(!ui.nicknameList->selectedItems().count()) return; + int row = ui.nicknameList->row(ui.nicknameList->selectedItems()[0]); + if(row > 0) { + ui.nicknameList->insertItem(row-1, ui.nicknameList->takeItem(row)); + ui.nicknameList->setCurrentRow(row-1); + setWidgetStates(); + widgetHasChanged(); + } +} + +void IdentitiesSettingsPage::on_nickDown_clicked() { + if(!ui.nicknameList->selectedItems().count()) return; + int row = ui.nicknameList->row(ui.nicknameList->selectedItems()[0]); + if(row < ui.nicknameList->count()-1) { + ui.nicknameList->insertItem(row+1, ui.nicknameList->takeItem(row)); + ui.nicknameList->setCurrentRow(row+1); + setWidgetStates(); + widgetHasChanged(); + } } /*****************************************************************************************/ @@ -347,8 +443,8 @@ 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) { //, toCreate(tocreate), toUpdate(toupdate), toRemove(toremove) { ui.setupUi(this); numevents = toCreate.count() + toUpdate.count() + toRemove.count(); rcvevents = 0; @@ -370,7 +466,7 @@ SaveIdentitiesDlg::SaveIdentitiesDlg(QList tocreate, QListid(), id->toVariantMap()); } foreach(IdentityId id, toRemove) { Client::removeIdentity(id); @@ -385,3 +481,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)); +} + + +