diff --git a/core/account.cpp b/core/account.cpp index a6b0bde..f3e4156 100644 --- a/core/account.cpp +++ b/core/account.cpp @@ -1353,18 +1353,28 @@ void Core::Account::onVCardReceived(const QXmppVCardIq& card) if (ava.size() > 0) { item->setAvatar(ava); } else { - item->setAutoGeneratedAvatar(); + if (!item->hasAvatar() || !item->isAvatarAutoGenerated()) { + item->setAutoGeneratedAvatar(); + } } Shared::VCard vCard; + vCard.setFullName(card.fullName()); vCard.setFirstName(card.firstName()); vCard.setMiddleName(card.middleName()); vCard.setLastName(card.lastName()); vCard.setBirthday(card.birthday()); vCard.setNickName(card.nickName()); vCard.setDescription(card.description()); + vCard.setUrl(card.url()); + QXmppVCardOrganization org = card.organization(); + vCard.setOrgName(org.organization()); + vCard.setOrgRole(org.role()); + vCard.setOrgUnit(org.unit()); + vCard.setOrgTitle(org.title()); + if (item->hasAvatar()) { - if (item->isAvatarAutoGenerated()) { + if (!item->isAvatarAutoGenerated()) { vCard.setAvatarType(Shared::Avatar::valid); } else { vCard.setAvatarType(Shared::Avatar::autocreated); @@ -1465,12 +1475,19 @@ void Core::Account::onOwnVCardReceived(const QXmppVCardIq& card) ownVCardRequestInProgress = false; Shared::VCard vCard; + vCard.setFullName(card.fullName()); vCard.setFirstName(card.firstName()); vCard.setMiddleName(card.middleName()); vCard.setLastName(card.lastName()); vCard.setBirthday(card.birthday()); vCard.setNickName(card.nickName()); vCard.setDescription(card.description()); + vCard.setUrl(card.url()); + QXmppVCardOrganization org = card.organization(); + vCard.setOrgName(org.organization()); + vCard.setOrgRole(org.role()); + vCard.setOrgUnit(org.unit()); + vCard.setOrgTitle(org.title()); if (avatarType.size() > 0) { vCard.setAvatarType(Shared::Avatar::valid); vCard.setAvatarPath(path + "avatar." + avatarType); @@ -1515,12 +1532,20 @@ void Core::Account::requestVCard(const QString& jid) void Core::Account::uploadVCard(const Shared::VCard& card) { QXmppVCardIq iq; + iq.setFullName(card.getFullName()); iq.setFirstName(card.getFirstName()); iq.setMiddleName(card.getMiddleName()); iq.setLastName(card.getLastName()); iq.setNickName(card.getNickName()); iq.setBirthday(card.getBirthday()); iq.setDescription(card.getDescription()); + iq.setUrl(card.getUrl()); + QXmppVCardOrganization org; + org.setOrganization(card.getOrgName()); + org.setUnit(card.getOrgUnit()); + org.setRole(card.getOrgRole()); + org.setTitle(card.getOrgTitle()); + iq.setOrganization(org); bool avatarChanged = false; if (card.getAvatarType() == Shared::Avatar::empty) { diff --git a/global.cpp b/global.cpp index fa63539..efadd6c 100644 --- a/global.cpp +++ b/global.cpp @@ -323,11 +323,17 @@ Shared::VCard::Address::Address(const QString& zCode, const QString& cntry, cons {} Shared::VCard::VCard(): + fullName(), firstName(), middleName(), lastName(), nickName(), description(), + url(), + organizationName(), + organizationUnit(), + organizationRole(), + jobTitle(), birthday(), photoType(Avatar::empty), photoPath(), @@ -338,11 +344,17 @@ Shared::VCard::VCard(): {} Shared::VCard::VCard(const QDateTime& creationTime): + fullName(), firstName(), middleName(), lastName(), nickName(), description(), + url(), + organizationName(), + organizationUnit(), + organizationRole(), + jobTitle(), birthday(), photoType(Avatar::empty), photoPath(), @@ -449,6 +461,78 @@ void Shared::VCard::setNickName(const QString& nick) } } +QString Shared::VCard::getFullName() const +{ + return fullName; +} + +QString Shared::VCard::getUrl() const +{ + return url; +} + +void Shared::VCard::setFullName(const QString& name) +{ + if (fullName != name) { + fullName = name; + } +} + +void Shared::VCard::setUrl(const QString& u) +{ + if (url != u) { + url = u; + } +} + +QString Shared::VCard::getOrgName() const +{ + return organizationName; +} + +QString Shared::VCard::getOrgRole() const +{ + return organizationRole; +} + +QString Shared::VCard::getOrgTitle() const +{ + return jobTitle; +} + +QString Shared::VCard::getOrgUnit() const +{ + return organizationUnit; +} + +void Shared::VCard::setOrgName(const QString& name) +{ + if (organizationName != name) { + organizationName = name; + } +} + +void Shared::VCard::setOrgRole(const QString& role) +{ + if (organizationRole != role) { + organizationRole = role; + } +} + +void Shared::VCard::setOrgTitle(const QString& title) +{ + if (jobTitle != title) { + jobTitle = title; + } +} + +void Shared::VCard::setOrgUnit(const QString& unit) +{ + if (organizationUnit != unit) { + organizationUnit = unit; + } +} + QIcon Shared::availabilityIcon(Shared::Availability av, bool big) { const std::deque& fallback = QApplication::palette().window().color().lightnessF() > 0.5 ? diff --git a/global.h b/global.h index 0daa20b..1261d1f 100644 --- a/global.h +++ b/global.h @@ -272,6 +272,8 @@ public: VCard(); VCard(const QDateTime& creationTime); + QString getFullName() const; + void setFullName(const QString& name); QString getFirstName() const; void setFirstName(const QString& first); QString getMiddleName() const; @@ -282,19 +284,35 @@ public: void setNickName(const QString& nick); QString getDescription() const; void setDescription(const QString& descr); + QString getUrl() const; + void setUrl(const QString& u); QDate getBirthday() const; void setBirthday(const QDate& date); Avatar getAvatarType() const; void setAvatarType(Avatar type); QString getAvatarPath() const; void setAvatarPath(const QString& path); + QString getOrgName() const; + void setOrgName(const QString& name); + QString getOrgUnit() const; + void setOrgUnit(const QString& unit); + QString getOrgRole() const; + void setOrgRole(const QString& role); + QString getOrgTitle() const; + void setOrgTitle(const QString& title); private: + QString fullName; QString firstName; QString middleName; QString lastName; QString nickName; QString description; + QString url; + QString organizationName; + QString organizationUnit; + QString organizationRole; + QString jobTitle; QDate birthday; Avatar photoType; QString photoPath; @@ -438,6 +456,10 @@ static const std::map> icons = { {"send", {"document-send", "send"}}, {"clean", {"edit-clear-all", "clean"}}, {"user", {"user", "user"}}, + {"user-properties", {"user-properties", "user-properties"}}, + {"edit-rename", {"edit-rename", "edit-rename"}}, + {"group", {"group", "group"}}, + {"group-new", {"resurce-group-new", "group-new"}}, }; }; diff --git a/resources/images/fallback/dark/big/edit-rename.svg b/resources/images/fallback/dark/big/edit-rename.svg new file mode 100644 index 0000000..8075a3b --- /dev/null +++ b/resources/images/fallback/dark/big/edit-rename.svg @@ -0,0 +1,14 @@ + + + + + + diff --git a/resources/images/fallback/dark/big/group-new.svg b/resources/images/fallback/dark/big/group-new.svg new file mode 100644 index 0000000..a28270a --- /dev/null +++ b/resources/images/fallback/dark/big/group-new.svg @@ -0,0 +1,14 @@ + + + + + + diff --git a/resources/images/fallback/dark/big/group.svg b/resources/images/fallback/dark/big/group.svg new file mode 100644 index 0000000..0b9c379 --- /dev/null +++ b/resources/images/fallback/dark/big/group.svg @@ -0,0 +1,14 @@ + + + + + + diff --git a/resources/images/fallback/dark/big/user-properties.svg b/resources/images/fallback/dark/big/user-properties.svg new file mode 100644 index 0000000..afec990 --- /dev/null +++ b/resources/images/fallback/dark/big/user-properties.svg @@ -0,0 +1,14 @@ + + + + + + diff --git a/resources/images/fallback/dark/small/edit-rename.svg b/resources/images/fallback/dark/small/edit-rename.svg new file mode 100644 index 0000000..18ccc58 --- /dev/null +++ b/resources/images/fallback/dark/small/edit-rename.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/resources/images/fallback/dark/small/group-new.svg b/resources/images/fallback/dark/small/group-new.svg new file mode 100644 index 0000000..848af85 --- /dev/null +++ b/resources/images/fallback/dark/small/group-new.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/resources/images/fallback/dark/small/group.svg b/resources/images/fallback/dark/small/group.svg new file mode 100644 index 0000000..7ca4c26 --- /dev/null +++ b/resources/images/fallback/dark/small/group.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/resources/images/fallback/dark/small/user-properties.svg b/resources/images/fallback/dark/small/user-properties.svg new file mode 100644 index 0000000..fa4c9e0 --- /dev/null +++ b/resources/images/fallback/dark/small/user-properties.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/resources/images/fallback/light/big/edit-rename.svg b/resources/images/fallback/light/big/edit-rename.svg new file mode 100644 index 0000000..0c3d22c --- /dev/null +++ b/resources/images/fallback/light/big/edit-rename.svg @@ -0,0 +1,14 @@ + + + + + + diff --git a/resources/images/fallback/light/big/group-new.svg b/resources/images/fallback/light/big/group-new.svg new file mode 100644 index 0000000..9c8b823 --- /dev/null +++ b/resources/images/fallback/light/big/group-new.svg @@ -0,0 +1,14 @@ + + + + + + diff --git a/resources/images/fallback/light/big/group.svg b/resources/images/fallback/light/big/group.svg new file mode 100644 index 0000000..ef4758b --- /dev/null +++ b/resources/images/fallback/light/big/group.svg @@ -0,0 +1,14 @@ + + + + + + diff --git a/resources/images/fallback/light/big/user-properties.svg b/resources/images/fallback/light/big/user-properties.svg new file mode 100644 index 0000000..9a14b93 --- /dev/null +++ b/resources/images/fallback/light/big/user-properties.svg @@ -0,0 +1,14 @@ + + + + + + diff --git a/resources/images/fallback/light/small/edit-rename.svg b/resources/images/fallback/light/small/edit-rename.svg new file mode 100644 index 0000000..6a84496 --- /dev/null +++ b/resources/images/fallback/light/small/edit-rename.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/resources/images/fallback/light/small/group-new.svg b/resources/images/fallback/light/small/group-new.svg new file mode 100644 index 0000000..43b465a --- /dev/null +++ b/resources/images/fallback/light/small/group-new.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/resources/images/fallback/light/small/group.svg b/resources/images/fallback/light/small/group.svg new file mode 100644 index 0000000..dfefc94 --- /dev/null +++ b/resources/images/fallback/light/small/group.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/resources/images/fallback/light/small/user-properties.svg b/resources/images/fallback/light/small/user-properties.svg new file mode 100644 index 0000000..2a0bebd --- /dev/null +++ b/resources/images/fallback/light/small/user-properties.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/resources/resources.qrc b/resources/resources.qrc index 244db04..3cfaa84 100644 --- a/resources/resources.qrc +++ b/resources/resources.qrc @@ -32,6 +32,10 @@ images/fallback/dark/big/clean.svg images/fallback/dark/big/send.svg images/fallback/dark/big/mail-attachment.svg + images/fallback/dark/big/group.svg + images/fallback/dark/big/group-new.svg + images/fallback/dark/big/edit-rename.svg + images/fallback/dark/big/user-properties.svg images/fallback/dark/small/absent.svg @@ -64,6 +68,10 @@ images/fallback/dark/small/clean.svg images/fallback/dark/small/send.svg images/fallback/dark/small/mail-attachment.svg + images/fallback/dark/small/group.svg + images/fallback/dark/small/group-new.svg + images/fallback/dark/small/edit-rename.svg + images/fallback/dark/small/user-properties.svg images/fallback/light/big/absent.svg @@ -96,6 +104,10 @@ images/fallback/light/big/clean.svg images/fallback/light/big/send.svg images/fallback/light/big/mail-attachment.svg + images/fallback/light/big/group.svg + images/fallback/light/big/group-new.svg + images/fallback/light/big/edit-rename.svg + images/fallback/light/big/user-properties.svg images/fallback/light/small/absent.svg @@ -128,5 +140,9 @@ images/fallback/light/small/clean.svg images/fallback/light/small/send.svg images/fallback/light/small/mail-attachment.svg + images/fallback/light/small/group.svg + images/fallback/light/small/group-new.svg + images/fallback/light/small/edit-rename.svg + images/fallback/light/small/user-properties.svg diff --git a/ui/models/roster.cpp b/ui/models/roster.cpp index 6e49104..e124db7 100644 --- a/ui/models/roster.cpp +++ b/ui/models/roster.cpp @@ -934,3 +934,23 @@ bool Models::Roster::groupHasContact(const QString& account, const QString& grou return gr->hasContact(contact); } } + +QString Models::Roster::getContactIconPath(const QString& account, const QString& jid) +{ + ElId id(account, jid); + std::multimap::const_iterator cItr = contacts.find(id); + QString path = ""; + if (cItr == contacts.end()) { + std::map::const_iterator rItr = rooms.find(id); + if (rItr == rooms.end()) { + qDebug() << "An attempt to get an icon path of non existing contact" << account << ":" << jid << ", returning empty value"; + } else { + //path = rItr->second->getRoomName(); + } + } else { + if (cItr->second->getAvatarState() != Shared::Avatar::empty) { + path = cItr->second->getAvatarPath(); + } + } + return path; +} diff --git a/ui/models/roster.h b/ui/models/roster.h index 30fb884..40c978d 100644 --- a/ui/models/roster.h +++ b/ui/models/roster.h @@ -73,6 +73,7 @@ public: std::deque groupList(const QString& account) const; bool groupHasContact(const QString& account, const QString& group, const QString& contactJID) const; + QString getContactIconPath(const QString& account, const QString& jid); Accounts* accountsModel; diff --git a/ui/squawk.cpp b/ui/squawk.cpp index b5cb84c..b228ac8 100644 --- a/ui/squawk.cpp +++ b/ui/squawk.cpp @@ -464,11 +464,16 @@ void Squawk::accountMessage(const QString& account, const Shared::Message& data) void Squawk::notify(const QString& account, const Shared::Message& msg) { - QString name = QString(rosterModel.getContactName(account, msg.getPenPalJid()));; + QString name = QString(rosterModel.getContactName(account, msg.getPenPalJid())); + QString path = QString(rosterModel.getContactIconPath(account, msg.getPenPalJid())); QVariantList args; args << QString(QCoreApplication::applicationName()); args << QVariant(QVariant::UInt); //TODO some normal id - args << QString("mail-message"); //TODO icon + if (path.size() > 0) { + args << path; + } else { + args << QString("mail-message"); + } if (msg.getType() == Shared::Message::groupChat) { args << msg.getFromResource() + " from " + name; } else { @@ -635,7 +640,7 @@ void Squawk::onRosterContextMenu(const QPoint& point) } }); } - QAction* newGroup = groupsMenu->addAction(Shared::icon("resource-group-new"), tr("New group")); + QAction* newGroup = groupsMenu->addAction(Shared::icon("group-new"), tr("New group")); newGroup->setEnabled(active); connect(newGroup, &QAction::triggered, [this, accName, cntJID]() { QInputDialog* dialog = new QInputDialog(this); diff --git a/ui/widgets/vcard.cpp b/ui/widgets/vcard.cpp index 1da6c2e..c20b4bf 100644 --- a/ui/widgets/vcard.cpp +++ b/ui/widgets/vcard.cpp @@ -52,6 +52,7 @@ VCard::VCard(const QString& jid, bool edit, QWidget* parent): avatarMenu->addAction(clearAvatar); } else { m_ui->buttonBox->hide(); + m_ui->fullName->setReadOnly(true); m_ui->firstName->setReadOnly(true); m_ui->middleName->setReadOnly(true); m_ui->lastName->setReadOnly(true); @@ -89,16 +90,18 @@ void VCard::setVCard(const QString& jid, const Shared::VCard& card) void VCard::setVCard(const Shared::VCard& card) { + m_ui->fullName->setText(card.getFullName()); m_ui->firstName->setText(card.getFirstName()); m_ui->middleName->setText(card.getMiddleName()); m_ui->lastName->setText(card.getLastName()); m_ui->nickName->setText(card.getNickName()); m_ui->birthday->setDate(card.getBirthday()); - //m_ui->organizationName->setText(card.get()); - //m_ui->organizationDepartment->setText(card.get()); - //m_ui->organizationTitle->setText(card.get()); - //m_ui->organizationRole->setText(card.get()); + m_ui->organizationName->setText(card.getOrgName()); + m_ui->organizationDepartment->setText(card.getOrgUnit()); + m_ui->organizationTitle->setText(card.getOrgTitle()); + m_ui->organizationRole->setText(card.getOrgRole()); m_ui->description->setText(card.getDescription()); + m_ui->url->setText(card.getUrl()); currentAvatarType = card.getAvatarType(); currentAvatarPath = card.getAvatarPath(); @@ -113,12 +116,18 @@ QString VCard::getJid() const void VCard::onButtonBoxAccepted() { Shared::VCard card; + card.setFullName(m_ui->fullName->text()); card.setFirstName(m_ui->firstName->text()); card.setMiddleName(m_ui->middleName->text()); card.setLastName(m_ui->lastName->text()); card.setNickName(m_ui->nickName->text()); card.setBirthday(m_ui->birthday->date()); card.setDescription(m_ui->description->toPlainText()); + card.setUrl(m_ui->url->text()); + card.setOrgName(m_ui->organizationName->text()); + card.setOrgUnit(m_ui->organizationDepartment->text()); + card.setOrgRole(m_ui->organizationRole->text()); + card.setOrgTitle(m_ui->organizationTitle->text()); card.setAvatarPath(currentAvatarPath); card.setAvatarType(currentAvatarType); diff --git a/ui/widgets/vcard.ui b/ui/widgets/vcard.ui index 406ca9a..9eabf0b 100644 --- a/ui/widgets/vcard.ui +++ b/ui/widgets/vcard.ui @@ -6,8 +6,8 @@ 0 0 - 537 - 539 + 594 + 595 @@ -94,14 +94,177 @@ - + Qt::Horizontal - + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + <html><head/><body><p><span style=" font-size:24pt; font-weight:600;">General</span></p></body></html> + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + + + <html><head/><body><p><span style=" font-size:16pt; font-weight:600;">Organization</span></p></body></html> + + + Qt::AlignCenter + + + + + + + Qt::AlignHCenter|Qt::AlignTop + + + + + Organization name + + + organizationName + + + + + + + + 200 + 0 + + + + + 350 + 16777215 + + + + + + + + Unit / Department + + + organizationDepartment + + + + + + + + 200 + 0 + + + + + 350 + 16777215 + + + + + + + + Role / Profession + + + organizationRole + + + + + + + + 200 + 0 + + + + + 350 + 16777215 + + + + + + + + Job title + + + organizationTitle + + + + + + + + 200 + 0 + + + + + 350 + 16777215 + + + + + + + QLayout::SetDefaultConstraint @@ -228,190 +391,7 @@ - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - - - - <html><head/><body><p><span style=" font-size:16pt; font-weight:600;">Organization</span></p></body></html> - - - Qt::AlignCenter - - - - - - - Qt::AlignHCenter|Qt::AlignTop - - - - - Organization name - - - organizationName - - - - - - - - 200 - 0 - - - - - 350 - 16777215 - - - - - - - - Unit / Department - - - organizationDepartment - - - - - - - - 200 - 0 - - - - - 350 - 16777215 - - - - - - - - Role / Profession - - - organizationRole - - - - - - - - 200 - 0 - - - - - 350 - 16777215 - - - - - - - - Job title - - - organizationTitle - - - - - - - - 200 - 0 - - - - - 350 - 16777215 - - - - - - - - - - Qt::Horizontal - - - - - - - <html><head/><body><p><span style=" font-size:24pt; font-weight:600;">General</span></p></body></html> - - - - + @@ -429,7 +409,8 @@ - + + .. @@ -448,6 +429,43 @@ + + + + Qt::Horizontal + + + + + + + + + + + + Full name + + + fullName + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + @@ -496,8 +514,8 @@ 0 0 - 525 - 415 + 582 + 471 @@ -584,6 +602,9 @@ Web site + + url + @@ -756,7 +777,8 @@ - + + .. Set avatar @@ -764,7 +786,8 @@ - + + .. Clear avatar @@ -772,19 +795,22 @@ + fullName firstName middleName lastName nickName birthday + avatarButton organizationName organizationDepartment organizationRole organizationTitle - scrollArea - jabberID - description tabWidget + jabberID + url + description + scrollArea