From fb009fa17a23306ed77c4327f92507d956b57284 Mon Sep 17 00:00:00 2001 From: gaelle Date: Fri, 28 Mar 2025 10:41:11 +0100 Subject: [PATCH] fix #LINQT-1705 allow adding ldap friend in app contacts --- .../Display/Contact/ContactListItem.qml | 281 +++++++++--------- Linphone/view/Page/Main/Call/CallPage.qml | 6 +- 2 files changed, 139 insertions(+), 148 deletions(-) diff --git a/Linphone/view/Control/Display/Contact/ContactListItem.qml b/Linphone/view/Control/Display/Contact/ContactListItem.qml index c4afb4c8d..b0fa30efb 100644 --- a/Linphone/view/Control/Display/Contact/ContactListItem.qml +++ b/Linphone/view/Control/Display/Contact/ContactListItem.qml @@ -103,154 +103,145 @@ FocusScope { Item { Layout.fillWidth: true } - Loader { - id: buttonsLayoutLoader - asynchronous: true - active: mainItem.showActions || mainItem.showContactMenu - || mainItem.multiSelectionEnabled - Layout.rightMargin: active ? Math.round(10 * DefaultStyle.dp) : 0 - sourceComponent: RowLayout { - id: actionsRow + RowLayout { + id: actionsRow + z: 1 + visible: mainItem.showActions || actionButtons.visible || mainItem.showContactMenu || mainItem.multiSelectionEnabled + spacing: visible ? Math.round(16 * DefaultStyle.dp) : 0 + enabled: visible + Layout.rightMargin: Math.round(5 * DefaultStyle.dp) + EffectImage { + id: isSelectedCheck + visible: mainItem.multiSelectionEnabled + && (mainItem.selectedContacts.indexOf( + searchResultItem.core.defaultAddress) != -1) + Layout.preferredWidth: Math.round(24 * DefaultStyle.dp) + Layout.preferredHeight: Math.round(24 * DefaultStyle.dp) + imageSource: AppIcons.check + colorizationColor: DefaultStyle.main1_500_main + } + RowLayout { + id: actionButtons + visible: mainItem.showActions + spacing: visible ? Math.round(10 * DefaultStyle.dp) : 0 + IconButton { + id: callButton + Layout.preferredWidth: Math.round(45 * DefaultStyle.dp) + Layout.preferredHeight: Math.round(45 * DefaultStyle.dp) + icon.width: Math.round(24 * DefaultStyle.dp) + icon.height: Math.round(24 * DefaultStyle.dp) + icon.source: AppIcons.phone + focus: visible + radius: Math.round(40 * DefaultStyle.dp) + style: ButtonStyle.grey + onClicked: UtilsCpp.createCall( + searchResultItem.core.defaultFullAddress) + KeyNavigation.left: chatButton + KeyNavigation.right: videoCallButton + } + IconButton { + id: videoCallButton + visible: SettingsCpp.videoEnabled + Layout.preferredWidth: Math.round(45 * DefaultStyle.dp) + Layout.preferredHeight: Math.round(45 * DefaultStyle.dp) + icon.width: Math.round(24 * DefaultStyle.dp) + icon.height: Math.round(24 * DefaultStyle.dp) + icon.source: AppIcons.videoCamera + focus: visible && !callButton.visible + radius: Math.round(40 * DefaultStyle.dp) + style: ButtonStyle.grey + onClicked: UtilsCpp.createCall( + searchResultItem.core.defaultFullAddress, + { + "localVideoEnabled": true + }) + KeyNavigation.left: callButton + KeyNavigation.right: chatButton + } + IconButton { + id: chatButton + visible: actionButtons.visible + && !SettingsCpp.disableChatFeature + Layout.preferredWidth: Math.round(45 * DefaultStyle.dp) + Layout.preferredHeight: Math.round(45 * DefaultStyle.dp) + icon.width: Math.round(24 * DefaultStyle.dp) + icon.height: Math.round(24 * DefaultStyle.dp) + icon.source: AppIcons.chatTeardropText + focus: visible && !callButton.visible + && !videoCallButton.visible + radius: Math.round(40 * DefaultStyle.dp) + style: ButtonStyle.grey + KeyNavigation.left: videoCallButton + KeyNavigation.right: callButton + } + } + PopupButton { + id: friendPopup z: 1 - visible: actionButtons.visible || friendPopup.visible - || mainItem.multiSelectionEnabled - spacing: visible ? Math.round(16 * DefaultStyle.dp) : 0 + popup.x: 0 + popup.padding: Math.round(10 * DefaultStyle.dp) + visible: mainItem.showContactMenu && (contactArea.containsMouse || mainItem.isLastHovered || hovered || popup.opened) enabled: visible - EffectImage { - id: isSelectedCheck - visible: mainItem.multiSelectionEnabled - && (mainItem.selectedContacts.indexOf( - searchResultItem.core.defaultAddress) != -1) - Layout.preferredWidth: Math.round(24 * DefaultStyle.dp) - Layout.preferredHeight: Math.round(24 * DefaultStyle.dp) - imageSource: AppIcons.check - colorizationColor: DefaultStyle.main1_500_main - } - RowLayout { - id: actionButtons - visible: mainItem.showActions - spacing: visible ? Math.round(10 * DefaultStyle.dp) : 0 - IconButton { - id: callButton - Layout.preferredWidth: Math.round(45 * DefaultStyle.dp) - Layout.preferredHeight: Math.round(45 * DefaultStyle.dp) - icon.width: Math.round(24 * DefaultStyle.dp) - icon.height: Math.round(24 * DefaultStyle.dp) - icon.source: AppIcons.phone - focus: visible - radius: Math.round(40 * DefaultStyle.dp) - style: ButtonStyle.grey - onClicked: UtilsCpp.createCall( - searchResultItem.core.defaultFullAddress) - KeyNavigation.left: chatButton - KeyNavigation.right: videoCallButton - } - IconButton { - id: videoCallButton - visible: SettingsCpp.videoEnabled - Layout.preferredWidth: Math.round(45 * DefaultStyle.dp) - Layout.preferredHeight: Math.round(45 * DefaultStyle.dp) - icon.width: Math.round(24 * DefaultStyle.dp) - icon.height: Math.round(24 * DefaultStyle.dp) - icon.source: AppIcons.videoCamera - focus: visible && !callButton.visible - radius: Math.round(40 * DefaultStyle.dp) - style: ButtonStyle.grey - onClicked: UtilsCpp.createCall( - searchResultItem.core.defaultFullAddress, - { - "localVideoEnabled": true - }) - KeyNavigation.left: callButton - KeyNavigation.right: chatButton - } - IconButton { - id: chatButton - visible: actionButtons.visible - && !SettingsCpp.disableChatFeature - Layout.preferredWidth: Math.round(45 * DefaultStyle.dp) - Layout.preferredHeight: Math.round(45 * DefaultStyle.dp) - icon.width: Math.round(24 * DefaultStyle.dp) - icon.height: Math.round(24 * DefaultStyle.dp) - icon.source: AppIcons.chatTeardropText - focus: visible && !callButton.visible - && !videoCallButton.visible - radius: Math.round(40 * DefaultStyle.dp) - style: ButtonStyle.grey - KeyNavigation.left: videoCallButton - KeyNavigation.right: callButton - } - } - PopupButton { - id: friendPopup - z: 1 - popup.x: 0 - popup.padding: Math.round(10 * DefaultStyle.dp) - visible: mainItem.showContactMenu - && (contactArea.containsMouse || hovered - || popup.opened) - enabled: visible - popup.contentItem: ColumnLayout { - IconLabelButton { - visible: searchResultItem.core.isStored - && !searchResultItem.core.readOnly - //: "Enlever des favoris" - text: searchResultItem.core.starred ? qsTr("contact_details_remove_from_favourites") - //: "Ajouter aux favoris" - : qsTr("contact_details_add_to_favourites") - icon.source: searchResultItem.core.starred ? AppIcons.heartFill : AppIcons.heart - spacing: Math.round(10 * DefaultStyle.dp) - textColor: DefaultStyle.main2_500main - hoveredImageColor: searchResultItem.core.starred ? DefaultStyle.main1_700 : DefaultStyle.danger_700 - contentImageColor: searchResultItem.core.starred ? DefaultStyle.danger_500main : DefaultStyle.main2_600 - onClicked: { - searchResultItem.core.lSetStarred( - !searchResultItem.core.starred) - friendPopup.close() - } - style: ButtonStyle.noBackground + popup.contentItem: ColumnLayout { + IconLabelButton { + visible: searchResultItem.core.isStored + && !searchResultItem.core.readOnly + //: "Enlever des favoris" + text: searchResultItem.core.starred ? qsTr("contact_details_remove_from_favourites") + //: "Ajouter aux favoris" + : qsTr("contact_details_add_to_favourites") + icon.source: searchResultItem.core.starred ? AppIcons.heartFill : AppIcons.heart + spacing: Math.round(10 * DefaultStyle.dp) + textColor: DefaultStyle.main2_500main + hoveredImageColor: searchResultItem.core.starred ? DefaultStyle.main1_700 : DefaultStyle.danger_700 + contentImageColor: searchResultItem.core.starred ? DefaultStyle.danger_500main : DefaultStyle.main2_600 + onClicked: { + searchResultItem.core.lSetStarred( + !searchResultItem.core.starred) + friendPopup.close() } - IconLabelButton { - text: qsTr("Partager") - icon.source: AppIcons.shareNetwork - spacing: Math.round(10 * DefaultStyle.dp) - textColor: DefaultStyle.main2_500main - onClicked: { - var vcard = searchResultItem.core.getVCard() - var username = searchResultItem.core.givenName - + searchResultItem.core.familyName - var filepath = UtilsCpp.createVCardFile( - username, vcard) - if (filepath == "") - UtilsCpp.showInformationPopup( - qsTr("information_popup_error_title"), - //: La création du fichier vcard a échoué - qsTr("information_popup_vcard_creation_error"), - false) - else - //: VCard créée - mainWindow.showInformationPopup(qsTr("information_popup_vcard_creation_title"), - //: "VCard du contact enregistrée dans %1" - qsTr("information_popup_vcard_creation_success").arg(filepath)) - //: Partage de contact - UtilsCpp.shareByEmail(qsTr("contact_sharing_email_title"),vcard, filepath) - } - style: ButtonStyle.noBackground + style: ButtonStyle.noBackground + } + IconLabelButton { + text: qsTr("Partager") + icon.source: AppIcons.shareNetwork + spacing: Math.round(10 * DefaultStyle.dp) + textColor: DefaultStyle.main2_500main + onClicked: { + var vcard = searchResultItem.core.getVCard() + var username = searchResultItem.core.givenName + + searchResultItem.core.familyName + var filepath = UtilsCpp.createVCardFile( + username, vcard) + if (filepath == "") + UtilsCpp.showInformationPopup( + qsTr("information_popup_error_title"), + //: La création du fichier vcard a échoué + qsTr("information_popup_vcard_creation_error"), + false) + else + //: VCard créée + mainWindow.showInformationPopup(qsTr("information_popup_vcard_creation_title"), + //: "VCard du contact enregistrée dans %1" + qsTr("information_popup_vcard_creation_success").arg(filepath)) + //: Partage de contact + UtilsCpp.shareByEmail(qsTr("contact_sharing_email_title"),vcard, filepath) } - IconLabelButton { - //: "Supprimer" - text: qsTr("contact_details_delete") - icon.source: AppIcons.trashCan - spacing: Math.round(10 * DefaultStyle.dp) - visible: !searchResultItem.core.readOnly - onClicked: { - mainItem.contactDeletionRequested( - searchResultItem) - friendPopup.close() - } - style: ButtonStyle.noBackgroundRed + style: ButtonStyle.noBackground + } + IconLabelButton { + //: "Supprimer" + text: qsTr("contact_details_delete") + icon.source: AppIcons.trashCan + spacing: Math.round(10 * DefaultStyle.dp) + visible: !searchResultItem.core.readOnly + onClicked: { + mainItem.contactDeletionRequested( + searchResultItem) + friendPopup.close() } + style: ButtonStyle.noBackgroundRed } } } @@ -265,7 +256,7 @@ FocusScope { hoverEnabled: true acceptedButtons: Qt.AllButtons z: -1 - focus: !buttonsLayoutLoader.active + focus: !actionButtons.visible onContainsMouseChanged: { mainItem.containsMouseChanged(containsMouse) } @@ -274,7 +265,7 @@ FocusScope { radius: Math.round(8 * DefaultStyle.dp) opacity: 0.7 color: mainItem.isSelected ? DefaultStyle.main2_200 : DefaultStyle.main2_100 - visible: mainItem.isLastHovered || mainItem.isSelected + visible: mainItem.isLastHovered || mainItem.isSelected || friendPopup.hovered } Keys.onPressed: event => { if (event.key == Qt.Key_Space @@ -288,7 +279,7 @@ FocusScope { forceActiveFocus() if (mouse && mouse.button == Qt.RightButton && mainItem.showContactMenu) { - friendPopup.open() + if (friendPopup) friendPopup.open() } else { mainItem.clicked(mouse) } diff --git a/Linphone/view/Page/Main/Call/CallPage.qml b/Linphone/view/Page/Main/Call/CallPage.qml index 832572f31..d2082a519 100644 --- a/Linphone/view/Page/Main/Call/CallPage.qml +++ b/Linphone/view/Page/Main/Call/CallPage.qml @@ -533,17 +533,17 @@ ConferenceInfoGui{ || false property bool isCardDAV: contactDetail.contact?.core?.isCardDAV || false + property bool isLocalFriend: contactDetail.contact && !isLdap && !isCardDAV //: "Voir le contact" - text: contactDetail.contact ? qsTr("menu_see_existing_contact") : + text: isLocalFriend ? qsTr("menu_see_existing_contact") : //: "Ajouter aux contacts" qsTr("menu_add_address_to_contacts") icon.source: AppIcons.plusCircle icon.width: Math.round(32 * DefaultStyle.dp) icon.height: Math.round(32 * DefaultStyle.dp) - visible: !isLdap && !isCardDAV onClicked: { detailOptions.close() - if (contactDetail.contact) + if (isLocalFriend) mainWindow.displayContactPage( contactDetail.contactAddress) else