diff --git a/src/contactadapter.cpp b/src/contactadapter.cpp index 1638d83443dcbc865698d55d5fa0ef6067f1a6fc..534ba666b43d39208f8a5c0c903dc00fcc933fb4 100644 --- a/src/contactadapter.cpp +++ b/src/contactadapter.cpp @@ -54,7 +54,11 @@ ContactAdapter::getContactSelectableModel(int type) return !defaultModerators_.contains(index.data(Role::URI).toString()); }); break; - + case SmartListModel::Type::ADDCONVMEMBER: + selectableProxyModel_->setPredicate([](const QModelIndex& index, const QRegExp&) { + return index.data(Role::IsCoreDialog).toBool(); + }); + break; case SmartListModel::Type::CONFERENCE: selectableProxyModel_->setPredicate([](const QModelIndex& index, const QRegularExpression&) { return index.data(Role::Presence).toBool(); @@ -102,6 +106,16 @@ ContactAdapter::setSearchFilter(const QString& filter) return (!defaultModerators_.contains(index.data(Role::URI).toString()) && index.data(Role::Title).toString().contains(filter)); }); + } else if (listModeltype_ == SmartListModel::Type::ADDCONVMEMBER) { + selectableProxyModel_->setPredicate( + [this, filter](const QModelIndex& index, const QRegExp&) { + return (index.data(Role::Title).toString().contains(filter, Qt::CaseInsensitive) + || index.data(Role::RegisteredName) + .toString() + .contains(filter, Qt::CaseInsensitive) + || index.data(Role::URI).toString().contains(filter, Qt::CaseInsensitive)) + && index.data(Role::IsCoreDialog).toBool(); + }); } selectableProxyModel_->setFilterRegularExpression( QRegularExpression(filter, QRegularExpression::CaseInsensitiveOption)); @@ -112,10 +126,16 @@ ContactAdapter::contactSelected(int index) { auto contactIndex = selectableProxyModel_->index(index, 0); auto* callModel = lrcInstance_->getCurrentCallModel(); + auto* convModel = lrcInstance_->getCurrentConversationModel(); const auto& convInfo = lrcInstance_->getConversationFromConvUid( lrcInstance_->get_selectedConvUid()); if (contactIndex.isValid()) { switch (listModeltype_) { + case SmartListModel::Type::ADDCONVMEMBER: { + const auto uri = contactIndex.data(Role::URI).value<QString>(); + convModel->addConversationMember(lrcInstance_->get_selectedConvUid(), uri); + break; + } case SmartListModel::Type::CONFERENCE: { // Conference. const auto sectionName = contactIndex.data(Role::SectionName).value<QString>(); diff --git a/src/mainview/components/ChatViewHeader.qml b/src/mainview/components/ChatViewHeader.qml index 9bd11a6c501b78af598c5c44801c74c6f56b3632..50053eea6200c2f00c5d8bb896606ebf3382da5c 100644 --- a/src/mainview/components/ChatViewHeader.qml +++ b/src/mainview/components/ChatViewHeader.qml @@ -25,6 +25,7 @@ import net.jami.Constants 1.1 import net.jami.Adapters 1.1 import "../../commoncomponents" +import "../js/contactpickercreation.js" as ContactPickerCreation Rectangle { id: root @@ -49,8 +50,17 @@ Rectangle { return true } + property bool addMemberVisibility: { + return !CurrentConversation.isCoreDialog && CurrentConversation.isSwarm + } + color: JamiTheme.chatviewBgColor + function addToConversationClicked() { + ContactPickerCreation.createContactPickerObjects(ContactList.ADDCONVMEMBER, root) + ContactPickerCreation.openContactPicker() + } + RowLayout { id: messagingHeaderRectRowLayout @@ -140,7 +150,7 @@ Rectangle { PushButton { id: startAAudioCallButton - visible: interactionButtonsVisibility + visible: interactionButtonsVisibility && !addMemberVisibility source: JamiResources.place_audiocall_24dp_svg toolTipText: JamiStrings.placeAudioCall @@ -154,8 +164,7 @@ Rectangle { PushButton { id: startAVideoCallButton - visible: CurrentAccount.videoEnabled_Video && interactionButtonsVisibility - + visible: CurrentAccount.videoEnabled_Video && interactionButtonsVisibility && !addMemberVisibility source: JamiResources.videocam_24dp_svg toolTipText: JamiStrings.placeVideoCall @@ -167,6 +176,20 @@ Rectangle { } } + PushButton { + id: addParticipantsButton + + visible: addMemberVisibility + + source: JamiResources.add_people_24dp_svg + toolTipText: JamiStrings.addParticipants + + normalColor: JamiTheme.chatviewBgColor + imageColor: JamiTheme.chatviewButtonColor + + onClicked: root.addToConversationClicked() + } + PushButton { id: selectPluginButton diff --git a/src/mainview/components/ContactPicker.qml b/src/mainview/components/ContactPicker.qml index a5e450b4adda7514398958fa22c680e28d9da134..66c52ce1edceb1f092beff1d455e9c7137f47524 100644 --- a/src/mainview/components/ContactPicker.qml +++ b/src/mainview/components/ContactPicker.qml @@ -82,6 +82,8 @@ Popup { switch(type) { case ContactList.CONFERENCE: return qsTr("Add to conference") + case ContactList.ADDCONVMEMBER: + return qsTr("Add to conversation") case ContactList.TRANSFER: return qsTr("Transfer this call") default: diff --git a/src/smartlistmodel.cpp b/src/smartlistmodel.cpp index 9e52557ddb36eb2baf17448c4f0e128420ca8e83..c07abeba488534a0a35de1b8696e6f7d470e850b 100644 --- a/src/smartlistmodel.cpp +++ b/src/smartlistmodel.cpp @@ -39,7 +39,7 @@ SmartListModel::SmartListModel(QObject* parent, { if (listModelType_ == Type::CONFERENCE) { setConferenceableFilter(); - } else if (listModelType_ == Type::CONVERSATION) { + } else if (listModelType_ == Type::CONVERSATION || listModelType_ == Type::ADDCONVMEMBER) { fillConversationsList(); } } @@ -131,6 +131,7 @@ SmartListModel::data(const QModelIndex& index, int role) const auto& item = lrcInstance_->getConversationFromConvUid(itemConvUid, itemAccountId); return dataForItem(item, role); } break; + case Type::ADDCONVMEMBER: case Type::CONVERSATION: { auto& item = conversations_.at(index.row()); return dataForItem(item, role); diff --git a/src/smartlistmodel.h b/src/smartlistmodel.h index 642c90b9b49ffc2dadc00463ac388ce6d3737108..630f103515d7b529d5c3b294f898d7113c2c243f 100644 --- a/src/smartlistmodel.h +++ b/src/smartlistmodel.h @@ -24,7 +24,7 @@ namespace ContactList { Q_NAMESPACE -enum Type { CONVERSATION, CONFERENCE, TRANSFER, COUNT__ }; +enum Type { CONVERSATION, CONFERENCE, TRANSFER, ADDCONVMEMBER, COUNT__ }; Q_ENUM_NS(Type) } // namespace ContactList