* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
+#include <QInputDialog>
#include <QMessageBox>
#include "identitiessettingspage.h"
#include "client.h"
+#include "iconloader.h"
IdentitiesSettingsPage::IdentitiesSettingsPage(QWidget *parent)
: SettingsPage(tr("General"), tr("Identities"), parent) {
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"));
+ ui.addNick->setIcon(SmallIcon("list-add"));
+ ui.deleteNick->setIcon(SmallIcon("edit-delete"));
+ ui.renameNick->setIcon(SmallIcon("edit-rename"));
+ ui.nickUp->setIcon(SmallIcon("go-up"));
+ ui.nickDown->setIcon(SmallIcon("go-down"));
+
+ 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)));
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);
}
void IdentitiesSettingsPage::coreConnectionStateChanged(bool state) {
QList<Identity *> 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<IdentityId, Identity *>::iterator i = identities.begin(); i != identities.end(); ++i) {
+ QHash<IdentityId, Identity *>::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);
foreach(Identity *id, toCreate) {
id->deleteLater();
}
- changeState(false);
+ changedIdentities.clear();
+ deletedIdentities.clear();
+ setChangedState(false);
setEnabled(true);
-
}
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() {
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();
}
}
}
void IdentitiesSettingsPage::clientIdentityUpdated() {
- Identity *identity = qobject_cast<Identity *>(sender());
- if(!identity) {
+ const Identity *clientIdentity = qobject_cast<Identity *>(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);
}
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();
}
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
}
}
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());
}
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++) {
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());
// 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
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();
}
}
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();
+ }
}
/*****************************************************************************************/
/*********************************************************************************************/
-SaveIdentitiesDlg::SaveIdentitiesDlg(QList<Identity *> tocreate, QList<Identity *> toupdate, QList<IdentityId> toremove, QWidget *parent)
- : QDialog(parent), toCreate(tocreate), toUpdate(toupdate), toRemove(toremove) {
+SaveIdentitiesDlg::SaveIdentitiesDlg(const QList<Identity *> &toCreate, const QList<Identity *> &toUpdate, const QList<IdentityId> &toRemove, QWidget *parent)
+ : QDialog(parent) { //, toCreate(tocreate), toUpdate(toupdate), toRemove(toremove) {
ui.setupUi(this);
+ ui.abort->setIcon(SmallIcon("dialog-cancel"));
+
numevents = toCreate.count() + toUpdate.count() + toRemove.count();
rcvevents = 0;
if(numevents) {
continue;
}
connect(cid, SIGNAL(updatedRemotely()), this, SLOT(clientEvent()));
- Client::updateIdentity(*id);
+ Client::updateIdentity(id->id(), id->toVariantMap());
}
foreach(IdentityId id, toRemove) {
Client::removeIdentity(id);
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));
+}
+
+
+