diff --git a/Linphone/core/conference/ConferenceInfoCore.cpp b/Linphone/core/conference/ConferenceInfoCore.cpp index e168a2aee..21d856889 100644 --- a/Linphone/core/conference/ConferenceInfoCore.cpp +++ b/Linphone/core/conference/ConferenceInfoCore.cpp @@ -205,9 +205,10 @@ void ConferenceInfoCore::setSelf(QSharedPointer me) { setConferenceInfoState(infoState); if (state == LinphoneEnums::ConferenceSchedulerState::Ready) { setUri(uri); - mConfInfoModelConnection->invokeToModel([this, uri] { - CoreModel::getInstance()->conferenceInfoCreated( - mConferenceInfoModel->getConferenceInfo()); + mConfInfoModelConnection->invokeToModel([this, uri, infoState] { + if (infoState == LinphoneEnums::ConferenceInfoState::New) + emit CoreModel::getInstance()->conferenceInfoCreated( + mConferenceInfoModel->getConferenceInfo()); }); } setConferenceSchedulerState(state); diff --git a/Linphone/core/conference/ConferenceInfoList.cpp b/Linphone/core/conference/ConferenceInfoList.cpp index dfe9dcd77..fd32b17f6 100644 --- a/Linphone/core/conference/ConferenceInfoList.cpp +++ b/Linphone/core/conference/ConferenceInfoList.cpp @@ -62,12 +62,12 @@ void ConferenceInfoList::setSelf(QSharedPointer me) { defaultAccount->getConferenceInformationList(); items->push_back(nullptr); // Add Dummy conference for today for (auto conferenceInfo : conferenceInfos) { - auto confInfoCore = build(conferenceInfo); - // Cancelled conference organized ourself me must be hidden if (conferenceInfo->getState() == linphone::ConferenceInfo::State::Cancelled) { auto myAddress = defaultAccount->getContactAddress(); if (!myAddress || myAddress->weakEqual(conferenceInfo->getOrganizer())) continue; } + auto confInfoCore = build(conferenceInfo); + // Cancelled conference organized ourself me must be hidden if (confInfoCore) { qDebug() << log().arg("Add conf") << confInfoCore->getSubject() << "with state" << confInfoCore->getConferenceInfoState(); @@ -85,8 +85,6 @@ void ConferenceInfoList::setSelf(QSharedPointer me) { // TODO : uncomment when linphone conference scheduler updated // and model returns the scheduler conferenceInfo uri index = findConfInfoIndexByUri(mLastConfInfoInserted->getUri()); - // int index2; - // get(mLastConfInfoInserted.get(), &index2); if (index != -1) setCurrentDateIndex(index); else setCurrentDateIndex(mHaveCurrentDate ? currentDateIndex : currentDateIndex + 1); mLastConfInfoInserted = nullptr; @@ -113,7 +111,6 @@ void ConferenceInfoList::setSelf(QSharedPointer me) { mCoreModelConnection->makeConnectToModel(&CoreModel::defaultAccountChanged, connectModel); connectModel(); - mCoreModelConnection->makeConnectToModel(&CoreModel::conferenceInfoReceived, &ConferenceInfoList::lUpdate); mCoreModelConnection->makeConnectToModel( &CoreModel::conferenceInfoCreated, [this](const std::shared_ptr &confInfo) { auto confInfoCore = ConferenceInfoCore::create(confInfo); @@ -132,8 +129,8 @@ void ConferenceInfoList::setSelf(QSharedPointer me) { &CoreModel::conferenceInfoReceived, [this](const std::shared_ptr &core, const std::shared_ptr &conferenceInfo) { - lDebug() << log().arg("conference info received") << conferenceInfo->getOrganizer()->asStringUriOnly() - << conferenceInfo->getSubject(); + lDebug() << log().arg("conference info received") << conferenceInfo->getSubject(); + emit lUpdate(); }); emit lUpdate(); } @@ -171,19 +168,18 @@ int ConferenceInfoList::getCurrentDateIndex() const { } void ConferenceInfoList::setCurrentDateIndex(int index) { - if (mCurrentDateIndex != index) { - mCurrentDateIndex = index; - emit currentDateIndexChanged(); - } + mCurrentDateIndex = index; + emit currentDateIndexChanged(index); } int ConferenceInfoList::findConfInfoIndexByUri(const QString &uri) { - auto items = getSharedList(); - for (int i = 0; i < items.size(); ++i) { - if (!items[i]) continue; - if (items[i]->getUri() == uri) return i; - } - return -1; + auto confInList = std::find_if(mList.begin(), mList.end(), [uri](const QSharedPointer &item) { + auto isConfInfo = item.objectCast(); + if (!isConfInfo) return false; + return isConfInfo->getUri() == uri; + }); + + return (confInList == mList.end() ? -1 : std::distance(mList.begin(), confInList)); } QSharedPointer diff --git a/Linphone/core/conference/ConferenceInfoList.hpp b/Linphone/core/conference/ConferenceInfoList.hpp index 7bc727a0b..252f60ecf 100644 --- a/Linphone/core/conference/ConferenceInfoList.hpp +++ b/Linphone/core/conference/ConferenceInfoList.hpp @@ -61,7 +61,7 @@ signals: void lUpdate(); void addCurrentDateChanged(); void haveCurrentDateChanged(); - void currentDateIndexChanged(); + void currentDateIndexChanged(int index); private: QSharedPointer> mCoreModelConnection; diff --git a/Linphone/core/conference/ConferenceInfoProxy.cpp b/Linphone/core/conference/ConferenceInfoProxy.cpp index b7f8063b4..c5f080096 100644 --- a/Linphone/core/conference/ConferenceInfoProxy.cpp +++ b/Linphone/core/conference/ConferenceInfoProxy.cpp @@ -57,10 +57,8 @@ int ConferenceInfoProxy::getCurrentDateIndex() const { void ConferenceInfoProxy::updateCurrentDateIndex() { int newIndex = mapFromSource(sourceModel()->index(mList->getCurrentDateIndex(), 0)).row(); - if (mCurrentDateIndex != newIndex) { - mCurrentDateIndex = newIndex; - emit currentDateIndexChanged(); - } + mCurrentDateIndex = newIndex; + emit currentDateIndexChanged(newIndex); } bool ConferenceInfoProxy::SortFilterList::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { diff --git a/Linphone/core/conference/ConferenceInfoProxy.hpp b/Linphone/core/conference/ConferenceInfoProxy.hpp index d9e6acb67..95117db9a 100644 --- a/Linphone/core/conference/ConferenceInfoProxy.hpp +++ b/Linphone/core/conference/ConferenceInfoProxy.hpp @@ -48,7 +48,7 @@ public: signals: void haveCurrentDateChanged(); - void currentDateIndexChanged(); + void currentDateIndexChanged(int index); private: QSharedPointer mList; diff --git a/Linphone/model/conference/ConferenceInfoModel.cpp b/Linphone/model/conference/ConferenceInfoModel.cpp index 374bee4fc..154c57fb3 100644 --- a/Linphone/model/conference/ConferenceInfoModel.cpp +++ b/Linphone/model/conference/ConferenceInfoModel.cpp @@ -41,10 +41,6 @@ ConferenceInfoModel::~ConferenceInfoModel() { if (mConferenceSchedulerModel) mConferenceSchedulerModel->removeListener(); } -void ConferenceInfoModel::createConferenceScheduler() { - mustBeInLinphoneThread(getClassName() + "::createConferenceScheduler()"); -} - std::shared_ptr ConferenceInfoModel::getConferenceInfo() const { return mConferenceInfo; } @@ -64,6 +60,8 @@ void ConferenceInfoModel::setConferenceScheduler(const std::shared_ptrgetConferenceInfo()) + mConferenceInfo = mConferenceSchedulerModel->getConferenceInfo()->clone(); if (state == linphone::ConferenceScheduler::State::Ready && mInviteEnabled) { auto params = CoreModel::getInstance()->getCore()->createDefaultChatRoomParams(); // TODO : wait for new sdk api to send the invitations again diff --git a/Linphone/model/conference/ConferenceInfoModel.hpp b/Linphone/model/conference/ConferenceInfoModel.hpp index 34db17b63..cbba1f409 100644 --- a/Linphone/model/conference/ConferenceInfoModel.hpp +++ b/Linphone/model/conference/ConferenceInfoModel.hpp @@ -34,8 +34,6 @@ public: ConferenceInfoModel(const std::shared_ptr &conferenceInfo, QObject *parent = nullptr); ~ConferenceInfoModel(); - void createConferenceScheduler(); - std::shared_ptr getConferenceInfo() const; std::shared_ptr getConferenceScheduler() const; diff --git a/Linphone/model/conference/ConferenceSchedulerModel.cpp b/Linphone/model/conference/ConferenceSchedulerModel.cpp index 5182f5164..e51c018e2 100644 --- a/Linphone/model/conference/ConferenceSchedulerModel.cpp +++ b/Linphone/model/conference/ConferenceSchedulerModel.cpp @@ -52,6 +52,10 @@ linphone::ConferenceScheduler::State ConferenceSchedulerModel::getState() const return mState; } +std::shared_ptr ConferenceSchedulerModel::getConferenceInfo() const { + return mMonitor->getInfo(); +} + void ConferenceSchedulerModel::setInfo(const std::shared_ptr &confInfo) { mustBeInLinphoneThread(log().arg(Q_FUNC_INFO)); mMonitor->setInfo(confInfo); diff --git a/Linphone/model/conference/ConferenceSchedulerModel.hpp b/Linphone/model/conference/ConferenceSchedulerModel.hpp index 2b6047ae1..1a379ce75 100644 --- a/Linphone/model/conference/ConferenceSchedulerModel.hpp +++ b/Linphone/model/conference/ConferenceSchedulerModel.hpp @@ -40,6 +40,7 @@ public: QString getUri(); linphone::ConferenceScheduler::State getState() const; + std::shared_ptr getConferenceInfo() const; void setInfo(const std::shared_ptr &confInfo); void cancelConference(const std::shared_ptr &confInfo); diff --git a/Linphone/view/Control/Display/Meeting/MeetingListView.qml b/Linphone/view/Control/Display/Meeting/MeetingListView.qml index 381ee4ab1..bda2680cb 100644 --- a/Linphone/view/Control/Display/Meeting/MeetingListView.qml +++ b/Linphone/view/Control/Display/Meeting/MeetingListView.qml @@ -16,8 +16,6 @@ ListView { property var delegateButtons property ConferenceInfoGui selectedConference: model && currentIndex != -1 ? model.getAt(currentIndex) : null - signal conferenceSelected(var contact) - spacing: 8 * DefaultStyle.dp currentIndex: confInfoProxy.currentDateIndex // using highlight doesn't center, take time before moving and don't work for not visible item (like not loaded) @@ -26,9 +24,15 @@ ListView { onCountChanged: { selectedConference = model && currentIndex != -1 && currentIndex < model.count ? model.getAt(currentIndex) : null } + Connections { + target: confInfoProxy + function onCurrentDateIndexChanged(index) { + mainItem.currentIndex = index + } + } onCurrentIndexChanged: { selectedConference = model.getAt(currentIndex) || null - positionViewAtIndex(currentIndex, ListView.Center) + if (currentIndex != -1) positionViewAtIndex(currentIndex, ListView.Contain) } onVisibleChanged: if( visible) { mainItem.positionViewAtIndex(currentIndex, ListView.Center)// First approximative move @@ -214,23 +218,10 @@ ListView { visible: itemDelegate.haveModel onClicked: { mainItem.currentIndex = index - mainItem.conferenceSelected($modelData) itemDelegate.forceActiveFocus() } } } } - - // MouseArea { - // id: confArea - // hoverEnabled: mainItem.hoverEnabled - // visible: !dateDay.visible && itemDelegate.haveModel - // anchors.fill: parent - // cursorShape: Qt.PointingHandCursor - // onClicked: { - // mainItem.currentIndex = index - // mainItem.conferenceSelected($modelData) - // } - // } } }