From f8deebfc5a85237e4c17695856bacb81a216c7a0 Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 13 Jun 2020 14:31:39 +0200 Subject: [PATCH] fixed updating of data after read status change --- .../gui/gxschannels/GxsChannelPostsModel.cpp | 71 ++++++++++++++++++- .../gui/gxschannels/GxsChannelPostsModel.h | 5 +- .../GxsChannelPostsWidgetWithModel.cpp | 5 +- 3 files changed, 77 insertions(+), 4 deletions(-) diff --git a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsModel.cpp b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsModel.cpp index ae2c3d119..9c40f97e3 100644 --- a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsModel.cpp +++ b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsModel.cpp @@ -43,7 +43,76 @@ std::ostream& operator<<(std::ostream& o, const QModelIndex& i);// defined elsew RsGxsChannelPostsModel::RsGxsChannelPostsModel(QObject *parent) : QAbstractItemModel(parent), mTreeMode(TREE_MODE_PLAIN), mColumns(6) { - initEmptyHierarchy(); + initEmptyHierarchy(); + + mEventHandlerId = 0; + // Needs to be asynced because this function is called by another thread! + + rsEvents->registerEventsHandler( [this](std::shared_ptr event) + { + RsQThreadUtils::postToObject([=](){ handleEvent_main_thread(event); }, this ); + }, mEventHandlerId, RsEventType::GXS_CHANNELS ); +} + +RsGxsChannelPostsModel::~RsGxsChannelPostsModel() +{ + rsEvents->unregisterEventsHandler(mEventHandlerId); +} + +void RsGxsChannelPostsModel::handleEvent_main_thread(std::shared_ptr event) +{ + const RsGxsChannelEvent *e = dynamic_cast(event.get()); + + if(!e) + return; + + switch(e->mChannelEventCode) + { + case RsChannelEventCode::UPDATED_MESSAGE: + case RsChannelEventCode::READ_STATUS_CHANGED: + { + // Normally we should just emit dataChanged() on the index of the data that has changed: + // + // We need to update the data! + + if(e->mChannelGroupId == mChannelGroup.mMeta.mGroupId) + RsThread::async([this, e]() + { + // 1 - get message data from p3GxsChannels + + std::vector posts; + std::vector comments; + std::vector votes; + + if(!rsGxsChannels->getChannelContent(mChannelGroup.mMeta.mGroupId,std::set{ e->mChannelMsgId }, posts,comments,votes)) + { + std::cerr << __PRETTY_FUNCTION__ << " failed to retrieve channel message data for channel/msg " << e->mChannelGroupId << "/" << e->mChannelMsgId << std::endl; + return; + } + + // 2 - update the model in the UI thread. + + RsQThreadUtils::postToObject( [posts,comments,votes,this]() + { + for(uint32_t i=0;i #include @@ -62,7 +63,7 @@ class RsGxsChannelPostsModel : public QAbstractItemModel public: explicit RsGxsChannelPostsModel(QObject *parent = NULL); - ~RsGxsChannelPostsModel(){} + virtual ~RsGxsChannelPostsModel() override; static const int COLUMN_THREAD_NB_COLUMNS = 0x01; @@ -217,6 +218,7 @@ private: void createPostsArray(std::vector &posts); void setPosts(const RsGxsChannelGroup& group, std::vector &posts); void initEmptyHierarchy(); + void handleEvent_main_thread(std::shared_ptr event); std::vector mFilteredPosts; // stores the list of displayes indices due to filtering. std::vector mPosts ; // store the list of posts updated from rsForums. @@ -229,5 +231,6 @@ private: QColor mTextColorNotSubscribed ; QColor mTextColorMissing ; + RsEventsHandlerId_t mEventHandlerId ; friend class const_iterator; }; diff --git a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidgetWithModel.cpp b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidgetWithModel.cpp index 5f3fb58de..6faf2d122 100644 --- a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidgetWithModel.cpp +++ b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidgetWithModel.cpp @@ -428,10 +428,11 @@ void GxsChannelPostsWidgetWithModel::handleEvent_main_thread(std::shared_ptrmChannelGroupId == groupId()) updateDisplay(true); - break; + } + default: break; }