diff --git a/core/account.cpp b/core/account.cpp index a46ea8f..bacbb6d 100644 --- a/core/account.cpp +++ b/core/account.cpp @@ -1200,3 +1200,14 @@ void Core::Account::removeContactFromGroupRequest(const QString& jid, const QStr } } } + +void Core::Account::renameContactRequest(const QString& jid, const QString& newName) +{ + std::map::const_iterator itr = contacts.find(jid); + if (itr == contacts.end()) { + qDebug() << "An attempt to rename non existing contact" << jid << "of account" << name << ", skipping"; + } else { + QXmppRosterManager& rm = client.rosterManager(); + rm.renameItem(jid, newName); + } +} diff --git a/core/account.h b/core/account.h index 839af23..21f35d3 100644 --- a/core/account.h +++ b/core/account.h @@ -72,6 +72,7 @@ public: void addContactRequest(const QString& jid, const QString& name, const QSet& groups); void addContactToGroupRequest(const QString& jid, const QString& groupName); void removeContactFromGroupRequest(const QString& jid, const QString& groupName); + void renameContactRequest(const QString& jid, const QString& newName); void setRoomJoined(const QString& jid, bool joined); void setRoomAutoJoin(const QString& jid, bool joined); diff --git a/core/squawk.cpp b/core/squawk.cpp index 181a991..e624a8b 100644 --- a/core/squawk.cpp +++ b/core/squawk.cpp @@ -101,8 +101,12 @@ void Core::Squawk::newAccountRequest(const QMap& map) void Core::Squawk::addAccount(const QString& login, const QString& server, const QString& password, const QString& name, const QString& resource) { + QSettings settings; + unsigned int reconnects = settings.value("reconnects", 2).toUInt(); + Account* acc = new Account(login, server, password, name); acc->setResource(resource); + acc->setReconnectTimes(reconnects); accounts.push_back(acc); amap.insert(std::make_pair(name, acc)); @@ -518,3 +522,13 @@ void Core::Squawk::removeContactFromGroupRequest(const QString& account, const Q } itr->second->removeContactFromGroupRequest(jid, groupName); } + +void Core::Squawk::renameContactRequest(const QString& account, const QString& jid, const QString& newName) +{ + AccountsMap::const_iterator itr = amap.find(account); + if (itr == amap.end()) { + qDebug() << "An attempt to rename contact" << jid << "of existing account" << account << ", skipping"; + return; + } + itr->second->renameContactRequest(jid, newName); +} diff --git a/core/squawk.h b/core/squawk.h index 1e4980b..d6b5d2a 100644 --- a/core/squawk.h +++ b/core/squawk.h @@ -82,6 +82,7 @@ public slots: void addContactToGroupRequest(const QString& account, const QString& jid, const QString& groupName); void removeContactFromGroupRequest(const QString& account, const QString& jid, const QString& groupName); void removeContactRequest(const QString& account, const QString& jid); + void renameContactRequest(const QString& account, const QString& jid, const QString& newName); void addContactRequest(const QString& account, const QString& jid, const QString& name, const QSet& groups); void setRoomJoined(const QString& account, const QString& jid, bool joined); void setRoomAutoJoin(const QString& account, const QString& jid, bool joined); diff --git a/main.cpp b/main.cpp index 8d612a5..cbe8067 100644 --- a/main.cpp +++ b/main.cpp @@ -91,6 +91,7 @@ int main(int argc, char *argv[]) QObject::connect(&w, SIGNAL(downloadFileRequest(const QString&, const QString&)), squawk, SLOT(downloadFileRequest(const QString&, const QString&))); QObject::connect(&w, &Squawk::addContactToGroupRequest, squawk, &Core::Squawk::addContactToGroupRequest); QObject::connect(&w, &Squawk::removeContactFromGroupRequest, squawk, &Core::Squawk::removeContactFromGroupRequest); + QObject::connect(&w, &Squawk::renameContactRequest, squawk, &Core::Squawk::renameContactRequest); QObject::connect(squawk, SIGNAL(newAccount(const QMap&)), &w, SLOT(newAccount(const QMap&))); QObject::connect(squawk, SIGNAL(addContact(const QString&, const QString&, const QString&, const QMap&)), diff --git a/ui/squawk.cpp b/ui/squawk.cpp index b05caa7..5c095e6 100644 --- a/ui/squawk.cpp +++ b/ui/squawk.cpp @@ -578,10 +578,31 @@ void Squawk::onRosterContextMenu(const QPoint& point) }); } } - - QMenu* groupsMenu = contextMenu->addMenu(Shared::icon("group"), "Groups"); QString accName = cnt->getAccountName(); QString cntJID = cnt->getJid(); + QString cntName = cnt->getName(); + + QAction* rename = contextMenu->addAction(Shared::icon("edit-rename"), "Rename"); + rename->setEnabled(active); + connect(rename, &QAction::triggered, [this, cntName, accName, cntJID]() { + QInputDialog* dialog = new QInputDialog(this); + connect(dialog, &QDialog::accepted, [this, dialog, cntName, accName, cntJID]() { + QString newName = dialog->textValue(); + if (newName != cntName) { + emit renameContactRequest(accName, cntJID, newName); + } + dialog->deleteLater(); + }); + connect(dialog, &QDialog::rejected, dialog, &QObject::deleteLater); + dialog->setInputMode(QInputDialog::TextInput); + dialog->setLabelText("Input new name for " + cntJID + " \nor leave it empty for the contact \nto be displayed as " + cntJID); + dialog->setWindowTitle("Renaming " + cntJID); + dialog->setTextValue(cntName); + dialog->exec(); + }); + + + QMenu* groupsMenu = contextMenu->addMenu(Shared::icon("group"), "Groups"); std::deque groupList = rosterModel.groupList(accName); for (QString groupName : groupList) { QAction* gr = groupsMenu->addAction(groupName); diff --git a/ui/squawk.h b/ui/squawk.h index 1991646..c4d7f6f 100644 --- a/ui/squawk.h +++ b/ui/squawk.h @@ -64,6 +64,7 @@ signals: void addContactRequest(const QString& account, const QString& jid, const QString& name, const QSet& groups); void addContactToGroupRequest(const QString& account, const QString& jid, const QString& groupName); void removeContactFromGroupRequest(const QString& account, const QString& jid, const QString& groupName); + void renameContactRequest(const QString& account, const QString& jid, const QString& newName); void setRoomJoined(const QString& account, const QString& jid, bool joined); void setRoomAutoJoin(const QString& account, const QString& jid, bool joined); void addRoomRequest(const QString& account, const QString& jid, const QString& nick, const QString& password, bool autoJoin);