From a2154a6c7b9c3201b1547322200a00b3c42cce09 Mon Sep 17 00:00:00 2001 From: Gaelle Braud Date: Mon, 5 Feb 2024 11:12:19 +0100 Subject: [PATCH] FIXES: contact list generic VariantList FriendModel resetAddresses check null default account address list update on save generic item for white background lists ui fix set photo friend protect friendmodel setters remove main splitview to stick to the mock-up (keeping it commented cause it may be useful to be able to resize the panels) default image avatar fix crash when address not set fix ui in call Really fix call variantobject destroying himself before call started fix: display suggestions fix list view current item always reset cause updated every time contact history list changed fix blinking call log list view on content changed fix popup button popup y when exceed window delete contact confirmation popup fix popup call contact list don't show popup if only one address possible set/remove default address if append/remove from address list --- Linphone/core/friend/FriendCore.cpp | 11 +- Linphone/core/friend/FriendCore.hpp | 8 +- Linphone/core/login/LoginPage.cpp | 2 +- Linphone/core/search/MagicSearchList.cpp | 41 +++--- Linphone/model/object/VariantObject.cpp | 2 - Linphone/view/App/CallsWindow.qml | 19 ++- Linphone/view/App/Layout/ContactLayout.qml | 6 +- Linphone/view/App/Main.qml | 4 + Linphone/view/Item/Button.qml | 4 +- Linphone/view/Item/Call/CallContactsLists.qml | 121 ++++++++---------- Linphone/view/Item/Contact/ContactEdition.qml | 2 +- Linphone/view/Item/Contact/ContactsList.qml | 8 +- Linphone/view/Item/PopupButton.qml | 13 +- .../view/Item/RoundedBackgroundControl.qml | 4 +- Linphone/view/Item/Text.qml | 10 +- Linphone/view/Page/Main/CallPage.qml | 52 ++++---- Linphone/view/Page/Main/ContactPage.qml | 26 +++- Linphone/view/Prototype/CallPrototype.qml | 8 +- 18 files changed, 194 insertions(+), 147 deletions(-) diff --git a/Linphone/core/friend/FriendCore.cpp b/Linphone/core/friend/FriendCore.cpp index 7cf088092..e3fc44e27 100644 --- a/Linphone/core/friend/FriendCore.cpp +++ b/Linphone/core/friend/FriendCore.cpp @@ -301,12 +301,16 @@ void FriendCore::setAddressAt(int index, const QString &label, const QString &ad } void FriendCore::removeAddress(int index) { - if (index != -1) mAddressList.remove(index); + if (index < 0 && index >= mAddressList.size()) return; + auto map = mAddressList[index].toMap(); + if (map["address"].toString() == mDefaultAddress) mDefaultAddress.clear(); + mAddressList.remove(index); emit addressChanged(); } void FriendCore::appendAddress(const QString &addr) { mAddressList.append(createFriendAddressVariant(addressLabel, addr)); + if (mDefaultAddress.isEmpty()) mDefaultAddress = addr; emit addressChanged(); } @@ -324,6 +328,9 @@ QString FriendCore::getDefaultAddress() const { } void FriendCore::setDefaultAddress(const QString &address) { + auto it = std::find_if(mAddressList.begin(), mAddressList.end(), + [address](const QVariant &a) { return a.toMap()["address"].toString() == address; }); + if (it == mAddressList.end()) appendAddress(address); if (mDefaultAddress != address) { mDefaultAddress = address; emit defaultAddressChanged(); @@ -510,4 +517,4 @@ void FriendCore::undo() { // Retrieve values from model }); }); } -} \ No newline at end of file +} diff --git a/Linphone/core/friend/FriendCore.hpp b/Linphone/core/friend/FriendCore.hpp index 3081d4787..6c60d9b5f 100644 --- a/Linphone/core/friend/FriendCore.hpp +++ b/Linphone/core/friend/FriendCore.hpp @@ -44,7 +44,7 @@ class FriendCore; class FriendCore : public QObject, public AbstractObject { Q_OBJECT - Q_PROPERTY(QList allAdresses READ getAllAddresses NOTIFY allAddressesChanged) + Q_PROPERTY(QList allAddresses READ getAllAddresses NOTIFY allAddressesChanged) Q_PROPERTY(QList phoneNumbers READ getPhoneNumbers NOTIFY phoneNumberChanged) Q_PROPERTY(QList addresses READ getAddresses NOTIFY addressChanged) Q_PROPERTY(QString givenName READ getGivenName WRITE setGivenName NOTIFY givenNameChanged) @@ -92,14 +92,12 @@ public: Q_INVOKABLE void appendPhoneNumber(const QString &label, const QString &number); Q_INVOKABLE void removePhoneNumber(int index); Q_INVOKABLE void setPhoneNumberAt(int index, const QString &label, const QString &phoneNumber); - void resetPhoneNumbers(QList newList); QList getAddresses() const; QVariant getAddressAt(int index) const; Q_INVOKABLE void appendAddress(const QString &addr); Q_INVOKABLE void removeAddress(int index); Q_INVOKABLE void setAddressAt(int index, const QString &label, const QString &address); - void resetAddresses(QList newList); void setDefaultAddress(const QString &address); QString getDefaultAddress() const; @@ -125,6 +123,10 @@ public: Q_INVOKABLE void save(); Q_INVOKABLE void undo(); +protected: + void resetPhoneNumbers(QList newList); + void resetAddresses(QList newList); + signals: void contactUpdated(); void displayNameChanged(); diff --git a/Linphone/core/login/LoginPage.cpp b/Linphone/core/login/LoginPage.cpp index e9eaa7fae..f759c178e 100644 --- a/Linphone/core/login/LoginPage.cpp +++ b/Linphone/core/login/LoginPage.cpp @@ -61,7 +61,7 @@ void LoginPage::setErrorMessage(const QString &error) { void LoginPage::login(const QString &username, const QString &password) { App::postModelAsync([=]() { - QString *error = new QString(tr("Le couple identifiant mot de passe ne correspont pas")); + QString *error = new QString(tr("Le couple identifiant mot de passe ne correspond pas")); // Create on Model thread. AccountManager *accountManager = new AccountManager(); connect(accountManager, &AccountManager::registrationStateChanged, this, diff --git a/Linphone/core/search/MagicSearchList.cpp b/Linphone/core/search/MagicSearchList.cpp index 67f85c93b..42d588ebe 100644 --- a/Linphone/core/search/MagicSearchList.cpp +++ b/Linphone/core/search/MagicSearchList.cpp @@ -73,21 +73,32 @@ void MagicSearchList::setSelf(QSharedPointer me) { mModelConnection->invokeToCore([this, flag]() { setAggregationFlag(flag); }); }); - mModelConnection->makeConnectToModel(&MagicSearchModel::searchResultsReceived, - [this](const std::list> &results) { - auto *contacts = new QList>(); - for (auto it : results) { - QSharedPointer contact; - if (it->getFriend()) { - contact = FriendCore::create(it->getFriend()); - contacts->append(contact); - } - } - mModelConnection->invokeToCore([this, contacts]() { - setResults(*contacts); - delete contacts; - }); - }); + mModelConnection->makeConnectToModel( + &MagicSearchModel::searchResultsReceived, + [this](const std::list> &results) { + auto *contacts = new QList>(); + for (auto it : results) { + QSharedPointer contact; + if (it->getFriend()) { + contact = FriendCore::create(it->getFriend()); + contacts->append(contact); + } else if (auto address = it->getAddress()) { + contact = FriendCore::create(nullptr); + contact->setGivenName(Utils::coreStringToAppString(address->asStringUriOnly())); + contact->appendAddress(Utils::coreStringToAppString(address->asStringUriOnly())); + contacts->append(contact); + } else if (!it->getPhoneNumber().empty()) { + contact = FriendCore::create(it->getFriend()); + contact->setGivenName(Utils::coreStringToAppString(it->getPhoneNumber())); + contact->appendPhoneNumber(tr("Phone"), Utils::coreStringToAppString(it->getPhoneNumber())); + contacts->append(contact); + } + } + mModelConnection->invokeToCore([this, contacts]() { + setResults(*contacts); + delete contacts; + }); + }); } void MagicSearchList::setResults(const QList> &contacts) { diff --git a/Linphone/model/object/VariantObject.cpp b/Linphone/model/object/VariantObject.cpp index d93b0f960..cf36a0f98 100644 --- a/Linphone/model/object/VariantObject.cpp +++ b/Linphone/model/object/VariantObject.cpp @@ -38,13 +38,11 @@ VariantObject::VariantObject(QVariant defaultValue, QObject *parent) { mConnection->makeConnectToCore(&SafeObject::setValue, [this](QVariant value) { mConnection->invokeToModel([this, value]() { - // TODO : fix this properly if (mModelObject) mModelObject->onSetValue(value); }); }); mConnection->makeConnectToModel(&SafeObject::setValue, [this](QVariant value) { mConnection->invokeToCore([this, value]() { - // TODO : fix this properly if (mCoreObject) mCoreObject->onSetValue(value); }); }); diff --git a/Linphone/view/App/CallsWindow.qml b/Linphone/view/App/CallsWindow.qml index 12a37b178..90ea84398 100644 --- a/Linphone/view/App/CallsWindow.qml +++ b/Linphone/view/App/CallsWindow.qml @@ -32,7 +32,7 @@ Window { onCallChanged: { waitingTime.seconds = 0 waitingTimer.restart() - console.log("call changed", call, waitingTime.seconds) + console.log("call changed", call) } property var callState: call.core.state @@ -195,8 +195,9 @@ Window { color: DefaultStyle.grey_900 ColumnLayout { anchors.fill: parent - spacing: 5 * DefaultStyle.dp - anchors.bottomMargin: 5 * DefaultStyle.dp + spacing: 10 * DefaultStyle.dp + anchors.bottomMargin: 10 * DefaultStyle.dp + anchors.topMargin: 10 * DefaultStyle.dp Item { Layout.margins: 10 * DefaultStyle.dp Layout.fillWidth: true @@ -276,11 +277,15 @@ Window { bottomPadding: 8 * DefaultStyle.dp leftPadding: 10 * DefaultStyle.dp rightPadding: 10 * DefaultStyle.dp - visible: mainWindow.call.core.isSecured + width: 269 * DefaultStyle.dp + visible: mainWindow.call.core.peerSecured + onVisibleChanged: console.log("peer secured", mainWindow.call.core.peerSecured) background: Rectangle { anchors.fill: parent + color: DefaultStyle.main2_0 border.color: DefaultStyle.info_500_main - radius: 15 * DefaultStyle.dp + border.width: 1 * DefaultStyle.dp + radius: 50 * DefaultStyle.dp } contentItem: RowLayout { Image { @@ -296,7 +301,6 @@ Window { color: DefaultStyle.info_500_main font { pixelSize: 14 * DefaultStyle.dp - weight: 400 * DefaultStyle.dp } } } @@ -481,13 +485,14 @@ Window { Layout.fillWidth: true Layout.preferredHeight: numPad.height Layout.topMargin: 10 * DefaultStyle.dp + property var callObj NumericPad { id: numPad width: parent.width visible: parent.visible closeButtonVisible: false onLaunchCall: { - UtilsCpp.createCall(dialerTextInput.text + "@sip.linphone.org") + callObj = UtilsCpp.createCall(dialerTextInput.text + "@sip.linphone.org") } } } diff --git a/Linphone/view/App/Layout/ContactLayout.qml b/Linphone/view/App/Layout/ContactLayout.qml index 6b669492c..e2b5251df 100644 --- a/Linphone/view/App/Layout/ContactLayout.qml +++ b/Linphone/view/App/Layout/ContactLayout.qml @@ -119,11 +119,12 @@ ColumnLayout { // height: image.height image.source: AppIcons.phone label: qsTr("Appel") + property var callObj button.onClicked: { var addr = mainItem.contact.core.defaultAddress var addressEnd = "@sip.linphone.org" if (!addr.endsWith(addressEnd)) addr += addressEnd - UtilsCpp.createCall(addr) + callObj = UtilsCpp.createCall(addr) } } LabelButton { @@ -141,11 +142,12 @@ ColumnLayout { // Layout.preferredHeight: image.height image.source: AppIcons.videoCamera label: qsTr("Appel Video") + property var callObj button.onClicked: { var addr = mainItem.contact.core.defaultAddress var addressEnd = "@sip.linphone.org" if(!addr.endsWith(addressEnd)) addr += addressEnd - UtilsCpp.createCall(addr) + callObj = UtilsCpp.createCall(addr) console.log("[CallPage.qml] TODO : enable video") } } diff --git a/Linphone/view/App/Main.qml b/Linphone/view/App/Main.qml index d0ef6cd3d..74e9cd415 100644 --- a/Linphone/view/App/Main.qml +++ b/Linphone/view/App/Main.qml @@ -13,6 +13,10 @@ Window { // TODO : handle this bool when security mode is implemented property bool firstConnection: true + // access window properties from all its children + // (used in popupbutton to see if the popup exceed window height) + property Window mainApplicationWindow: mainWindow + function goToNewCall() { mainWindowStackView.replace(mainPage, StackView.Immediate) mainWindowStackView.currentItem.goToNewCall() diff --git a/Linphone/view/Item/Button.qml b/Linphone/view/Item/Button.qml index b4feed9d7..017fd6f49 100644 --- a/Linphone/view/Item/Button.qml +++ b/Linphone/view/Item/Button.qml @@ -23,7 +23,7 @@ Control.Button { MouseArea { anchors.fill: parent hoverEnabled: true - cursorShape: hovered ? Qt.PointingHandCursor : Qt.ArrowCursor + cursorShape: containsMouse ? Qt.PointingHandCursor : Qt.ArrowCursor acceptedButtons: Qt.NoButton } @@ -44,7 +44,7 @@ Control.Button { MouseArea { anchors.fill: parent hoverEnabled: true - cursorShape: hovered ? Qt.PointingHandCursor : Qt.ArrowCursor + cursorShape: containsMouse ? Qt.PointingHandCursor : Qt.ArrowCursor } } MultiEffect { diff --git a/Linphone/view/Item/Call/CallContactsLists.qml b/Linphone/view/Item/Call/CallContactsLists.qml index 09a28253b..11e2c520b 100644 --- a/Linphone/view/Item/Call/CallContactsLists.qml +++ b/Linphone/view/Item/Call/CallContactsLists.qml @@ -24,16 +24,17 @@ Item { } underlineColor: DefaultStyle.main1_500_main anchors.centerIn: parent - width: parent.width + width: parent.width - 30 * DefaultStyle.dp modal: true leftPadding: 15 * DefaultStyle.dp rightPadding: 15 * DefaultStyle.dp topPadding: 20 * DefaultStyle.dp bottomPadding: 25 * DefaultStyle.dp contentItem: ColumnLayout { + spacing: 10 * DefaultStyle.dp RowLayout { Text { - text: qsTr("Select channel") + text: qsTr("Which channel do you choose?") font { pixelSize: 16 * DefaultStyle.dp weight: 800 * DefaultStyle.dp @@ -53,84 +54,52 @@ Item { onClicked: startCallPopup.close() } } - component AddressButton: Button { - property int index - property string label - property string address - id: channel - // required property int index - leftPadding: 0 - rightPadding: 0 - // topPadding: 0 - bottomPadding: 0 + ListView { + id: popuplist + model: VariantList { + model: startCallPopup.contact && startCallPopup.contact.core.allAddresses || [] + } Layout.fillWidth: true - - background: Item{} - contentItem: ColumnLayout { - RowLayout { + Layout.preferredHeight: contentHeight + delegate: Item { + width: parent.width + height: 56 * DefaultStyle.dp + ColumnLayout { + width: parent.width + anchors.verticalCenter: parent.verticalCenter + spacing: 10 * DefaultStyle.dp ColumnLayout { Text { Layout.leftMargin: 5 * DefaultStyle.dp - Layout.rightMargin: 5 * DefaultStyle.dp - text: label - // TODO : change this with domain + text: modelData.label font { - pixelSize: 14 * DefaultStyle.dp + pixelSize: 13 * DefaultStyle.dp weight: 700 * DefaultStyle.dp } } Text { Layout.leftMargin: 5 * DefaultStyle.dp - Layout.rightMargin: 5 * DefaultStyle.dp - text: address + text: modelData.address font { - pixelSize: 13 * DefaultStyle.dp + pixelSize: 14 * DefaultStyle.dp weight: 400 * DefaultStyle.dp } } } - Item { + Rectangle { + visible: index != popuplist.model.count - 1 Layout.fillWidth: true + Layout.preferredHeight: 1 * DefaultStyle.dp + color: DefaultStyle.main2_200 } } - Rectangle { - visible: index < selectedContactAddresses.count - 1 - Layout.fillWidth: true - Layout.preferredHeight: 1 * DefaultStyle.dp - color: DefaultStyle.main2_200 + MouseArea { + anchors.fill: parent + hoverEnabled: true + cursorShape: containsMouse ? Qt.PointingHandCursor : Qt.ArrowCursor + onClicked: mainItem.callButtonPressed(modelData.address) } } - onClicked: mainItem.callButtonPressed(address) - } - Repeater { - id: selectedContactAddresses - model: VariantList { - model: startCallPopup.contact && startCallPopup.contact.core.addresses || [] - } - // model: startCallPopup.contact ? startCallPopup.contact.core.addresses : "" - // {label: "Work", address: "06000000000"}, - // {label: "Personal", address: "060000000"} - //account.adresses - delegate: AddressButton { - // property int index - // property string label - // property string address - } - } - Repeater { - id: selectedContactPhoneNumbers - model: VariantList { - model: startCallPopup.contact && startCallPopup.contact.core.phoneNumbers || [] - } - // model: startCallPopup.contact ? startCallPopup.contact.core.addresses : "" - // {label: "Work", address: "06000000000"}, - // {label: "Personal", address: "060000000"} - //account.adresses - delegate: AddressButton { - // property int index - // property string label - // property string address - } } } } @@ -259,14 +228,18 @@ Item { } } ContactsList{ + id: contactList Layout.fillWidth: true contactMenuVisible: false - id: contactList searchBarText: searchBar.text onContactSelected: (contact) => { - console.log("contact selected", contact) - startCallPopup.contact = contact - startCallPopup.open() + if (contact.core.allAddresses.length > 1) { + startCallPopup.contact = contact + startCallPopup.open() + + } else { + mainItem.callButtonPressed(contact.core.defaultAddress) + } } } } @@ -283,14 +256,25 @@ Item { Layout.fillWidth: true Layout.fillHeight: true initialHeadersVisible: false + displayNameCapitalization: false model: MagicSearchProxy { searchText: searchBar.text.length === 0 ? "*" : searchBar.text - sourceFlags: LinphoneEnums.MagicSearchSource.FavoriteFriends + sourceFlags: LinphoneEnums.MagicSearchSource.All aggregationFlag: LinphoneEnums.MagicSearchAggregation.Friend } onContactSelected: (contact) => { - startCallPopup.contact = contact - startCallPopup.open() + if (contact.core.allAddresses.length > 1) { + startCallPopup.contact = contact + startCallPopup.open() + + } else { + var addressToCall = contact.core.defaultAddress.length === 0 + ? contact.core.phoneNumbers.length === 0 + ? "" + : contact.core.phoneNumbers[0].address + : contact.core.defaultAddress + if (addressToCall.length != 0) mainItem.callButtonPressed(addressToCall) + } } } } @@ -310,8 +294,9 @@ Item { NumericPad { id: numPad width: parent.width + property var callObj onLaunchCall: { - UtilsCpp.createCall(searchBar.text + "@sip.linphone.org") + callObj = UtilsCpp.createCall(searchBar.text + "@sip.linphone.org") // TODO : auto completion instead of sip linphone } } diff --git a/Linphone/view/Item/Contact/ContactEdition.qml b/Linphone/view/Item/Contact/ContactEdition.qml index b4412da39..f0a4b8715 100644 --- a/Linphone/view/Item/Contact/ContactEdition.qml +++ b/Linphone/view/Item/Contact/ContactEdition.qml @@ -147,7 +147,7 @@ ColumnLayout { TextInput { label: modelData.label onEditingFinished: { - if (text.length != 0) mainItem.contact.core.setAddressAt(index, text) + if (text.length != 0) mainItem.contact.core.setAddressAt(index, qsTr("Address SIP"), text) } initialText: modelData.address backgroundColor: DefaultStyle.grey_0 diff --git a/Linphone/view/Item/Contact/ContactsList.qml b/Linphone/view/Item/Contact/ContactsList.qml index 08db25548..433cd9e87 100644 --- a/Linphone/view/Item/Contact/ContactsList.qml +++ b/Linphone/view/Item/Contact/ContactsList.qml @@ -15,6 +15,8 @@ ListView { property bool hoverEnabled: true property bool contactMenuVisible: true property bool initialHeadersVisible: true + property bool displayNameCapitalization: true + property FriendGui selectedContact: model.getAt(currentIndex) || null @@ -25,6 +27,7 @@ ListView { signal contactSelected(var contact) signal contactStarredChanged() + signal contactDeletionRequested(FriendGui contact) onContactStarredChanged: model.forceUpdate() @@ -45,6 +48,7 @@ ListView { } Text { id: initial + visible: mainItem.model.sourceFlags != LinphoneEnums.MagicSearchSource.All anchors.verticalCenter: parent.verticalCenter verticalAlignment: Text.AlignVCenter Layout.preferredWidth: 20 * DefaultStyle.dp @@ -72,7 +76,7 @@ ListView { Text { text: itemDelegate.displayName font.pixelSize: 14 * DefaultStyle.dp - font.capitalization: Font.Capitalize + font.capitalization: mainItem.displayNameCapitalization ? Font.Capitalize : Font.MixedCase } Item { Layout.fillWidth: true @@ -137,7 +141,7 @@ ListView { } } onClicked: { - modelData.core.remove() + mainItem.contactDeletionRequested(modelData) friendPopup.close() } } diff --git a/Linphone/view/Item/PopupButton.qml b/Linphone/view/Item/PopupButton.qml index 63540ca56..19d49cc24 100644 --- a/Linphone/view/Item/PopupButton.qml +++ b/Linphone/view/Item/PopupButton.qml @@ -1,8 +1,8 @@ -import QtQuick 2.7 +import QtQuick import QtQuick.Controls 2.2 as Control import QtQuick.Effects import Linphone - + Button { id: mainItem property alias popup: popup @@ -39,6 +39,15 @@ Button { y: mainItem.height closePolicy: Popup.CloseOnPressOutsideParent |Popup.CloseOnPressOutside + onAboutToShow: { + var coord = mapToGlobal(mainItem.x, mainItem.y) + if (coord.y + popup.height >= mainApplicationWindow.height) { + y = -popup.height + } else { + y = mainItem.height + } + } + padding: 20 * DefaultStyle.dp background: Item { diff --git a/Linphone/view/Item/RoundedBackgroundControl.qml b/Linphone/view/Item/RoundedBackgroundControl.qml index 159b3e2d6..83f774ffa 100644 --- a/Linphone/view/Item/RoundedBackgroundControl.qml +++ b/Linphone/view/Item/RoundedBackgroundControl.qml @@ -10,7 +10,9 @@ Control.Control { leftPadding: 10 * DefaultStyle.dp rightPadding: 10 * DefaultStyle.dp background: Rectangle { - anchors.fill: parent + // anchors.fill: parent + width: parent.width + height: parent.height radius: 15 * DefaultStyle.dp color: mainItem.backgroundColor ? mainItem.backgroundColor : DefaultStyle.grey_0 } diff --git a/Linphone/view/Item/Text.qml b/Linphone/view/Item/Text.qml index 0b0b60870..69d41c785 100644 --- a/Linphone/view/Item/Text.qml +++ b/Linphone/view/Item/Text.qml @@ -3,11 +3,9 @@ import QtQuick.Layouts import Linphone Quick.Text { + id: mainItem property double scaleLettersFactor: 1. width: txtMeter.advanceWidth - id: innerItem - // Layout.preferredWidth: mainItem.width - // width: mainItem.width font { family: DefaultStyle.defaultFont pixelSize: 10 * DefaultStyle.dp @@ -18,12 +16,12 @@ Quick.Text { elide: Quick.Text.ElideRight transformOrigin: Quick.Item.TopLeft transform: Quick.Scale { - yScale: scaleLettersFactor//mainItem.scaleLettersFactor + yScale: scaleLettersFactor } Quick.TextMetrics { id: txtMeter - text: innerItem.text - font: innerItem.font + text: mainItem.text + font: mainItem.font } } \ No newline at end of file diff --git a/Linphone/view/Page/Main/CallPage.qml b/Linphone/view/Page/Main/CallPage.qml index 17de9d078..58564db59 100644 --- a/Linphone/view/Page/Main/CallPage.qml +++ b/Linphone/view/Page/Main/CallPage.qml @@ -156,23 +156,13 @@ AbstractMainPage { clip: true Layout.fillWidth: true Layout.fillHeight: true - model: CallHistoryProxy{ + model: CallHistoryProxy { filterText: searchBar.text } currentIndex: -1 spacing: 10 * DefaultStyle.dp - highlightMoveDuration: 10 - highlightMoveVelocity: -1 - // highlightFollowsCurrentItem: true - highlight: Rectangle { - x: historyListView.x - width: historyListView.width - height: historyListView.height - color: DefaultStyle.main2_100 - y: historyListView.currentItem? historyListView.currentItem.y : 0 - } delegate: Item { width:historyListView.width @@ -258,6 +248,7 @@ AbstractMainPage { implicitHeight: 24 * DefaultStyle.dp Layout.rightMargin: 5 * DefaultStyle.dp padding: 0 + property var callObj background: Item { visible: false } @@ -271,7 +262,7 @@ AbstractMainPage { var addr = modelData.core.remoteAddress var addressEnd = "@sip.linphone.org" if (!addr.endsWith(addressEnd)) addr += addressEnd - UtilsCpp.createCall(addr) + callObj = UtilsCpp.createCall(addr) } } } @@ -284,17 +275,22 @@ AbstractMainPage { color: DefaultStyle.main2_500main visible: parent.containsMouse } + Rectangle { + anchors.fill: parent + visible: historyListView.currentIndex === model.index + color: DefaultStyle.main2_100 + } onPressed: { historyListView.currentIndex = model.index } } } onCurrentIndexChanged: { + positionViewAtIndex(currentIndex, ListView.Visible) mainItem.selectedRowHistoryGui = model.getAt(currentIndex) } onVisibleChanged: { if (!visible) currentIndex = -1 - console.log("visible", visible) } Connections { @@ -352,11 +348,12 @@ AbstractMainPage { // Layout.rightMargin: listStackView.sideMargin groupCallVisible: true searchBarColor: DefaultStyle.grey_100 + property var callObj onCallButtonPressed: (address) => { var addressEnd = "@sip.linphone.org" if (!address.endsWith(addressEnd)) address += addressEnd - UtilsCpp.createCall(address) + callObj = UtilsCpp.createCall(address) // var window = UtilsCpp.getCallsWindow() } } @@ -416,7 +413,6 @@ AbstractMainPage { detailOptions.close() friendGui.core.givenName = UtilsCpp.getGivenNameFromFullName(contactDetail.contactName) friendGui.core.familyName = UtilsCpp.getFamilyNameFromFullName(contactDetail.contactName) - friendGui.core.appendAddress(contactDetail.contactAddress) friendGui.core.defaultAddress = contactDetail.contactAddress rightPanelStackView.push(editContact, {"contact": friendGui, "title": qsTr("Ajouter contact"), "saveButtonText": qsTr("Créer")}) } @@ -452,7 +448,10 @@ AbstractMainPage { } Connections { target: deleteForUserPopup - onAccepted: detailListView.model.removeEntriesWithFilter() + onAccepted: { + detailListView.model.removeEntriesWithFilter() + mainItem.listViewUpdated() + } } onClicked: { detailOptions.close() @@ -461,34 +460,32 @@ AbstractMainPage { } } } - detailContent: Control.Control { + detailContent: RoundedBackgroundControl { id: detailControl - // Layout.fillWidth: true - Layout.fillHeight: true Layout.preferredWidth: 360 * DefaultStyle.dp + implicitHeight: 430 * DefaultStyle.dp + topPadding + bottomPadding background: Rectangle { id: detailListBackground + width: parent.width + height: detailListView.height color: DefaultStyle.grey_0 radius: 15 * DefaultStyle.dp - anchors.fill: detailListView } - contentItem: ListView { + ListView { id: detailListView width: parent.width - height: Math.min(detailControl.height, contentHeight) + height: Math.min(detailControl.implicitHeight, contentHeight) + spacing: 20 * DefaultStyle.dp clip: true - onCountChanged: { - mainItem.listViewUpdated() - } - model: CallHistoryProxy { filterText: mainItem.selectedRowHistoryGui ? mainItem.selectedRowHistoryGui.core.remoteAddress : "" } + delegate: Item { width:detailListView.width height: 56 * DefaultStyle.dp @@ -556,6 +553,9 @@ AbstractMainPage { } } } + Item{ + Layout.fillHeight: true + } } } Component { diff --git a/Linphone/view/Page/Main/ContactPage.qml b/Linphone/view/Page/Main/ContactPage.qml index fee4c48e2..1e315262c 100644 --- a/Linphone/view/Page/Main/ContactPage.qml +++ b/Linphone/view/Page/Main/ContactPage.qml @@ -32,6 +32,13 @@ AbstractMainPage { listStackView.replace(newCallItem) } + Dialog { + id: dialog + property var contact + text: (contact ? contact.core.displayName : "Contact") + " is about to be deleted. Do you want to continue ?" + onAccepted: contact.core.remove() + } + leftPanelContent: ColumnLayout { id: leftPanel Layout.fillWidth: true @@ -164,6 +171,10 @@ AbstractMainPage { } mainItem.selectedContact = selectedContact } + onContactDeletionRequested: (contact) => { + dialog.contact = contact + dialog.open() + } } } ColumnLayout { @@ -205,6 +216,10 @@ AbstractMainPage { } mainItem.selectedContact = selectedContact } + onContactDeletionRequested: (contact) => { + dialog.contact = contact + dialog.open() + } } } } @@ -274,7 +289,7 @@ AbstractMainPage { height: contentHeight clip: true model: VariantList { - model: mainItem.selectedContact ? mainItem.selectedContact.core.allAdresses : [] + model: mainItem.selectedContact ? mainItem.selectedContact.core.allAddresses : [] } // model: contactDetail.selectedContact && contactDetail.selectedContact.core.addresses delegate: Item { @@ -317,6 +332,7 @@ AbstractMainPage { background: Item{} Layout.preferredWidth: 24 * DefaultStyle.dp Layout.preferredHeight: 24 * DefaultStyle.dp + property var callObj contentItem: Image { anchors.fill: parent source: AppIcons.phone @@ -324,7 +340,7 @@ AbstractMainPage { height: 24 * DefaultStyle.dp } onClicked: { - UtilsCpp.createCall(modelData.address) + callObj = UtilsCpp.createCall(modelData.address) } } } @@ -550,7 +566,11 @@ AbstractMainPage { iconSource: AppIcons.trashCan color: DefaultStyle.danger_500main text: qsTr("Delete this contact") - onClicked: mainItem.selectedContact.core.remove() + onClicked: { + // mainItem.selectedContact.core.remove() + dialog.contact = mainItem.selectedContact + dialog.open() + } } } } diff --git a/Linphone/view/Prototype/CallPrototype.qml b/Linphone/view/Prototype/CallPrototype.qml index bef277406..15624b2b0 100644 --- a/Linphone/view/Prototype/CallPrototype.qml +++ b/Linphone/view/Prototype/CallPrototype.qml @@ -136,10 +136,10 @@ Window{ Button{ text: 'Call' onClicked: { - var address = usernameToCall.text + "@sip.linphone.org" - console.log("Calling "+address) - mainItem.callVarObject = UtilsCpp.createCall(address) - proto.component1 = comp + var address = usernameToCall.text + "@sip.linphone.org" + console.log("Calling "+address) + mainItem.callVarObject = UtilsCpp.createCall(address) + proto.component1 = comp } } }