diff --git a/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.cpp b/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.cpp index 4c63fc030..c00422373 100644 --- a/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.cpp +++ b/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.cpp @@ -36,20 +36,22 @@ GxsChannelGroupItem::GxsChannelGroupItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsGroupId &groupId, bool isHome, bool autoUpdate) : GxsGroupFeedItem(feedHolder, feedId, groupId, isHome, rsGxsChannels, autoUpdate) { - mIsLoading = false; + mLoadingGroup = false; + mLoadingStatus = NO_DATA; + setup(); requestGroup(); addEventHandler(); } -GxsChannelGroupItem::GxsChannelGroupItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsChannelGroup &group, bool isHome, bool autoUpdate) : - GxsGroupFeedItem(feedHolder, feedId, group.mMeta.mGroupId, isHome, rsGxsChannels, autoUpdate) -{ - mIsLoading = false; - setup(); - setGroup(group); - addEventHandler(); -} +//GxsChannelGroupItem::GxsChannelGroupItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsChannelGroup &group, bool isHome, bool autoUpdate) : +// GxsGroupFeedItem(feedHolder, feedId, group.mMeta.mGroupId, isHome, rsGxsChannels, autoUpdate) +//{ +// mIsLoading = false; +// setup(); +// setGroup(group); +// addEventHandler(); +//} void GxsChannelGroupItem::addEventHandler() { @@ -68,7 +70,7 @@ void GxsChannelGroupItem::addEventHandler() case RsChannelEventCode::SUBSCRIBE_STATUS_CHANGED: case RsChannelEventCode::UPDATED_CHANNEL: case RsChannelEventCode::RECEIVED_PUBLISH_KEY: - loadGroup(); + mLoadingStatus = NO_DATA; break; default: break; @@ -77,11 +79,37 @@ void GxsChannelGroupItem::addEventHandler() }, mEventHandlerId, RsEventType::GXS_CHANNELS ); } +void GxsChannelGroupItem::paintEvent(QPaintEvent *e) +{ + /* This method employs a trick to trigger a deferred loading. The post and group is requested only + * when actually displayed on the screen. */ + + if(mLoadingStatus != FILLED && !mGroup.mMeta.mGroupId.isNull()) + mLoadingStatus = HAS_DATA; + + if(mGroup.mMeta.mGroupId.isNull() && !mLoadingGroup) + loadGroup(); + + switch(mLoadingStatus) + { + case FILLED: + case NO_DATA: + default: + break; + + case HAS_DATA: + fill(); + mLoadingStatus = FILLED; + break; + } + + GxsGroupFeedItem::paintEvent(e) ; +} GxsChannelGroupItem::~GxsChannelGroupItem() { auto timeout = std::chrono::steady_clock::now() + std::chrono::milliseconds(GROUP_ITEM_LOADING_TIMEOUT_ms); - while( mIsLoading && std::chrono::steady_clock::now() < timeout ) + while( mLoadingGroup && std::chrono::steady_clock::now() < timeout ) { RsDbg() << __PRETTY_FUNCTION__ << " is Waiting for data to load " << std::endl; std::this_thread::sleep_for(std::chrono::milliseconds(100)); @@ -115,23 +143,9 @@ void GxsChannelGroupItem::setup() ui->expandFrame->hide(); } -bool GxsChannelGroupItem::setGroup(const RsGxsChannelGroup &group) -{ - if (groupId() != group.mMeta.mGroupId) { - std::cerr << "GxsChannelGroupItem::setContent() - Wrong id, cannot set post"; - std::cerr << std::endl; - return false; - } - - mGroup = group; - fill(); - - return true; -} - void GxsChannelGroupItem::loadGroup() { - mIsLoading = true; + mLoadingGroup = true; RsThread::async([this]() { @@ -143,7 +157,7 @@ void GxsChannelGroupItem::loadGroup() if(!rsGxsChannels->getChannelsInfo(groupIds,groups)) { RsErr() << "PostedItem::loadGroup() ERROR getting data" << std::endl; - mIsLoading = false; + mLoadingGroup = false; return; } @@ -151,7 +165,7 @@ void GxsChannelGroupItem::loadGroup() { std::cerr << "GxsGxsChannelGroupItem::loadGroup() Wrong number of Items"; std::cerr << std::endl; - mIsLoading = false; + mLoadingGroup = false; return; } RsGxsChannelGroup group(groups[0]); @@ -162,8 +176,8 @@ void GxsChannelGroupItem::loadGroup() * thread, for example to update the data model with new information * after a blocking call to RetroShare API complete */ - setGroup(group); - mIsLoading = false; + mGroup = group; + mLoadingGroup = false; }, this ); }); diff --git a/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.h b/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.h index 27d8d7480..5110898d6 100644 --- a/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.h +++ b/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.h @@ -37,19 +37,27 @@ class GxsChannelGroupItem : public GxsGroupFeedItem public: /** Default Constructor */ GxsChannelGroupItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsGroupId &groupId, bool isHome, bool autoUpdate); - GxsChannelGroupItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsChannelGroup &group, bool isHome, bool autoUpdate); - ~GxsChannelGroupItem(); + //GxsChannelGroupItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsChannelGroup &group, bool isHome, bool autoUpdate); + virtual ~GxsChannelGroupItem(); - bool setGroup(const RsGxsChannelGroup &group); uint64_t uniqueIdentifier() const override { return hash_64bits("GxsChannelGroupItem " + groupId().toStdString()) ; } -protected: - /* FeedItem */ - virtual void doExpand(bool open); - /* GxsGroupFeedItem */ - virtual QString groupName(); +protected: + enum LoadingStatus { + NO_DATA = 0x00, + HAS_DATA = 0x01, + FILLED = 0x02 + }; + + /* FeedItem */ + virtual void doExpand(bool open) override; + + virtual void paintEvent(QPaintEvent *) override; + + /* GxsGroupFeedItem */ + virtual QString groupName() override; virtual void loadGroup() override; - virtual RetroShareLink::enumType getLinkType() { return RetroShareLink::TYPE_CHANNEL; } + virtual RetroShareLink::enumType getLinkType() override { return RetroShareLink::TYPE_CHANNEL; } private slots: /* default stuff */ @@ -62,7 +70,8 @@ private: void setup(); void addEventHandler(); - bool mIsLoading; + LoadingStatus mLoadingStatus; + bool mLoadingGroup; private: RsGxsChannelGroup mGroup; diff --git a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp index 703d5e6b9..bc5f385d7 100644 --- a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp +++ b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp @@ -198,12 +198,6 @@ void GxsChannelPostItem::setup() } -bool GxsChannelPostItem::setPost(const RsGxsChannelPost &post) -{ - mPost = post; - return true; -} - QString GxsChannelPostItem::getTitleLabel() { return QString::fromUtf8(mPost.mMeta.mMsgName.c_str()); @@ -296,7 +290,7 @@ void GxsChannelPostItem::loadMessage() RsQThreadUtils::postToObject( [post,this]() { - setPost(post); + mPost = post; mLoadingMessage = false; update(); // this triggers a paintEvent if needed. diff --git a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.h b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.h index 44cb27b37..2aa3086fa 100644 --- a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.h +++ b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.h @@ -62,8 +62,6 @@ protected: FILLED = 0x02 }; - bool setPost(const RsGxsChannelPost& post); - //void setFileCleanUpWarning(uint32_t time_left); QString getTitleLabel();