diff --git a/linphone-app/src/app/proxyModel/SortFilterAbstractProxyModel.hpp b/linphone-app/src/app/proxyModel/SortFilterAbstractProxyModel.hpp index 6e51a6326..28d228823 100644 --- a/linphone-app/src/app/proxyModel/SortFilterAbstractProxyModel.hpp +++ b/linphone-app/src/app/proxyModel/SortFilterAbstractProxyModel.hpp @@ -39,6 +39,14 @@ public: void add(QSharedPointer x){ qobject_cast(sourceModel())->add(x); } + template + void removeShared(QSharedPointer x){ + qobject_cast(sourceModel())->remove(x); + } + template + void remove(X x){ + qobject_cast(sourceModel())->remove(x); + } }; diff --git a/linphone-app/src/components/conferenceInfo/ConferenceInfoMapModel.cpp b/linphone-app/src/components/conferenceInfo/ConferenceInfoMapModel.cpp index febd0b153..0c5f9c5b3 100644 --- a/linphone-app/src/components/conferenceInfo/ConferenceInfoMapModel.cpp +++ b/linphone-app/src/components/conferenceInfo/ConferenceInfoMapModel.cpp @@ -40,9 +40,16 @@ ConferenceInfoMapModel::ConferenceInfoMapModel (QObject *parent) : ProxyAbstractMapModel*>(parent) { auto conferenceInfos = CoreManager::getInstance()->getCore()->getConferenceInformationList(); - auto me = CoreManager::getInstance()->getCore()->getDefaultAccount()->getParams()->getIdentityAddress(); for(auto conferenceInfo : conferenceInfos){ - std::list> participants = conferenceInfo->getParticipants(); + add(conferenceInfo, false); + } +} + +// ----------------------------------------------------------------------------- + +void ConferenceInfoMapModel::add(const std::shared_ptr & conferenceInfo, const bool& sendEvents){ + auto me = CoreManager::getInstance()->getCore()->getDefaultAccount()->getParams()->getIdentityAddress(); + std::list> participants = conferenceInfo->getParticipants(); bool haveMe = conferenceInfo->getOrganizer()->weakEqual(me); if(!haveMe) haveMe = (std::find_if(participants.begin(), participants.end(), [me](const std::shared_ptr& address){ @@ -54,11 +61,19 @@ ConferenceInfoMapModel::ConferenceInfoMapModel (QObject *parent) : ProxyAbstract if( !mMappedList.contains(conferenceDateTimeSystem)){ auto proxy = new ConferenceInfoProxyListModel(this); connect(this, &ConferenceInfoMapModel::filterTypeChanged, proxy, &ConferenceInfoProxyListModel::setFilterType); + if(sendEvents){ + int row = 0; + auto it = mMappedList.begin(); + while(it != mMappedList.end() && it.key() < conferenceDateTimeSystem) + ++it; + row = std::distance(it,mMappedList.begin()); + beginInsertColumns(QModelIndex(), row, row); + } mMappedList[conferenceDateTimeSystem] = proxy; + if(sendEvents) + endInsertColumns(); } mMappedList[conferenceDateTimeSystem]->add(conferenceInfoModel); + connect(conferenceInfoModel.get(), &ConferenceInfoModel::removed, qobject_cast(mMappedList[conferenceDateTimeSystem]), &ConferenceInfoProxyListModel::onRemoved); } - } -} - -// ----------------------------------------------------------------------------- \ No newline at end of file +} \ No newline at end of file diff --git a/linphone-app/src/components/conferenceInfo/ConferenceInfoMapModel.hpp b/linphone-app/src/components/conferenceInfo/ConferenceInfoMapModel.hpp index cf53127cf..fef9be678 100644 --- a/linphone-app/src/components/conferenceInfo/ConferenceInfoMapModel.hpp +++ b/linphone-app/src/components/conferenceInfo/ConferenceInfoMapModel.hpp @@ -35,6 +35,7 @@ class ConferenceInfoMapModel : public ProxyAbstractMapModel & conferenceInfo, const bool& sendEvents = true); signals: void filterTypeChanged(int filterType); diff --git a/linphone-app/src/components/conferenceInfo/ConferenceInfoModel.cpp b/linphone-app/src/components/conferenceInfo/ConferenceInfoModel.cpp index 50a323da3..966b6ab9a 100644 --- a/linphone-app/src/components/conferenceInfo/ConferenceInfoModel.cpp +++ b/linphone-app/src/components/conferenceInfo/ConferenceInfoModel.cpp @@ -107,6 +107,10 @@ std::shared_ptr ConferenceInfoModel::getConferenceInfo return mConferenceInfo; } +std::shared_ptr ConferenceInfoModel::findConferenceInfo(const std::shared_ptr & conferenceInfo){ + return CoreManager::getInstance()->getCore()->findConferenceInformationFromUri(conferenceInfo->getUri()->clone()); +} + //------------------------------------------------------------------------------------------------ @@ -263,6 +267,13 @@ void ConferenceInfoModel::createConference(const int& securityLevel, const int& mConferenceScheduler->getConferenceScheduler()->setInfo(mConferenceInfo); } +void ConferenceInfoModel::deleteConferenceInfo(){ + if(mConferenceInfo) { + CoreManager::getInstance()->getCore()->deleteConferenceInformation(mConferenceInfo); + emit removed(); + } +} + //------------------------------------------------------------------------------------------------- void ConferenceInfoModel::onStateChanged(linphone::ConferenceSchedulerState state){ diff --git a/linphone-app/src/components/conferenceInfo/ConferenceInfoModel.hpp b/linphone-app/src/components/conferenceInfo/ConferenceInfoModel.hpp index 8cb82fd0f..5312f4cde 100644 --- a/linphone-app/src/components/conferenceInfo/ConferenceInfoModel.hpp +++ b/linphone-app/src/components/conferenceInfo/ConferenceInfoModel.hpp @@ -52,6 +52,7 @@ public: ConferenceInfoModel (std::shared_ptr conferenceInfo, QObject * parent = nullptr); ~ConferenceInfoModel (); std::shared_ptr getConferenceInfo(); + static std::shared_ptr findConferenceInfo(const std::shared_ptr & conferenceInfo); //------------------------------- @@ -82,6 +83,7 @@ public: // Tools Q_INVOKABLE void createConference(const int& securityLevel, const int& inviteMode); + Q_INVOKABLE void deleteConferenceInfo();// Remove completly this conference info from DB // SCHEDULER @@ -103,6 +105,7 @@ signals: void conferenceCreated(); void conferenceCreationFailed(); void invitationsSent(); + void removed(); private: std::shared_ptr mConferenceInfo; diff --git a/linphone-app/src/components/conferenceInfo/ConferenceInfoProxyListModel.cpp b/linphone-app/src/components/conferenceInfo/ConferenceInfoProxyListModel.cpp index a0e6609ed..29600ca95 100644 --- a/linphone-app/src/components/conferenceInfo/ConferenceInfoProxyListModel.cpp +++ b/linphone-app/src/components/conferenceInfo/ConferenceInfoProxyListModel.cpp @@ -63,3 +63,8 @@ bool ConferenceInfoProxyListModel::lessThan (const QModelIndex &left, const QMod const ConferenceInfoModel* b = sourceModel()->data(right).value(); return a->getDateTimeUtc() < b->getDateTimeUtc(); } + +void ConferenceInfoProxyListModel::onRemoved(){ + auto model = qobject_cast(sender()); + remove(model); +} \ No newline at end of file diff --git a/linphone-app/src/components/conferenceInfo/ConferenceInfoProxyListModel.hpp b/linphone-app/src/components/conferenceInfo/ConferenceInfoProxyListModel.hpp index e204ab8c6..748b123c6 100644 --- a/linphone-app/src/components/conferenceInfo/ConferenceInfoProxyListModel.hpp +++ b/linphone-app/src/components/conferenceInfo/ConferenceInfoProxyListModel.hpp @@ -39,6 +39,8 @@ class ConferenceInfoProxyListModel : public SortFilterAbstractProxyModel(new ConferenceInfoMapModel(parent), parent) { connect(CoreManager::getInstance()->getAccountSettingsModel(), &AccountSettingsModel::primarySipAddressChanged, this, &ConferenceInfoProxyModel::update); connect(this, &ConferenceInfoProxyModel::filterTypeChanged, qobject_cast(sourceModel()), &ConferenceInfoMapModel::filterTypeChanged); + connect(CoreManager::getInstance()->getHandlers().get(), &CoreHandlers::conferenceInfoReceived, this, &ConferenceInfoProxyModel::onConferenceInfoReceived); setFilterType((int)Scheduled); } @@ -61,3 +63,11 @@ bool ConferenceInfoProxyModel::filterAcceptsRow (int sourceRow, const QModelInde } return false; } + +void ConferenceInfoProxyModel::onConferenceInfoReceived(const std::shared_ptr & conferenceInfo){ + auto realConferenceInfo = ConferenceInfoModel::findConferenceInfo(conferenceInfo); + if( realConferenceInfo ){ + auto model = qobject_cast(sourceModel()); + model->add(realConferenceInfo); + } +} diff --git a/linphone-app/src/components/conferenceInfo/ConferenceInfoProxyModel.hpp b/linphone-app/src/components/conferenceInfo/ConferenceInfoProxyModel.hpp index da0b5a969..b215b7eaf 100644 --- a/linphone-app/src/components/conferenceInfo/ConferenceInfoProxyModel.hpp +++ b/linphone-app/src/components/conferenceInfo/ConferenceInfoProxyModel.hpp @@ -49,6 +49,8 @@ public: ConferenceInfoProxyModel (QObject *parent = Q_NULLPTR); Q_INVOKABLE void update(); + + void onConferenceInfoReceived(const std::shared_ptr & conferenceInfo); protected: bool filterAcceptsRow (int sourceRow, const QModelIndex &sourceParent) const override; diff --git a/linphone-app/src/components/core/CoreHandlers.cpp b/linphone-app/src/components/core/CoreHandlers.cpp index 1aefaae8d..25a98d443 100644 --- a/linphone-app/src/components/core/CoreHandlers.cpp +++ b/linphone-app/src/components/core/CoreHandlers.cpp @@ -326,5 +326,5 @@ void CoreHandlers::onEcCalibrationResult( //------------------------------ CONFERENCE INFO void CoreHandlers::onConferenceInfoReceived(const std::shared_ptr & core, const std::shared_ptr & conferenceInfo) { - qDebug() << "onConferenceInfoReceived (not implemented)"; + emit conferenceInfoReceived(conferenceInfo); } diff --git a/linphone-app/src/components/core/CoreHandlers.hpp b/linphone-app/src/components/core/CoreHandlers.hpp index aabf7cf04..a6a10361a 100644 --- a/linphone-app/src/components/core/CoreHandlers.hpp +++ b/linphone-app/src/components/core/CoreHandlers.hpp @@ -58,6 +58,7 @@ signals: void registrationStateChanged (const std::shared_ptr &account, linphone::RegistrationState state); void ecCalibrationResult(linphone::EcCalibratorStatus status, int delayMs); void setLastRemoteProvisioningState(const linphone::ConfiguringState &state); + void conferenceInfoReceived(const std::shared_ptr & conferenceInfo); private: // --------------------------------------------------------------------------- diff --git a/linphone-app/ui/modules/Linphone/Chat/ChatCalendarMessage.qml b/linphone-app/ui/modules/Linphone/Chat/ChatCalendarMessage.qml index 0e942b46a..68e0cddb7 100644 --- a/linphone-app/ui/modules/Linphone/Chat/ChatCalendarMessage.qml +++ b/linphone-app/ui/modules/Linphone/Chat/ChatCalendarMessage.qml @@ -326,6 +326,9 @@ Loader{ isCustom: true colorSet: ChatCalendarMessageStyle.deleteButton backgroundRadius: width/2 + onClicked: { + mainItem.conferenceInfoModel.deleteConferenceInfo() + } } } }