X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fsettingspages%2Fidentitiessettingspage.cpp;h=1a2bfc1b5d9ab923dffacf6ac14609d6279c64eb;hp=2817b84b471f312f918068e753c35407001e7fcd;hb=c5cbe5eb77fce2ab954a98399a1450803108217b;hpb=21d8d7f0a79eeeb541664aa80ce481fdbfc41f09 diff --git a/src/qtui/settingspages/identitiessettingspage.cpp b/src/qtui/settingspages/identitiessettingspage.cpp index 2817b84b..1a2bfc1b 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" @@ -29,6 +30,7 @@ IdentitiesSettingsPage::IdentitiesSettingsPage(QWidget *parent) ui.setupUi(this); setEnabled(false); // 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))); @@ -56,6 +58,26 @@ IdentitiesSettingsPage::IdentitiesSettingsPage(QWidget *parent) 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); + } void IdentitiesSettingsPage::coreConnectionStateChanged(bool state) { @@ -73,16 +95,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 +118,10 @@ void IdentitiesSettingsPage::save() { foreach(Identity *id, toCreate) { id->deleteLater(); } + changedIdentities.clear(); + deletedIdentities.clear(); changeState(false); setEnabled(true); - } void IdentitiesSettingsPage::load() { @@ -114,10 +139,6 @@ void IdentitiesSettingsPage::load() { changeState(false); } -void IdentitiesSettingsPage::defaults() { - // TODO implement bool hasDefaults() -} - void IdentitiesSettingsPage::widgetHasChanged() { bool changed = testHasChanged(); if(changed != hasChanged()) changeState(changed); @@ -128,10 +149,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 +186,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 +214,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 +253,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 } } @@ -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++) { @@ -288,9 +320,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 +332,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 +344,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(); + NickEditDlgNew 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->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(); + NickEditDlgNew 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(); + } } /*****************************************************************************************/ @@ -385,3 +482,34 @@ void SaveIdentitiesDlg::clientEvent() { ui.progressBar->setValue(++rcvevents); if(rcvevents >= numevents) accept(); } + +/*************************************************************************************************/ + +NickEditDlgNew::NickEditDlgNew(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 NickEditDlgNew::nick() const { + return ui.nickEdit->text(); + +} + +void NickEditDlgNew::on_nickEdit_textChanged(const QString &text) { + ui.buttonBox->button(QDialogButtonBox::Ok)->setDisabled(text.isEmpty() || existing.contains(text)); +} + + +