From 13c74be26e84ebd85a3b84c98c6dad5fbf132a42 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Fri, 19 May 2017 14:46:49 +0200 Subject: [PATCH] feat(ui/views/App/Calls/ConferenceManager): in progress --- .../src/components/calls/CallsListModel.cpp | 7 +++++-- .../components/conference/ConferenceAddModel.cpp | 7 +++++-- .../conference/ConferenceHelperModel.cpp | 14 ++++++++++++++ .../conference/ConferenceHelperModel.hpp | 8 +++++++- .../Common/Form/Fields/ScrollableListViewField.qml | 10 ++++++++++ .../ui/views/App/Calls/ConferenceManager.qml | 12 ++++++++++++ submodules/linphone | 2 +- 7 files changed, 54 insertions(+), 6 deletions(-) diff --git a/linphone-desktop/src/components/calls/CallsListModel.cpp b/linphone-desktop/src/components/calls/CallsListModel.cpp index dbecc0dc2..90435feb1 100644 --- a/linphone-desktop/src/components/calls/CallsListModel.cpp +++ b/linphone-desktop/src/components/calls/CallsListModel.cpp @@ -25,6 +25,7 @@ #include "../../app/App.hpp" #include "../../Utils.hpp" +#include "../conference/ConferenceHelperModel.hpp" #include "../core/CoreManager.hpp" #include "CallsListModel.hpp" @@ -195,7 +196,7 @@ void CallsListModel::removeCall (const shared_ptr &call) { try { callModel = &call->getData("call-model"); } catch (const out_of_range &) { - // Can be a bug. Or the call model not exists because the linphone call state + // The call model not exists because the linphone call state // `CallStateIncomingReceived`/`CallStateOutgoingInit` was not notified. qWarning() << QStringLiteral("Unable to found linphone call:") << call.get(); return; @@ -209,8 +210,10 @@ void CallsListModel::removeCall (const shared_ptr &call) { if (index == -1 || !removeRow(index)) qWarning() << QStringLiteral("Unable to remove call:") << callModel; - if (mList.empty()) + if (mList.empty() && ConferenceHelperModel::getInstancesNumber() == 0) { + qInfo() << QStringLiteral("Last call terminated, close calls window."); App::getInstance()->getCallsWindow()->close(); + } } ); } diff --git a/linphone-desktop/src/components/conference/ConferenceAddModel.cpp b/linphone-desktop/src/components/conference/ConferenceAddModel.cpp index e343ca864..b257b9513 100644 --- a/linphone-desktop/src/components/conference/ConferenceAddModel.cpp +++ b/linphone-desktop/src/components/conference/ConferenceAddModel.cpp @@ -114,8 +114,11 @@ bool ConferenceHelperModel::ConferenceAddModel::removeFromConference (const QStr void ConferenceHelperModel::ConferenceAddModel::update () { list > linphoneAddresses; - for (const auto &map : mRefs) - linphoneAddresses.push_back(map->value("__linphoneAddress").value > ()); + for (const auto &map : mRefs) { + shared_ptr linphoneAddress = map->value("__linphoneAddress").value >(); + Q_ASSERT(linphoneAddress != nullptr); + linphoneAddresses.push_back(linphoneAddress); + } mConferenceHelperModel->mConference->inviteParticipants( linphoneAddresses, diff --git a/linphone-desktop/src/components/conference/ConferenceHelperModel.cpp b/linphone-desktop/src/components/conference/ConferenceHelperModel.cpp index 4ca7f49fe..d98a8b617 100644 --- a/linphone-desktop/src/components/conference/ConferenceHelperModel.cpp +++ b/linphone-desktop/src/components/conference/ConferenceHelperModel.cpp @@ -31,6 +31,8 @@ using namespace std; // ============================================================================= +int ConferenceHelperModel::mInstancesNumber = 0; + ConferenceHelperModel::ConferenceHelperModel (QObject *parent) : QSortFilterProxyModel(parent) { shared_ptr core = CoreManager::getInstance()->getCore(); @@ -42,6 +44,18 @@ ConferenceHelperModel::ConferenceHelperModel (QObject *parent) : QSortFilterProx App::getInstance()->getEngine()->setObjectOwnership(mConferenceAddModel, QQmlEngine::CppOwnership); setSourceModel(new SipAddressesProxyModel(this)); + + mInstancesNumber++; +} + +ConferenceHelperModel::~ConferenceHelperModel () { + mInstancesNumber--; + Q_ASSERT(mInstancesNumber >= 0); + + if (mInstancesNumber == 0 && CoreManager::getInstance()->getCallsListModel()->rowCount() == 0) { + qInfo() << QStringLiteral("Conference terminated and no calls, close calls window."); + App::getInstance()->getCallsWindow()->close(); + } } QHash ConferenceHelperModel::roleNames () const { diff --git a/linphone-desktop/src/components/conference/ConferenceHelperModel.hpp b/linphone-desktop/src/components/conference/ConferenceHelperModel.hpp index a5fc37461..77827cd3e 100644 --- a/linphone-desktop/src/components/conference/ConferenceHelperModel.hpp +++ b/linphone-desktop/src/components/conference/ConferenceHelperModel.hpp @@ -45,10 +45,14 @@ public: class ConferenceAddModel; ConferenceHelperModel (QObject *parent = Q_NULLPTR); - ~ConferenceHelperModel () = default; + ~ConferenceHelperModel (); QHash roleNames () const override; + static int getInstancesNumber () { + return mInstancesNumber; + } + Q_INVOKABLE void setFilter (const QString &pattern); protected: @@ -62,6 +66,8 @@ private: ConferenceAddModel *mConferenceAddModel; std::shared_ptr mConference; + + static int mInstancesNumber; }; #endif // CONFERENCE_HELPER_MODEL_H_ diff --git a/linphone-desktop/ui/modules/Common/Form/Fields/ScrollableListViewField.qml b/linphone-desktop/ui/modules/Common/Form/Fields/ScrollableListViewField.qml index 9d0827853..0714aa714 100644 --- a/linphone-desktop/ui/modules/Common/Form/Fields/ScrollableListViewField.qml +++ b/linphone-desktop/ui/modules/Common/Form/Fields/ScrollableListViewField.qml @@ -8,6 +8,8 @@ import Common.Styles 1.0 Rectangle { id: field + property bool readOnly: false + default property alias _content: content.data color: TextFieldStyle.background.color.normal @@ -30,4 +32,12 @@ Rectangle { color: 'transparent' radius: field.radius } + + MouseArea { + anchors.fill: parent + hoverEnabled: true + visible: field.readOnly + + onWheel: wheel.accepted = true + } } diff --git a/linphone-desktop/ui/views/App/Calls/ConferenceManager.qml b/linphone-desktop/ui/views/App/Calls/ConferenceManager.qml index 707716158..8366dbb99 100644 --- a/linphone-desktop/ui/views/App/Calls/ConferenceManager.qml +++ b/linphone-desktop/ui/views/App/Calls/ConferenceManager.qml @@ -9,6 +9,11 @@ import App.Styles 1.0 // ============================================================================= DialogPlus { + id: conferenceManager + + readonly property int maxParticipants: 10 + readonly property int minParticipants: 2 + buttons: [ TextButtonA { text: qsTr('cancel') @@ -16,6 +21,7 @@ DialogPlus { onClicked: exit(0) }, TextButtonB { + enabled: toAddView.count >= conferenceManager.minParticipants text: qsTr('confirm') onClicked: { @@ -68,6 +74,8 @@ DialogPlus { Layout.fillHeight: true Layout.fillWidth: true + readOnly: toAddView.count >= conferenceManager.maxParticipants + SipAddressesView { anchors.fill: parent @@ -113,6 +121,8 @@ DialogPlus { Layout.topMargin: filter.height + ConferenceManagerStyle.columns.selector.spacing SipAddressesView { + id: toAddView + anchors.fill: parent actions: [{ @@ -123,6 +133,8 @@ DialogPlus { }] model: conferenceHelperModel.toAdd + + onEntryClicked: actions[0].handler(entry) } } } diff --git a/submodules/linphone b/submodules/linphone index 2b6bcbc7f..38638e543 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 2b6bcbc7f46423d17c18f2e2eafe52ac245e337f +Subproject commit 38638e543d1641ff637f32c4424f61684c861cea