From f8061d452c0057b50a2ba8bd5bf67585e7f9e0b9 Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 1 Nov 2025 18:05:26 +0100 Subject: [PATCH] fixed GxsForumGroupItem --- .../src/gui/feeds/ChannelsCommentsItem.h | 5 -- .../src/gui/feeds/GxsChannelGroupItem.cpp | 1 + .../src/gui/feeds/GxsChannelGroupItem.h | 5 -- .../src/gui/feeds/GxsChannelPostItem.h | 6 -- .../src/gui/feeds/GxsForumGroupItem.cpp | 67 ++++++++++--------- .../src/gui/feeds/GxsForumGroupItem.h | 12 ++-- retroshare-gui/src/gui/gxs/GxsGroupFeedItem.h | 6 ++ 7 files changed, 50 insertions(+), 52 deletions(-) diff --git a/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.h b/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.h index d8f38e1d4..6cd25154e 100644 --- a/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.h +++ b/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.h @@ -55,11 +55,6 @@ public: uint64_t uniqueIdentifier() const override { return hash_64bits("ChannelsCommentsItem " + messageId().toStdString()) ; } protected: - enum LoadingStatus { - NO_DATA = 0x00, - HAS_DATA = 0x01, - FILLED = 0x02 - }; bool isUnread() const ; void setReadStatus(bool isNew, bool isUnread); diff --git a/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.cpp b/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.cpp index c00422373..510302ae2 100644 --- a/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.cpp +++ b/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.cpp @@ -71,6 +71,7 @@ void GxsChannelGroupItem::addEventHandler() case RsChannelEventCode::UPDATED_CHANNEL: case RsChannelEventCode::RECEIVED_PUBLISH_KEY: mLoadingStatus = NO_DATA; + mGroup = RsGxsChannelGroup(); break; default: break; diff --git a/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.h b/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.h index 5110898d6..604145941 100644 --- a/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.h +++ b/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.h @@ -43,11 +43,6 @@ public: uint64_t uniqueIdentifier() const override { return hash_64bits("GxsChannelGroupItem " + groupId().toStdString()) ; } protected: - enum LoadingStatus { - NO_DATA = 0x00, - HAS_DATA = 0x01, - FILLED = 0x02 - }; /* FeedItem */ virtual void doExpand(bool open) override; diff --git a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.h b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.h index 2aa3086fa..fd5ccfd86 100644 --- a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.h +++ b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.h @@ -56,12 +56,6 @@ public: uint64_t uniqueIdentifier() const override { return hash_64bits("GxsChannelPostItem " + messageId().toStdString()) ; } protected: - enum LoadingStatus { - NO_DATA = 0x00, - HAS_DATA = 0x01, - FILLED = 0x02 - }; - //void setFileCleanUpWarning(uint32_t time_left); QString getTitleLabel(); diff --git a/retroshare-gui/src/gui/feeds/GxsForumGroupItem.cpp b/retroshare-gui/src/gui/feeds/GxsForumGroupItem.cpp index a392137dc..d338ebb57 100644 --- a/retroshare-gui/src/gui/feeds/GxsForumGroupItem.cpp +++ b/retroshare-gui/src/gui/feeds/GxsForumGroupItem.cpp @@ -34,9 +34,9 @@ GxsForumGroupItem::GxsForumGroupItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsGroupId &groupId, bool isHome, bool autoUpdate) : GxsGroupFeedItem(feedHolder, feedId, groupId, isHome, rsGxsForums, autoUpdate) { - mIsLoading = false; + mLoadingGroup = false; + mLoadingStatus = NO_DATA; setup(); - requestGroup(); addEventHandler(); } @@ -45,9 +45,9 @@ GxsForumGroupItem::GxsForumGroupItem(FeedHolder *feedHolder, uint32_t feedId, co mAddedModerators(added_moderators), mRemovedModerators(removed_moderators) { - mIsLoading = false; + mLoadingGroup = false; + mLoadingStatus = NO_DATA; setup(); - requestGroup(); addEventHandler(); } @@ -68,7 +68,8 @@ void GxsForumGroupItem::addEventHandler() case RsForumEventCode::SUBSCRIBE_STATUS_CHANGED: case RsForumEventCode::UPDATED_FORUM: case RsForumEventCode::MODERATOR_LIST_CHANGED: - loadGroup(); + mLoadingStatus = NO_DATA; + mGroup = RsGxsForumGroup(); break; default: break; @@ -77,19 +78,37 @@ void GxsForumGroupItem::addEventHandler() }, mEventHandlerId, RsEventType::GXS_FORUMS ); } -GxsForumGroupItem::GxsForumGroupItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsForumGroup &group, bool isHome, bool autoUpdate) : - GxsGroupFeedItem(feedHolder, feedId, group.mMeta.mGroupId, isHome, rsGxsForums, autoUpdate) +void GxsForumGroupItem::paintEvent(QPaintEvent *e) { - setup(); - setGroup(group); - addEventHandler(); -} + /* 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) ; +} GxsForumGroupItem::~GxsForumGroupItem() { 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)); @@ -123,23 +142,9 @@ void GxsForumGroupItem::setup() ui->expandFrame->hide(); } -bool GxsForumGroupItem::setGroup(const RsGxsForumGroup &group) -{ - if (groupId() != group.mMeta.mGroupId) { - std::cerr << "GxsForumGroupItem::setContent() - Wrong id, cannot set post"; - std::cerr << std::endl; - return false; - } - - mGroup = group; - fill(); - - return true; -} - void GxsForumGroupItem::loadGroup() { - mIsLoading = true; + mLoadingGroup = true; RsThread::async([this]() { @@ -155,7 +160,7 @@ void GxsForumGroupItem::loadGroup() if(!rsGxsForums->getForumsInfo(forumIds,groups)) { RsErr() << "GxsForumGroupItem::loadGroup() ERROR getting data" << std::endl; - mIsLoading = false; + mLoadingGroup = false; return; } @@ -163,7 +168,7 @@ void GxsForumGroupItem::loadGroup() { std::cerr << "GxsForumGroupItem::loadGroup() Wrong number of Items"; std::cerr << std::endl; - mIsLoading = false; + mLoadingGroup = false; return; } RsGxsForumGroup group(groups[0]);// no reference to teporary accross threads! @@ -174,8 +179,8 @@ void GxsForumGroupItem::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/GxsForumGroupItem.h b/retroshare-gui/src/gui/feeds/GxsForumGroupItem.h index 823b698cf..4a70a215d 100644 --- a/retroshare-gui/src/gui/feeds/GxsForumGroupItem.h +++ b/retroshare-gui/src/gui/feeds/GxsForumGroupItem.h @@ -39,14 +39,15 @@ public: /** Default Constructor */ GxsForumGroupItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsGroupId &groupId, bool isHome, bool autoUpdate); GxsForumGroupItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsGroupId &groupId, const std::list& added_moderators,const std::list& removed_moderators,bool isHome, bool autoUpdate); - GxsForumGroupItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsForumGroup &group, bool isHome, bool autoUpdate); - virtual ~GxsForumGroupItem() override; + //GxsForumGroupItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsForumGroup &group, bool isHome, bool autoUpdate); - bool setGroup(const RsGxsForumGroup &group); + virtual ~GxsForumGroupItem() override; uint64_t uniqueIdentifier() const override { return hash_64bits("GxsForumGroupItem " + groupId().toStdString()) ; } protected: - /* FeedItem */ + virtual void paintEvent(QPaintEvent *) override; + + /* FeedItem */ virtual void doExpand(bool open) override; /* GxsGroupFeedItem */ @@ -69,7 +70,8 @@ private: /** Qt Designer generated object */ Ui::GxsForumGroupItem *ui; - bool mIsLoading; + bool mLoadingGroup; + LoadingStatus mLoadingStatus; std::list mAddedModerators; std::list mRemovedModerators; diff --git a/retroshare-gui/src/gui/gxs/GxsGroupFeedItem.h b/retroshare-gui/src/gui/gxs/GxsGroupFeedItem.h index 63e5907d6..cd051ccee 100644 --- a/retroshare-gui/src/gui/gxs/GxsGroupFeedItem.h +++ b/retroshare-gui/src/gui/gxs/GxsGroupFeedItem.h @@ -45,6 +45,12 @@ public: uint32_t feedId() const { return mFeedId; } protected: + enum LoadingStatus { + NO_DATA = 0x00, + HAS_DATA = 0x01, + FILLED = 0x02 + }; + /* load group data */ void requestGroup();