diff --git a/retroshare-gui/src/gui/Posted/PostedItem.cpp b/retroshare-gui/src/gui/Posted/PostedItem.cpp index 8f3352735..a8e7b0341 100644 --- a/retroshare-gui/src/gui/Posted/PostedItem.cpp +++ b/retroshare-gui/src/gui/Posted/PostedItem.cpp @@ -36,6 +36,8 @@ #include "ui_PostedItem.h" #include + +#include #include #define LINK_IMAGE ":/images/thumb-link.png" @@ -46,20 +48,40 @@ // BasePostedItem // //======================================================================================== -BasePostedItem::BasePostedItem(FeedHolder *feedHolder, uint32_t feedId, const RsGroupMetaData &group_meta, const RsGxsMessageId& post_id, bool isHome, bool autoUpdate) : - GxsFeedItem(feedHolder, feedId, group_meta.mGroupId, post_id, isHome, rsPosted, autoUpdate), - mGroupMeta(group_meta) +BasePostedItem::BasePostedItem( FeedHolder *feedHolder, uint32_t feedId + , const RsGroupMetaData &group_meta, const RsGxsMessageId& post_id + , bool isHome, bool autoUpdate) + : GxsFeedItem(feedHolder, feedId, group_meta.mGroupId, post_id, isHome, rsPosted, autoUpdate) + , mInFill(false), mGroupMeta(group_meta) + , mLoaded(false), mIsLoadingGroup(false), mIsLoadingMessage(false), mIsLoadingComment(false) { - mPost.mMeta.mMsgId = post_id; - mPost.mMeta.mGroupId = mGroupMeta.mGroupId; - mLoaded = false; + mPost.mMeta.mMsgId = post_id; + mPost.mMeta.mGroupId = mGroupMeta.mGroupId; } -BasePostedItem::BasePostedItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsGroupId &groupId, const RsGxsMessageId& post_id, bool isHome, bool autoUpdate) : - GxsFeedItem(feedHolder, feedId, groupId, post_id, isHome, rsPosted, autoUpdate) +BasePostedItem::BasePostedItem( FeedHolder *feedHolder, uint32_t feedId + , const RsGxsGroupId &groupId, const RsGxsMessageId& post_id + , bool isHome, bool autoUpdate) + : GxsFeedItem(feedHolder, feedId, groupId, post_id, isHome, rsPosted, autoUpdate) + , mInFill(false) + , mLoaded(false), mIsLoadingGroup(false), mIsLoadingMessage(false), mIsLoadingComment(false) { - mPost.mMeta.mMsgId = post_id; - mLoaded = false; + mPost.mMeta.mMsgId = post_id; +} + +BasePostedItem::~BasePostedItem() +{ + auto timeout = std::chrono::steady_clock::now() + std::chrono::milliseconds(200); + while( (mIsLoadingGroup || mIsLoadingMessage || mIsLoadingComment) + && std::chrono::steady_clock::now() < timeout) + { + RsDbg() << __PRETTY_FUNCTION__ << " is Waiting " + << (mIsLoadingGroup ? "Group " : "") + << (mIsLoadingMessage ? "Message " : "") + << (mIsLoadingComment ? "Comment " : "") + << "loading finished." << std::endl; + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } } void BasePostedItem::paintEvent(QPaintEvent *e) @@ -96,6 +118,7 @@ bool BasePostedItem::setPost(const RsPostedPost &post, bool doFill) void BasePostedItem::loadGroup() { + mIsLoadingGroup = true; RsThread::async([this]() { // 1 - get group data @@ -110,13 +133,14 @@ void BasePostedItem::loadGroup() if(!rsPosted->getBoardsInfo(groupIds,groups)) { RsErr() << "GxsPostedGroupItem::loadGroup() ERROR getting data" << std::endl; + mIsLoadingGroup = false; return; } if (groups.size() != 1) { - std::cerr << "GxsPostedGroupItem::loadGroup() Wrong number of Items"; - std::cerr << std::endl; + std::cerr << "GxsPostedGroupItem::loadGroup() Wrong number of Items" << std::endl; + mIsLoadingGroup = false; return; } RsPostedGroup group(groups[0]); @@ -127,7 +151,8 @@ void BasePostedItem::loadGroup() * thread, for example to update the data model with new information * after a blocking call to RetroShare API complete */ - mGroupMeta = group.mMeta; + mGroupMeta = group.mMeta; + mIsLoadingGroup = false; }, this ); }); @@ -135,6 +160,7 @@ void BasePostedItem::loadGroup() void BasePostedItem::loadMessage() { + mIsLoadingMessage = true; RsThread::async([this]() { // 1 - get group data @@ -145,15 +171,16 @@ void BasePostedItem::loadMessage() if(! rsPosted->getBoardContent( groupId(), std::set( { messageId() } ),posts,comments)) { RsErr() << "BasePostedItem::loadMessage() ERROR getting data" << std::endl; + mIsLoadingMessage = false; return; } if (posts.size() == 1) { std::cerr << (void*)this << ": Obtained post, with msgId = " << posts[0].mMeta.mMsgId << std::endl; - const RsPostedPost& post(posts[0]); + const RsPostedPost& post(posts[0]); - RsQThreadUtils::postToObject( [post,this]() { setPost(post,true); }, this ); + RsQThreadUtils::postToObject( [post,this]() { setPost(post,true); mIsLoadingMessage = false;}, this ); } else if(comments.size() == 1) { @@ -162,21 +189,21 @@ void BasePostedItem::loadMessage() RsQThreadUtils::postToObject( [cmt,this]() { - setComment(cmt); + setComment(cmt); //Change this item to be uploaded with thread element. setMessageId(cmt.mMeta.mThreadId); requestMessage(); + mIsLoadingMessage = false; }, this ); } else { - std::cerr << "GxsChannelPostItem::loadMessage() Wrong number of Items. Remove It."; - std::cerr << std::endl; + std::cerr << "GxsChannelPostItem::loadMessage() Wrong number of Items. Remove It." << std::endl; - RsQThreadUtils::postToObject( [this]() { removeItem(); }, this ); + RsQThreadUtils::postToObject( [this]() { removeItem(); mIsLoadingMessage = false;}, this ); } }); } @@ -188,7 +215,7 @@ void BasePostedItem::loadComment() std::cerr << "GxsChannelPostItem::loadComment()"; std::cerr << std::endl; #endif - + mIsLoadingComment = true; RsThread::async([this]() { // 1 - get group data @@ -204,15 +231,16 @@ void BasePostedItem::loadComment() if(! rsPosted->getBoardContent( groupId(),msgIds,posts,comments)) { RsErr() << "BasePostedItem::loadGroup() ERROR getting data" << std::endl; + mIsLoadingComment = false; return; } - int comNb = comments.size(); + int comNb = comments.size(); RsQThreadUtils::postToObject( [comNb,this]() { - setCommentsSize(comNb); - + setCommentsSize(comNb); + mIsLoadingComment = false; }, this ); }); } diff --git a/retroshare-gui/src/gui/Posted/PostedItem.h b/retroshare-gui/src/gui/Posted/PostedItem.h index c0c5ace44..fdc55b949 100644 --- a/retroshare-gui/src/gui/Posted/PostedItem.h +++ b/retroshare-gui/src/gui/Posted/PostedItem.h @@ -31,7 +31,7 @@ class PostedItem; } class FeedHolder; -class RsPostedPost; +struct RsPostedPost; class BasePostedItem : public GxsFeedItem { @@ -40,7 +40,7 @@ class BasePostedItem : public GxsFeedItem public: BasePostedItem(FeedHolder *parent, uint32_t feedId, const RsGxsGroupId& groupId, const RsGxsMessageId& messageId, bool isHome, bool autoUpdate); BasePostedItem(FeedHolder *parent, uint32_t feedId, const RsGroupMetaData& group_meta, const RsGxsMessageId& post_id, bool isHome, bool autoUpdate); - virtual ~BasePostedItem()=default; + virtual ~BasePostedItem(); bool setPost(const RsPostedPost& post, bool doFill = true); @@ -64,15 +64,15 @@ protected: virtual void paintEvent(QPaintEvent *) override; /* GxsGroupFeedItem */ - virtual QString groupName(); + virtual QString groupName() override; virtual void loadGroup() override; - virtual RetroShareLink::enumType getLinkType() { return RetroShareLink::TYPE_UNKNOWN; } + virtual RetroShareLink::enumType getLinkType() override { return RetroShareLink::TYPE_UNKNOWN; } /* GxsFeedItem */ - virtual QString messageName(); + virtual QString messageName() override; - virtual void loadMessage(); - virtual void loadComment(); + virtual void loadMessage() override; + virtual void loadComment() override; bool mInFill; RsGroupMetaData mGroupMeta; @@ -80,7 +80,7 @@ protected: virtual void setup()=0; virtual void fill()=0; - virtual void doExpand(bool open)=0; + virtual void doExpand(bool open) override =0; virtual void setComment(const RsGxsComment&)=0; virtual void setReadStatus(bool isNew, bool isUnread)=0; virtual void setCommentsSize(int comNb)=0; @@ -89,7 +89,10 @@ protected: virtual void toggleNotes()=0; private: - bool mLoaded; + bool mLoaded; + bool mIsLoadingGroup; + bool mIsLoadingMessage; + bool mIsLoadingComment; }; class PostedItem: public BasePostedItem