From c3fb087f92b55c3084ea860b54240e7ae1632490 Mon Sep 17 00:00:00 2001 From: csoler Date: Mon, 27 Oct 2025 14:48:30 +0100 Subject: [PATCH 01/13] improved code consistency in feed item loading/killing --- .../src/gui/feeds/BoardsCommentsItem.cpp | 4 +- .../src/gui/feeds/ChannelsCommentsItem.cpp | 49 ++++++++++--------- .../src/gui/feeds/GxsChannelGroupItem.cpp | 21 ++++++-- .../src/gui/feeds/GxsChannelGroupItem.h | 2 + .../src/gui/feeds/GxsChannelPostItem.cpp | 27 +++++----- .../src/gui/feeds/GxsForumGroupItem.cpp | 23 +++++++-- .../src/gui/feeds/GxsForumGroupItem.h | 2 + .../src/gui/feeds/GxsForumMsgItem.cpp | 20 +++++--- .../src/gui/feeds/PostedGroupItem.cpp | 25 ++++++++-- .../src/gui/feeds/PostedGroupItem.h | 1 + .../src/gui/gxs/GxsGroupFeedItem.cpp | 2 + retroshare-gui/src/gui/gxs/GxsGroupFeedItem.h | 1 + 12 files changed, 119 insertions(+), 58 deletions(-) diff --git a/retroshare-gui/src/gui/feeds/BoardsCommentsItem.cpp b/retroshare-gui/src/gui/feeds/BoardsCommentsItem.cpp index 57adbb39d..8081c0e99 100644 --- a/retroshare-gui/src/gui/feeds/BoardsCommentsItem.cpp +++ b/retroshare-gui/src/gui/feeds/BoardsCommentsItem.cpp @@ -78,7 +78,8 @@ BaseBoardsCommentsItem::BaseBoardsCommentsItem( FeedHolder *feedHolder, uint32_t BaseBoardsCommentsItem::~BaseBoardsCommentsItem() { - auto timeout = std::chrono::steady_clock::now() + std::chrono::milliseconds(200); + auto timeout = std::chrono::steady_clock::now() + std::chrono::milliseconds(GROUP_ITEM_LOADING_TIMEOUT_ms); + while( (mIsLoadingGroup || mIsLoadingMessage || mIsLoadingComment) && std::chrono::steady_clock::now() < timeout) { @@ -126,6 +127,7 @@ bool BaseBoardsCommentsItem::setPost(const RsPostedPost &post, bool doFill) void BaseBoardsCommentsItem::loadGroup() { mIsLoadingGroup = true; + RsThread::async([this]() { // 1 - get group data diff --git a/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.cpp b/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.cpp index 5b0e0b264..ed2ce468f 100644 --- a/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.cpp +++ b/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.cpp @@ -102,7 +102,7 @@ void ChannelsCommentsItem::paintEvent(QPaintEvent *e) ChannelsCommentsItem::~ChannelsCommentsItem() { - auto timeout = std::chrono::steady_clock::now() + std::chrono::milliseconds(300); + auto timeout = std::chrono::steady_clock::now() + std::chrono::milliseconds(GROUP_ITEM_LOADING_TIMEOUT_ms); while( mLoading && std::chrono::steady_clock::now() < timeout ) { @@ -293,12 +293,14 @@ void ChannelsCommentsItem::load() if(!rsGxsChannels->getChannelsInfo(groupIds,groups)) // would be better to call channel Summaries for a single group { RsErr() << "GxsGxsChannelGroupItem::loadGroup() ERROR getting data" << std::endl; + mLoading= false; return; } if (groups.size() != 1) { std::cerr << "GxsGxsChannelGroupItem::loadGroup() Wrong number of Items" << std::endl; + mLoading= false; return; } RsGxsChannelGroup group(groups[0]); @@ -312,7 +314,8 @@ void ChannelsCommentsItem::load() if(! rsGxsChannels->getChannelContent( groupId(), std::set( { messageId(),mThreadId } ),posts,comments,votes)) { RsErr() << "GxsGxsChannelGroupItem::loadGroup() ERROR getting data" << std::endl; - return; + mLoading= false; + return; } // now that everything is in place, update the UI @@ -325,33 +328,31 @@ void ChannelsCommentsItem::load() mGroupMeta = group.mMeta; - if(comments.size()==1) - { - RsGxsComment cmt(comments[0]); - - uint32_t autorized_lines = (int)floor( (ui->avatarLabel->height() - ui->button_HL->sizeHint().height()) - / QFontMetricsF(ui->subjectLabel->font()).height()); - - ui->commLabel->setText(RsHtml().formatText(NULL, RsStringUtil::CopyLines(QString::fromUtf8(cmt.mComment.c_str()), autorized_lines), RSHTML_FORMATTEXT_EMBED_LINKS)); - ui->nameLabel->setId(cmt.mMeta.mAuthorId); - ui->datetimeLabel->setText(DateTime::formatLongDateTime(cmt.mMeta.mPublishTs)); - - RsIdentityDetails idDetails ; - rsIdentity->getIdDetails(cmt.mMeta.mAuthorId,idDetails); - QPixmap pixmap ; - - if(idDetails.mAvatar.mSize == 0 || !GxsIdDetails::loadPixmapFromData(idDetails.mAvatar.mData, idDetails.mAvatar.mSize, pixmap,GxsIdDetails::SMALL)) - pixmap = GxsIdDetails::makeDefaultIcon(cmt.mMeta.mAuthorId,GxsIdDetails::LARGE); - ui->avatarLabel->setPixmap(pixmap); - - //Change this item to be uploaded with thread element. This is really bad practice. - } - else + if(comments.size()!=1) { mLoading=false; removeItem(); } + RsGxsComment cmt(comments[0]); + + uint32_t autorized_lines = (int)floor( (ui->avatarLabel->height() - ui->button_HL->sizeHint().height()) + / QFontMetricsF(ui->subjectLabel->font()).height()); + + ui->commLabel->setText(RsHtml().formatText(NULL, RsStringUtil::CopyLines(QString::fromUtf8(cmt.mComment.c_str()), autorized_lines), RSHTML_FORMATTEXT_EMBED_LINKS)); + ui->nameLabel->setId(cmt.mMeta.mAuthorId); + ui->datetimeLabel->setText(DateTime::formatLongDateTime(cmt.mMeta.mPublishTs)); + + RsIdentityDetails idDetails ; + rsIdentity->getIdDetails(cmt.mMeta.mAuthorId,idDetails); + QPixmap pixmap ; + + if(idDetails.mAvatar.mSize == 0 || !GxsIdDetails::loadPixmapFromData(idDetails.mAvatar.mData, idDetails.mAvatar.mSize, pixmap,GxsIdDetails::SMALL)) + pixmap = GxsIdDetails::makeDefaultIcon(cmt.mMeta.mAuthorId,GxsIdDetails::LARGE); + ui->avatarLabel->setPixmap(pixmap); + + //Change this item to be uploaded with thread element. This is really bad practice. + if (posts.size() == 1) setPost(posts[0]); else diff --git a/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.cpp b/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.cpp index a6213e740..4c63fc030 100644 --- a/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.cpp +++ b/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.cpp @@ -36,7 +36,8 @@ GxsChannelGroupItem::GxsChannelGroupItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsGroupId &groupId, bool isHome, bool autoUpdate) : GxsGroupFeedItem(feedHolder, feedId, groupId, isHome, rsGxsChannels, autoUpdate) { - setup(); + mIsLoading = false; + setup(); requestGroup(); addEventHandler(); } @@ -44,6 +45,7 @@ GxsChannelGroupItem::GxsChannelGroupItem(FeedHolder *feedHolder, uint32_t feedId 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(); @@ -77,6 +79,14 @@ void GxsChannelGroupItem::addEventHandler() 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 ) + { + RsDbg() << __PRETTY_FUNCTION__ << " is Waiting for data to load " << std::endl; + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + rsEvents->unregisterEventsHandler(mEventHandlerId); delete(ui); } @@ -121,6 +131,8 @@ bool GxsChannelGroupItem::setGroup(const RsGxsChannelGroup &group) void GxsChannelGroupItem::loadGroup() { + mIsLoading = true; + RsThread::async([this]() { // 1 - get group data @@ -131,14 +143,16 @@ void GxsChannelGroupItem::loadGroup() if(!rsGxsChannels->getChannelsInfo(groupIds,groups)) { RsErr() << "PostedItem::loadGroup() ERROR getting data" << std::endl; - return; + mIsLoading = false; + return; } if (groups.size() != 1) { std::cerr << "GxsGxsChannelGroupItem::loadGroup() Wrong number of Items"; std::cerr << std::endl; - return; + mIsLoading = false; + return; } RsGxsChannelGroup group(groups[0]); @@ -149,6 +163,7 @@ void GxsChannelGroupItem::loadGroup() * after a blocking call to RetroShare API complete */ setGroup(group); + mIsLoading = false; }, this ); }); diff --git a/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.h b/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.h index b0366bc98..27d8d7480 100644 --- a/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.h +++ b/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.h @@ -62,6 +62,8 @@ private: void setup(); void addEventHandler(); + bool mIsLoading; + private: RsGxsChannelGroup mGroup; diff --git a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp index 17036a15e..a50a0c46e 100644 --- a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp +++ b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp @@ -140,7 +140,7 @@ void GxsChannelPostItem::paintEvent(QPaintEvent *e) GxsChannelPostItem::~GxsChannelPostItem() { - auto timeout = std::chrono::steady_clock::now() + std::chrono::milliseconds(300); + auto timeout = std::chrono::steady_clock::now() + std::chrono::milliseconds(GROUP_ITEM_LOADING_TIMEOUT_ms); while( (mLoadingGroup || mLoadingMessage || mLoadingComment) && std::chrono::steady_clock::now() < timeout) @@ -306,14 +306,16 @@ void GxsChannelPostItem::loadGroup() if(!rsGxsChannels->getChannelsInfo(groupIds,groups)) // would be better to call channel Summaries for a single group { RsErr() << "GxsGxsChannelGroupItem::loadGroup() ERROR getting data" << std::endl; - return; + mLoadingGroup = false; + return; } if (groups.size() != 1) { std::cerr << "GxsGxsChannelGroupItem::loadGroup() Wrong number of Items"; std::cerr << std::endl; - return; + mLoadingGroup = false; + return; } RsGxsChannelGroup group(groups[0]); @@ -348,7 +350,8 @@ void GxsChannelPostItem::loadMessage() if(! rsGxsChannels->getChannelContent( groupId(), std::set( { messageId() } ),posts,comments,votes)) { RsErr() << "GxsGxsChannelGroupItem::loadGroup() ERROR getting data" << std::endl; - return; + mLoadingMessage = false; + return; } if (posts.size() == 1) @@ -377,11 +380,11 @@ void GxsChannelPostItem::loadMessage() ui->commLabel->show(); ui->commLabel->setText(QString::fromUtf8(cmt.mComment.c_str())); - //Change this item to be uploaded with thread element. + // Change this item to be uploaded with thread element. Note: this is terrible coding. setMessageId(cmt.mMeta.mThreadId); - requestMessage(); - mLoadingMessage = false; + + requestMessage(); }, this ); } @@ -424,7 +427,8 @@ void GxsChannelPostItem::loadComment() if(! rsGxsChannels->getChannelComments( groupId(),msgIds,comments)) { RsErr() << "GxsGxsChannelGroupItem::loadGroup() ERROR getting data" << std::endl; - return; + mLoadingComment = false; + return; } int comNb = comments.size(); @@ -446,13 +450,6 @@ void GxsChannelPostItem::loadComment() void GxsChannelPostItem::fill() { - /* fill in */ - -// if (isLoading()) { - // /* Wait for all requests */ - //return; -// } - #ifdef DEBUG_ITEM std::cerr << "GxsChannelPostItem::fill()"; std::cerr << std::endl; diff --git a/retroshare-gui/src/gui/feeds/GxsForumGroupItem.cpp b/retroshare-gui/src/gui/feeds/GxsForumGroupItem.cpp index 663951a6c..a392137dc 100644 --- a/retroshare-gui/src/gui/feeds/GxsForumGroupItem.cpp +++ b/retroshare-gui/src/gui/feeds/GxsForumGroupItem.cpp @@ -34,7 +34,8 @@ GxsForumGroupItem::GxsForumGroupItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsGroupId &groupId, bool isHome, bool autoUpdate) : GxsGroupFeedItem(feedHolder, feedId, groupId, isHome, rsGxsForums, autoUpdate) { - setup(); + mIsLoading = false; + setup(); requestGroup(); addEventHandler(); } @@ -44,7 +45,8 @@ GxsForumGroupItem::GxsForumGroupItem(FeedHolder *feedHolder, uint32_t feedId, co mAddedModerators(added_moderators), mRemovedModerators(removed_moderators) { - setup(); + mIsLoading = false; + setup(); requestGroup(); addEventHandler(); } @@ -85,6 +87,14 @@ GxsForumGroupItem::GxsForumGroupItem(FeedHolder *feedHolder, uint32_t feedId, co 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 ) + { + RsDbg() << __PRETTY_FUNCTION__ << " is Waiting for data to load " << std::endl; + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + rsEvents->unregisterEventsHandler(mEventHandlerId); delete(ui); } @@ -129,6 +139,8 @@ bool GxsForumGroupItem::setGroup(const RsGxsForumGroup &group) void GxsForumGroupItem::loadGroup() { + mIsLoading = true; + RsThread::async([this]() { // 1 - get group data @@ -143,14 +155,16 @@ void GxsForumGroupItem::loadGroup() if(!rsGxsForums->getForumsInfo(forumIds,groups)) { RsErr() << "GxsForumGroupItem::loadGroup() ERROR getting data" << std::endl; - return; + mIsLoading = false; + return; } if (groups.size() != 1) { std::cerr << "GxsForumGroupItem::loadGroup() Wrong number of Items"; std::cerr << std::endl; - return; + mIsLoading = false; + return; } RsGxsForumGroup group(groups[0]);// no reference to teporary accross threads! @@ -161,6 +175,7 @@ void GxsForumGroupItem::loadGroup() * after a blocking call to RetroShare API complete */ setGroup(group); + mIsLoading = false; }, this ); }); diff --git a/retroshare-gui/src/gui/feeds/GxsForumGroupItem.h b/retroshare-gui/src/gui/feeds/GxsForumGroupItem.h index d80671e5a..823b698cf 100644 --- a/retroshare-gui/src/gui/feeds/GxsForumGroupItem.h +++ b/retroshare-gui/src/gui/feeds/GxsForumGroupItem.h @@ -69,6 +69,8 @@ private: /** Qt Designer generated object */ Ui::GxsForumGroupItem *ui; + bool mIsLoading; + std::list mAddedModerators; std::list mRemovedModerators; diff --git a/retroshare-gui/src/gui/feeds/GxsForumMsgItem.cpp b/retroshare-gui/src/gui/feeds/GxsForumMsgItem.cpp index f4d091179..2b56e9ba6 100644 --- a/retroshare-gui/src/gui/feeds/GxsForumMsgItem.cpp +++ b/retroshare-gui/src/gui/feeds/GxsForumMsgItem.cpp @@ -89,7 +89,7 @@ GxsForumMsgItem::GxsForumMsgItem(FeedHolder *feedHolder, uint32_t feedId, const GxsForumMsgItem::~GxsForumMsgItem() { - auto timeout = std::chrono::steady_clock::now() + std::chrono::milliseconds(300); + auto timeout = std::chrono::steady_clock::now() + std::chrono::milliseconds(GROUP_ITEM_LOADING_TIMEOUT_ms); while( (mLoadingGroup || mLoadingMessage || mLoadingSetAsRead || mLoadingParentMessage) && std::chrono::steady_clock::now() < timeout) @@ -202,14 +202,16 @@ void GxsForumMsgItem::loadGroup() if(!rsGxsForums->getForumsInfo(forumIds,groups)) { RsErr() << "GxsForumGroupItem::loadGroup() ERROR getting data" << std::endl; - return; + mLoadingGroup = false; + return; } if (groups.size() != 1) { std::cerr << "GxsForumGroupItem::loadGroup() Wrong number of Items"; std::cerr << std::endl; - return; + mLoadingGroup = false; + return; } RsGxsForumGroup group(groups[0]); @@ -249,14 +251,16 @@ void GxsForumMsgItem::loadMessage() { std::cerr << "GxsForumMsgItem::loadMessage() ERROR getting data"; std::cerr << std::endl; - return; + mLoadingMessage = false; + return; } if (msgs.size() != 1) { std::cerr << "GxsForumMsgItem::loadMessage() Wrong number of Items"; std::cerr << std::endl; - return; + mLoadingMessage = false; + return; } RsGxsForumMsg msg(msgs[0]); @@ -296,14 +300,16 @@ void GxsForumMsgItem::loadParentMessage(const RsGxsMessageId& parent_msg) { std::cerr << "GxsForumMsgItem::loadMessage() ERROR getting data"; std::cerr << std::endl; - return; + mLoadingParentMessage = false; + return; } if (msgs.size() != 1) { std::cerr << "GxsForumMsgItem::loadMessage() Wrong number of Items"; std::cerr << std::endl; - return; + mLoadingParentMessage = false; + return; } RsGxsForumMsg msg(msgs[0]); diff --git a/retroshare-gui/src/gui/feeds/PostedGroupItem.cpp b/retroshare-gui/src/gui/feeds/PostedGroupItem.cpp index f4abafb08..34fd378f2 100644 --- a/retroshare-gui/src/gui/feeds/PostedGroupItem.cpp +++ b/retroshare-gui/src/gui/feeds/PostedGroupItem.cpp @@ -35,7 +35,8 @@ PostedGroupItem::PostedGroupItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsGroupId &groupId, bool isHome, bool autoUpdate) : GxsGroupFeedItem(feedHolder, feedId, groupId, isHome, rsPosted, autoUpdate) { - setup(); + mIsLoadingGroup = false; + setup(); requestGroup(); } @@ -43,13 +44,24 @@ PostedGroupItem::PostedGroupItem(FeedHolder *feedHolder, uint32_t feedId, const PostedGroupItem::PostedGroupItem(FeedHolder *feedHolder, uint32_t feedId, const RsPostedGroup &group, bool isHome, bool autoUpdate) : GxsGroupFeedItem(feedHolder, feedId, group.mMeta.mGroupId, isHome, rsPosted, autoUpdate) { - setup(); + mIsLoadingGroup = false; + setup(); setGroup(group); } PostedGroupItem::~PostedGroupItem() { + auto timeout = std::chrono::steady_clock::now() + std::chrono::milliseconds(GROUP_ITEM_LOADING_TIMEOUT_ms); + + while( mIsLoadingGroup && std::chrono::steady_clock::now() < timeout) + { + RsDbg() << __PRETTY_FUNCTION__ << " is Waiting " + << (mIsLoadingGroup ? "Group " : "") + << "loading finished." << std::endl; + + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } delete(ui); } @@ -95,6 +107,8 @@ bool PostedGroupItem::setGroup(const RsPostedGroup &group) void PostedGroupItem::loadGroup() { + mIsLoadingGroup = true; + RsThread::async([this]() { // 1 - get group data @@ -109,14 +123,16 @@ void PostedGroupItem::loadGroup() if(!rsPosted->getBoardsInfo(groupIds,groups)) { RsErr() << "GxsPostedGroupItem::loadGroup() ERROR getting data" << std::endl; - return; + mIsLoadingGroup = false; + return; } if (groups.size() != 1) { std::cerr << "GxsPostedGroupItem::loadGroup() Wrong number of Items"; std::cerr << std::endl; - return; + mIsLoadingGroup = false; + return; } RsPostedGroup group(groups[0]); @@ -127,6 +143,7 @@ void PostedGroupItem::loadGroup() * after a blocking call to RetroShare API complete */ setGroup(group); + mIsLoadingGroup = false; }, this ); }); diff --git a/retroshare-gui/src/gui/feeds/PostedGroupItem.h b/retroshare-gui/src/gui/feeds/PostedGroupItem.h index 642dc4be0..fa8fe65d6 100644 --- a/retroshare-gui/src/gui/feeds/PostedGroupItem.h +++ b/retroshare-gui/src/gui/feeds/PostedGroupItem.h @@ -63,6 +63,7 @@ private: private: RsPostedGroup mGroup; + bool mIsLoadingGroup; /** Qt Designer generated object */ Ui::PostedGroupItem *ui; diff --git a/retroshare-gui/src/gui/gxs/GxsGroupFeedItem.cpp b/retroshare-gui/src/gui/gxs/GxsGroupFeedItem.cpp index b4fe2273f..72f08ae8e 100644 --- a/retroshare-gui/src/gui/gxs/GxsGroupFeedItem.cpp +++ b/retroshare-gui/src/gui/gxs/GxsGroupFeedItem.cpp @@ -31,6 +31,8 @@ * #define DEBUG_ITEM 1 **/ +const uint GxsGroupFeedItem::GROUP_ITEM_LOADING_TIMEOUT_ms = 2000; + GxsGroupFeedItem::GxsGroupFeedItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsGroupId &groupId, bool isHome, RsGxsIfaceHelper *iface, bool /*autoUpdate*/) : FeedItem(feedHolder,feedId,NULL) { diff --git a/retroshare-gui/src/gui/gxs/GxsGroupFeedItem.h b/retroshare-gui/src/gui/gxs/GxsGroupFeedItem.h index 653d62bb1..63e5907d6 100644 --- a/retroshare-gui/src/gui/gxs/GxsGroupFeedItem.h +++ b/retroshare-gui/src/gui/gxs/GxsGroupFeedItem.h @@ -60,6 +60,7 @@ protected slots: protected: bool mIsHome; RsGxsIfaceHelper *mGxsIface; + static const uint GROUP_ITEM_LOADING_TIMEOUT_ms ; private slots: /* RsGxsUpdateBroadcastBase */ From b9cd766707a59586b5c306e989c2a9cb28fe4634 Mon Sep 17 00:00:00 2001 From: csoler Date: Thu, 30 Oct 2025 19:53:55 +0100 Subject: [PATCH 02/13] removed unused code --- .../gui/Posted/PostedListWidgetWithModel.cpp | 186 ------------------ 1 file changed, 186 deletions(-) diff --git a/retroshare-gui/src/gui/Posted/PostedListWidgetWithModel.cpp b/retroshare-gui/src/gui/Posted/PostedListWidgetWithModel.cpp index 1cd7884c5..aec3c7bdb 100644 --- a/retroshare-gui/src/gui/Posted/PostedListWidgetWithModel.cpp +++ b/retroshare-gui/src/gui/Posted/PostedListWidgetWithModel.cpp @@ -942,196 +942,10 @@ void PostedListWidgetWithModel::insertBoardDetails(const RsPostedGroup& group) } ui->infoDistribution->setText(distrib_string); -#ifdef TODO - ui->infoWidget->show(); - ui->feedWidget->hide(); - ui->fileWidget->hide(); - - //ui->feedToolButton->setEnabled(false); - //ui->fileToolButton->setEnabled(false); -#endif } -#ifdef TODO -int PostedListWidgetWithModel::viewMode() -{ - if (ui->feedToolButton->isChecked()) { - return VIEW_MODE_FEEDS; - } else if (ui->fileToolButton->isChecked()) { - return VIEW_MODE_FILES; - } - - /* Default */ - return VIEW_MODE_FEEDS; -} -#endif - -#ifdef TODO -/*static*/ bool PostedListWidgetWithModel::filterItem(FeedItem *feedItem, const QString &text, int filter) -{ - GxsChannelPostItem *item = dynamic_cast(feedItem); - if (!item) { - return true; - } - - bool bVisible = text.isEmpty(); - - if (!bVisible) - { - switch(filter) - { - case FILTER_TITLE: - bVisible = item->getTitleLabel().contains(text,Qt::CaseInsensitive); - break; - case FILTER_MSG: - bVisible = item->getMsgLabel().contains(text,Qt::CaseInsensitive); - break; - case FILTER_FILE_NAME: - { - std::list fileItems = item->getFileItems(); - std::list::iterator lit; - for(lit = fileItems.begin(); lit != fileItems.end(); ++lit) - { - SubFileItem *fi = *lit; - QString fileName = QString::fromUtf8(fi->FileName().c_str()); - bVisible = (bVisible || fileName.contains(text,Qt::CaseInsensitive)); - } - break; - } - default: - bVisible = true; - break; - } - } - - return bVisible; -} - -void PostedListWidget::createPostItemFromMetaData(const RsGxsMsgMetaData& meta,bool related) -{ - GxsChannelPostItem *item = NULL; - RsGxsChannelPost post; - - if(!meta.mOrigMsgId.isNull()) - { - FeedItem *feedItem = ui->feedWidget->findFeedItem(GxsChannelPostItem::computeIdentifier(meta.mOrigMsgId)) ; - item = dynamic_cast(feedItem); - - if(item) - { - post = feedItem->post(); - ui->feedWidget->removeFeedItem(item) ; - - post.mOlderVersions.insert(post.mMeta.mMsgId); - - GxsChannelPostItem *item = new GxsChannelPostItem(this, 0, post, true, false,post.mOlderVersions); - ui->feedWidget->addFeedItem(item, ROLE_PUBLISH, DateTime::DateTimeFromTime_t(post.mMeta.mPublishTs)); - - return ; - } - } - - if (related) - { - FeedItem *feedItem = ui->feedWidget->findFeedItem(GxsChannelPostItem::computeIdentifier(meta.mMsgId)) ; - item = dynamic_cast(feedItem); - } - if (item) - { - item->setPost(post); - ui->feedWidget->setSort(item, ROLE_PUBLISH, DateTime::DateTimeFromTime_t(meta.mPublishTs)); - } - else - { - GxsChannelPostItem *item = new GxsChannelPostItem(this, 0, meta.mGroupId,meta.mMsgId, true, true); - ui->feedWidget->addFeedItem(item, ROLE_PUBLISH, DateTime::DateTimeFromTime_t(post.mMeta.mPublishTs)); - } -#ifdef TODO - ui->fileWidget->addFiles(post, related); -#endif -} - -void PostedListWidget::createPostItem(const RsGxsChannelPost& post, bool related) -{ - GxsChannelPostItem *item = NULL; - - const RsMsgMetaData& meta(post.mMeta); - - if(!meta.mOrigMsgId.isNull()) - { - FeedItem *feedItem = ui->feedWidget->findFeedItem(GxsChannelPostItem::computeIdentifier(meta.mOrigMsgId)) ; - item = dynamic_cast(feedItem); - - if(item) - { - std::set older_versions(item->olderVersions()); // we make a copy because the item will be deleted - ui->feedWidget->removeFeedItem(item) ; - - older_versions.insert(meta.mMsgId); - - GxsChannelPostItem *item = new GxsChannelPostItem(this, 0, mGroup.mMeta,meta.mMsgId, true, false,older_versions); - ui->feedWidget->addFeedItem(item, ROLE_PUBLISH, DateTime::DateTimeFromTime_t(meta.mPublishTs)); - - return ; - } - } - - if (related) - { - FeedItem *feedItem = ui->feedWidget->findFeedItem(GxsChannelPostItem::computeIdentifier(meta.mMsgId)) ; - item = dynamic_cast(feedItem); - } - if (item) - { - item->setPost(post); - ui->feedWidget->setSort(item, ROLE_PUBLISH, DateTime::DateTimeFromTime_t(meta.mPublishTs)); - } - else - { - GxsChannelPostItem *item = new GxsChannelPostItem(this, 0, mGroup.mMeta,meta.mMsgId, true, true); - ui->feedWidget->addFeedItem(item, ROLE_PUBLISH, DateTime::DateTimeFromTime_t(meta.mPublishTs)); - } - - ui->fileWidget->addFiles(post, related); -} - -void PostedListWidget::fillThreadCreatePost(const QVariant &post, bool related, int current, int count) -{ - /* show fill progress */ - if (count) { - ui->progressBar->setValue(current * ui->progressBar->maximum() / count); - } - - if (!post.canConvert()) { - return; - } - - createPostItem(post.value(), related); -} -#endif - void PostedListWidgetWithModel::blank() { -#ifdef TODO - ui->postButton->setEnabled(false); - ui->subscribeToolButton->setEnabled(false); - - ui->channelName_LB->setText(tr("No Channel Selected")); - ui->logoLabel->setPixmap(FilesDefs::getPixmapFromQtResourcePath(":/icons/png/channels.png")); - ui->infoPosts->setText(""); - ui->infoLastPost->setText(""); - ui->infoAdministrator->setText(""); - ui->infoDistribution->setText(""); - ui->infoCreated->setText(""); - ui->infoDescription->setText(""); - - mChannelPostsModel->clear(); - mChannelPostFilesModel->clear(); - ui->postDetails_TE->clear(); - ui->postLogo_LB->hide(); - ui->postName_LB->hide(); - ui->postTime_LB->hide(); -#endif groupNameChanged(QString()); } From c8a93d75f22e412cfc2e7d7b8d2c51939a1f4a71 Mon Sep 17 00:00:00 2001 From: csoler Date: Thu, 30 Oct 2025 19:55:44 +0100 Subject: [PATCH 03/13] fixed deferred loading of GxsChannelPostItem --- .../src/gui/feeds/GxsChannelPostItem.cpp | 220 +++--------------- .../src/gui/feeds/GxsChannelPostItem.h | 35 +-- 2 files changed, 53 insertions(+), 202 deletions(-) diff --git a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp index a50a0c46e..51772f125 100644 --- a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp +++ b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp @@ -45,37 +45,9 @@ * #define DEBUG_ITEM 1 ****/ -GxsChannelPostItem::GxsChannelPostItem(FeedHolder *feedHolder, uint32_t feedId, const RsGroupMetaData& group_meta, const RsGxsMessageId &messageId, bool isHome, bool autoUpdate,const std::set& older_versions) : - GxsFeedItem(feedHolder, feedId, group_meta.mGroupId, messageId, isHome, rsGxsChannels, autoUpdate), - mGroupMeta(group_meta) -{ - mLoadingGroup = false; - mLoadingMessage = false; - mLoadingComment = false; - - mPost.mMeta.mMsgId = messageId; // useful for uniqueIdentifer() before the post is loaded - mPost.mMeta.mGroupId = mGroupMeta.mGroupId; - - QVector v; - //bool self = false; - - for(std::set::const_iterator it(older_versions.begin());it!=older_versions.end();++it) - v.push_back(*it) ; - - if(older_versions.find(messageId) == older_versions.end()) - v.push_back(messageId); - - setMessageVersions(v) ; - setup(); - - // no call to loadGroup() here because we have it already. -} - GxsChannelPostItem::GxsChannelPostItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsGroupId& groupId, const RsGxsMessageId &messageId, bool isHome, bool autoUpdate,const std::set& older_versions) : GxsFeedItem(feedHolder, feedId, groupId, messageId, isHome, rsGxsChannels, autoUpdate) // this one should be in GxsFeedItem { - mPost.mMeta.mMsgId = messageId; // useful for uniqueIdentifer() before the post is loaded - QVector v; //bool self = false; @@ -85,55 +57,38 @@ GxsChannelPostItem::GxsChannelPostItem(FeedHolder *feedHolder, uint32_t feedId, if(older_versions.find(messageId) == older_versions.end()) v.push_back(messageId); - setMessageVersions(v) ; + mLoadingStatus = NO_DATA; + + setMessageVersions(v) ; setup(); - - loadGroup(); } -// GxsChannelPostItem::GxsChannelPostItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsChannelPost& post, bool isHome, bool autoUpdate,const std::set& older_versions) : -// GxsFeedItem(feedHolder, feedId, post.mMeta.mGroupId, post.mMeta.mMsgId, isHome, rsGxsChannels, autoUpdate) -// { -// mPost.mMeta.mMsgId.clear(); // security -// init(post.mMeta.mMsgId,older_versions) ; -// mPost = post ; -// } - -// void GxsChannelPostItem::init(const RsGxsMessageId& messageId,const std::set& older_versions) -// { -// QVector v; -// //bool self = false; -// -// for(std::set::const_iterator it(older_versions.begin());it!=older_versions.end();++it) -// v.push_back(*it) ; -// -// if(older_versions.find(messageId) == older_versions.end()) -// v.push_back(messageId); -// -// setMessageVersions(v) ; -// -// setup(); -// -// mLoaded = false ; -// } - void GxsChannelPostItem::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(!mLoaded) - { - mLoaded = true ; + if(mLoadingStatus != FILLED && !mGroupMeta.mGroupId.isNull() && !mPost.mMeta.mMsgId.isNull() ) + mLoadingStatus = HAS_DATA; - std::set older_versions; // not so nice. We need to use std::set everywhere - for(auto& m:messageVersions()) - older_versions.insert(m); + if(mGroupMeta.mGroupId.isNull() && !mLoadingGroup) + requestGroup(); - fill(); - requestMessage(); - requestComment(); - } + if(mPost.mMeta.mMsgId.isNull() && !mLoadingMessage) + requestMessage(); + + switch(mLoadingStatus) + { + case FILLED: + case NO_DATA: + default: + break; + + case HAS_DATA: + fill(); + mLoadingStatus = FILLED; + break; + } GxsFeedItem::paintEvent(e) ; } @@ -142,13 +97,12 @@ GxsChannelPostItem::~GxsChannelPostItem() { auto timeout = std::chrono::steady_clock::now() + std::chrono::milliseconds(GROUP_ITEM_LOADING_TIMEOUT_ms); - while( (mLoadingGroup || mLoadingMessage || mLoadingComment) + while( (mLoadingGroup || mLoadingMessage) && std::chrono::steady_clock::now() < timeout) { RsDbg() << __PRETTY_FUNCTION__ << " is Waiting for " << (mLoadingGroup ? "Group " : "") << (mLoadingMessage ? "Message " : "") - << (mLoadingComment ? "Comment " : "") << "loading." << std::endl; std::this_thread::sleep_for(std::chrono::milliseconds(100)); } @@ -188,9 +142,7 @@ void GxsChannelPostItem::setup() setAttribute(Qt::WA_DeleteOnClose, true); - mInFill = false; mCloseOnRead = false; - mLoaded = false; /* clear ui */ ui->titleLabel->setText(tr("Loading...")); @@ -210,7 +162,7 @@ void GxsChannelPostItem::setup() connect(ui->downloadButton, SIGNAL(clicked()), this, SLOT(download())); // HACK FOR NOW. ui->commentButton->hide();// hidden until properly enabled. - connect(ui->commentButton, SIGNAL(clicked()), this, SLOT(loadComments())); +// connect(ui->commentButton, SIGNAL(clicked()), this, SLOT(loadComments())); connect(ui->playButton, SIGNAL(clicked()), this, SLOT(play(void))); //connect(ui->editButton, SIGNAL(clicked()), this, SLOT(edit(void))); @@ -246,22 +198,9 @@ void GxsChannelPostItem::setup() } -bool GxsChannelPostItem::setPost(const RsGxsChannelPost &post, bool doFill) +bool GxsChannelPostItem::setPost(const RsGxsChannelPost &post) { - if (groupId() != post.mMeta.mGroupId || messageId() != post.mMeta.mMsgId) { - std::cerr << "GxsChannelPostItem::setPost() - Wrong id, cannot set post"; - std::cerr << std::endl; - return false; - } - mPost = post; - - if (doFill) { - fill(); - } - - updateItem(); - return true; } @@ -282,18 +221,10 @@ QString GxsChannelPostItem::groupName() return QString::fromUtf8(mGroupMeta.mGroupName.c_str()); } -void GxsChannelPostItem::loadComments() -{ - QString title = QString::fromUtf8(mPost.mMeta.mMsgName.c_str()); - comments(title); -} - void GxsChannelPostItem::loadGroup() { -#ifdef DEBUG_ITEM - std::cerr << "GxsChannelGroupItem::loadGroup()"; - std::cerr << std::endl; -#endif + std::cerr << "GxsChannelGroupItem::loadGroup()" << std::endl; + mLoadingGroup = true; RsThread::async([this]() @@ -305,14 +236,14 @@ void GxsChannelPostItem::loadGroup() if(!rsGxsChannels->getChannelsInfo(groupIds,groups)) // would be better to call channel Summaries for a single group { - RsErr() << "GxsGxsChannelGroupItem::loadGroup() ERROR getting data" << std::endl; + RsErr() << "GxsGxsChannelGroupItem::loadGroup() ERROR getting data for group " << groupId() << std::endl; mLoadingGroup = false; return; } if (groups.size() != 1) { - std::cerr << "GxsGxsChannelGroupItem::loadGroup() Wrong number of Items"; + std::cerr << "GxsGxsChannelGroupItem::loadGroup() Wrong number of Items for group " << groupId() ; std::cerr << std::endl; mLoadingGroup = false; return; @@ -328,6 +259,8 @@ void GxsChannelPostItem::loadGroup() mGroupMeta = group.mMeta; mLoadingGroup = false; + update(); // this triggers a paintEvent if needed. + }, this ); }); } @@ -365,28 +298,9 @@ void GxsChannelPostItem::loadMessage() { setPost(post); mLoadingMessage = false; + update(); // this triggers a paintEvent if needed. + }, this ); - } - else if(comments.size() == 1) - { - const RsGxsComment& cmt = comments[0]; -#ifdef DEBUG_ITEM - std::cerr << (void*)this << ": Obtained comment, setting messageId to threadID = " << cmt.mMeta.mThreadId << std::endl; -#endif - - RsQThreadUtils::postToObject( [cmt,this]() - { - ui->newCommentLabel->show(); - ui->commLabel->show(); - ui->commLabel->setText(QString::fromUtf8(cmt.mComment.c_str())); - - // Change this item to be uploaded with thread element. Note: this is terrible coding. - setMessageId(cmt.mMeta.mThreadId); - mLoadingMessage = false; - - requestMessage(); - }, this ); - } else { @@ -399,55 +313,12 @@ void GxsChannelPostItem::loadMessage() { removeItem(); mLoadingMessage = false; + update(); // this triggers a paintEvent if needed. }, this ); } }); } -void GxsChannelPostItem::loadComment() -{ -#ifdef DEBUG_ITEM - std::cerr << "GxsChannelPostItem::loadComment()"; - std::cerr << std::endl; -#endif - mLoadingComment = true; - - RsThread::async([this]() - { - // 1 - get group data - - std::set msgIds; - - for(auto MsgId: messageVersions()) - msgIds.insert(MsgId); - - std::vector posts; - std::vector comments; - - if(! rsGxsChannels->getChannelComments( groupId(),msgIds,comments)) - { - RsErr() << "GxsGxsChannelGroupItem::loadGroup() ERROR getting data" << std::endl; - mLoadingComment = false; - return; - } - - int comNb = comments.size(); - - RsQThreadUtils::postToObject( [comNb,this]() - { - QString sComButText = tr("Comment"); - if (comNb == 1) - sComButText = sComButText.append("(1)"); - else if(comNb > 1) - sComButText = tr("Comments ").append("(%1)").arg(comNb); - - ui->commentButton->setText(sComButText); - mLoadingComment = false; - - }, this ); - }); -} - void GxsChannelPostItem::fill() { #ifdef DEBUG_ITEM @@ -455,8 +326,6 @@ void GxsChannelPostItem::fill() std::cerr << std::endl; #endif - mInFill = true; - QString title; QString msgText; //float f = QFontMetricsF(font()).height()/14.0 ; @@ -559,21 +428,6 @@ void GxsChannelPostItem::fill() ui->commentButton->hide(); } -// THIS CODE IS doesn't compile - disabling until fixed. -#if 0 - if (post.mComments) - { - QString commentText = QString::number(post.mComments); - commentText += " "; - commentText += tr("Comments"); - ui->commentButton->setText(commentText); - } - else - { - ui->commentButton->setText(tr("Comment")); - } -#endif - } else { @@ -639,8 +493,6 @@ void GxsChannelPostItem::fill() QLayout *layout = ui->expandFrame->layout(); layout->addWidget(fi); } - - mInFill = false; } void GxsChannelPostItem::fillExpandFrame() @@ -871,10 +723,6 @@ void GxsChannelPostItem::play() void GxsChannelPostItem::readToggled(bool /*checked*/) { - if (mInFill) { - return; - } - mCloseOnRead = false; RsGxsGrpMsgIdPair msgPair = std::make_pair(groupId(), messageId()); diff --git a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.h b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.h index b3e7843c0..de2a50559 100644 --- a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.h +++ b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.h @@ -44,17 +44,25 @@ public: GxsChannelPostItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsGroupId& groupId, const RsGxsMessageId &messageId, bool isHome, bool autoUpdate, const std::set& older_versions = std::set()); +#ifdef UNUSED // This one is used in channel thread widget. We don't want the group data to reload at every post, so we load it in the hosting // GxsChannelsPostsWidget and pass it to created items. GxsChannelPostItem(FeedHolder *feedHolder, uint32_t feedId, const RsGroupMetaData& group, const RsGxsMessageId &messageId, bool isHome, bool autoUpdate, const std::set& older_versions = std::set()); +#endif virtual ~GxsChannelPostItem(); uint64_t uniqueIdentifier() const override { return hash_64bits("GxsChannelPostItem " + messageId().toStdString()) ; } - bool setGroup(const RsGxsChannelGroup& group, bool doFill = true); - bool setPost(const RsGxsChannelPost& post, bool doFill = true); +protected: + enum LoadingStatus { + NO_DATA = 0x00, + HAS_DATA = 0x01, + FILLED = 0x02 + }; + + bool setPost(const RsGxsChannelPost& post); //void setFileCleanUpWarning(uint32_t time_left); @@ -62,19 +70,17 @@ public: QString getMsgLabel(); const std::list &getFileItems() {return mFileItems; } - bool isLoaded() const {return mLoaded;}; bool isUnread() const ; void setReadStatus(bool isNew, bool isUnread); const std::set& olderVersions() const { return mPost.mOlderVersions; } static uint64_t computeIdentifier(const RsGxsMessageId& msgid) { return hash64("GxsChannelPostItem " + msgid.toStdString()) ; } -protected: //void init(const RsGxsMessageId& messageId,const std::set& older_versions); /* FeedItem */ - virtual void doExpand(bool open); - virtual void expandFill(bool first); + virtual void doExpand(bool open) override; + virtual void expandFill(bool first) override; // This does nothing except triggering the loading of the post data and comments. This function is mainly used to detect // when the post is actually made visible. @@ -82,14 +88,14 @@ 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_CHANNEL; } + virtual RetroShareLink::enumType getLinkType() override{ return RetroShareLink::TYPE_CHANNEL; } /* GxsFeedItem */ - virtual QString messageName(); - virtual void loadMessage(); - virtual void loadComment(); + virtual QString messageName() override; + virtual void loadMessage() override; + virtual void loadComment() override {} private slots: /* default stuff */ @@ -98,7 +104,6 @@ private slots: void download(); void play(); void edit(); - void loadComments(); void readToggled(bool checked); @@ -117,14 +122,12 @@ private: void fillExpandFrame(); private: - bool mInFill; bool mCloseOnRead; - bool mLoaded; + + LoadingStatus mLoadingStatus; bool mLoadingMessage; bool mLoadingGroup; - bool mLoadingComment; - RsGroupMetaData mGroupMeta; RsGxsChannelPost mPost; From c8dbf34a141775a1c7c954f17788fce8cd864783 Mon Sep 17 00:00:00 2001 From: csoler Date: Fri, 31 Oct 2025 19:49:39 +0100 Subject: [PATCH 04/13] fixed ChannelsCommentsItem --- .../src/gui/feeds/ChannelsCommentsItem.cpp | 347 ++++++++---------- .../src/gui/feeds/ChannelsCommentsItem.h | 49 ++- .../src/gui/feeds/GxsChannelPostItem.cpp | 45 +-- .../src/gui/feeds/GxsChannelPostItem.h | 4 - 4 files changed, 180 insertions(+), 265 deletions(-) diff --git a/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.cpp b/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.cpp index ed2ce468f..5c112689a 100644 --- a/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.cpp +++ b/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.cpp @@ -49,39 +49,14 @@ * #define DEBUG_ITEM 1 ****/ -// ChannelsCommentsItem::ChannelsCommentsItem(FeedHolder *feedHolder, uint32_t feedId, const RsGroupMetaData& group_meta, const RsGxsMessageId &messageId, bool isHome, bool autoUpdate,const std::set& older_versions) : -// GxsFeedItem(feedHolder, feedId, group_meta.mGroupId, messageId, isHome, rsGxsChannels, autoUpdate), -// mGroupMeta(group_meta) -// { -// mLoadingGroup = false; -// mLoadingMessage = false; -// mLoadingComment = false; -// -// mPost.mMeta.mMsgId = messageId; // useful for uniqueIdentifer() before the post is loaded -// mPost.mMeta.mGroupId = mGroupMeta.mGroupId; -// -// QVector v; -// //bool self = false; -// -// for(std::set::const_iterator it(older_versions.begin());it!=older_versions.end();++it) -// v.push_back(*it) ; -// -// if(older_versions.find(messageId) == older_versions.end()) -// v.push_back(messageId); -// -// setMessageVersions(v) ; -// setup(); -// -// // no call to loadGroup() here because we have it already. -// } - ChannelsCommentsItem::ChannelsCommentsItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsGroupId& groupId, const RsGxsMessageId &commentId, const RsGxsMessageId &threadId, bool isHome, bool autoUpdate) : GxsFeedItem(feedHolder, feedId, groupId, commentId, isHome, rsGxsChannels, autoUpdate), // this one should be in GxsFeedItem mThreadId(threadId) { - mLoading= false; - - QVector v; + mLoadingStatus = NO_DATA; + mLoadingComment = false; + mLoadingGroup = false; + mLoadingMessage = false; setup(); } @@ -91,10 +66,28 @@ void ChannelsCommentsItem::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(!mLoaded) - { - mLoaded = true ; - load(); + if(mLoadingStatus != FILLED && !mGroupMeta.mGroupId.isNull() && !mComment.mMeta.mMsgId.isNull()) + mLoadingStatus = HAS_DATA; + + if(mGroupMeta.mGroupId.isNull() && !mLoadingGroup) + loadGroupData(); + + if(mComment.mMeta.mMsgId.isNull() && !mLoadingComment) + loadCommentData(); + + if(mPost.mMeta.mMsgId.isNull() && !mLoadingMessage) + loadMessageData(); + + switch(mLoadingStatus) + { + case FILLED: + case NO_DATA: + default: + break; + case HAS_DATA: + fill(); + mLoadingStatus = FILLED; + break; } GxsFeedItem::paintEvent(e) ; @@ -104,9 +97,14 @@ ChannelsCommentsItem::~ChannelsCommentsItem() { auto timeout = std::chrono::steady_clock::now() + std::chrono::milliseconds(GROUP_ITEM_LOADING_TIMEOUT_ms); - while( mLoading && std::chrono::steady_clock::now() < timeout ) + while( (mLoadingGroup || mLoadingComment) + && std::chrono::steady_clock::now() < timeout ) { - RsDbg() << __PRETTY_FUNCTION__ << " is Waiting for data to load " << std::endl; + RsDbg() << __PRETTY_FUNCTION__ << " is Waiting for data to load " + << (mLoadingGroup ? "Group " : "") + << (mLoadingMessage ? "Message " : "") + << (mLoadingComment ? "Comment " : "") + << std::endl; std::this_thread::sleep_for(std::chrono::milliseconds(100)); } @@ -115,7 +113,7 @@ ChannelsCommentsItem::~ChannelsCommentsItem() bool ChannelsCommentsItem::isUnread() const { - return IS_MSG_UNREAD(mPost.mMeta.mMsgStatus) ; + return IS_MSG_UNREAD(mComment.mMeta.mMsgStatus) ; } void ChannelsCommentsItem::setup() @@ -141,9 +139,7 @@ void ChannelsCommentsItem::setup() setAttribute(Qt::WA_DeleteOnClose, true); - mInFill = false; mCloseOnRead = false; - mLoaded = false; /* clear ui */ ui->datetimeLabel->clear(); @@ -178,33 +174,6 @@ void ChannelsCommentsItem::setup() ui->expandFrame->hide(); } -bool ChannelsCommentsItem::setPost(const RsGxsChannelPost& post, bool doFill) -{ - mPost = post; - - if (doFill) - fill(); - - return true; -} -bool ChannelsCommentsItem::setMissingPost() -{ - fill(true); - return true; -} - -QString ChannelsCommentsItem::getTitleLabel() -{ - return QString::fromUtf8(mPost.mMeta.mMsgName.c_str()); -} - -QString ChannelsCommentsItem::getMsgLabel() -{ - //return RsHtml().formatText(NULL, QString::fromUtf8(mPost.mMsg.c_str()), RSHTML_FORMATTEXT_EMBED_SMILEYS | RSHTML_FORMATTEXT_EMBED_LINKS); - // Disabled, because emoticon replacement kills performance. - return QString::fromUtf8(mPost.mMsg.c_str()); -} - QString ChannelsCommentsItem::groupName() { return QString::fromUtf8(mGroupMeta.mGroupName.c_str()); @@ -219,93 +188,109 @@ void ChannelsCommentsItem::loadComments() return ; MainWindow::showWindow(MainWindow::Channels); - channelDialog->navigate(mPost.mMeta.mGroupId, mPost.mMeta.mMsgId); + channelDialog->navigate(mComment.mMeta.mGroupId, mComment.mMeta.mMsgId); } -void ChannelsCommentsItem::loadGroup() +void ChannelsCommentsItem::loadGroupData() { -//#ifdef DEBUG_ITEM -// std::cerr << "GxsChannelGroupItem::loadGroup()"; -// std::cerr << std::endl; -//#endif -// if(mLoading) -// return; -// -// mLoading= true; -// -// std::cerr << "Loading group" << std::endl; -// RsThread::async([this]() -// { -// // 1 - get group data -// -// std::vector groups; -// const std::list groupIds = { groupId() }; -// -// if(!rsGxsChannels->getChannelsInfo(groupIds,groups)) // would be better to call channel Summaries for a single group -// { -// RsErr() << "GxsGxsChannelGroupItem::loadGroup() ERROR getting data" << std::endl; -// return; -// } -// -// if (groups.size() != 1) -// { -// std::cerr << "GxsGxsChannelGroupItem::loadGroup() Wrong number of Items"; -// std::cerr << std::endl; -// return; -// } -// RsGxsChannelGroup group(groups[0]); -// -// RsQThreadUtils::postToObject( [group,this]() -// { -// /* Here it goes any code you want to be executed on the Qt Gui -// * thread, for example to update the data model with new information -// * after a blocking call to RetroShare API complete */ -// -// mGroupMeta = group.mMeta; -// mLoading= false; -// -// std::cerr << "End loading group" << std::endl; -// }, this ); -// }); -} -void ChannelsCommentsItem::load() -{ - // This function loads everything that's needed: - // - the comment text - // - the comment parent message + std::cerr << "GxsChannelGroupItem::loadGroup()" << std::endl; -#ifdef DEBUG_ITEM - std::cerr << "ChannelsCommentsItem::loadMessage()"; - std::cerr << std::endl; -#endif - if(mLoading) - return; - - mLoading= true; + mLoadingGroup = true; RsThread::async([this]() - { - // 1 - get group meta data + { + // 1 - get group data std::vector groups; const std::list groupIds = { groupId() }; if(!rsGxsChannels->getChannelsInfo(groupIds,groups)) // would be better to call channel Summaries for a single group { - RsErr() << "GxsGxsChannelGroupItem::loadGroup() ERROR getting data" << std::endl; - mLoading= false; + RsErr() << "GxsGxsChannelGroupItem::loadGroup() ERROR getting data for group " << groupId() << std::endl; + mLoadingGroup = false; return; } if (groups.size() != 1) { - std::cerr << "GxsGxsChannelGroupItem::loadGroup() Wrong number of Items" << std::endl; - mLoading= false; + std::cerr << "GxsGxsChannelGroupItem::loadGroup() Wrong number of Items for group " << groupId() ; + std::cerr << std::endl; + mLoadingGroup = false; return; } RsGxsChannelGroup group(groups[0]); - // 2 - get message and comment data + RsQThreadUtils::postToObject( [group,this]() + { + /* Here it goes any code you want to be executed on the Qt Gui + * thread, for example to update the data model with new information + * after a blocking call to RetroShare API complete */ + + mGroupMeta = group.mMeta; + mLoadingGroup = false; + + update(); // this triggers a paintEvent if needed. + + }, this ); + }); +} +void ChannelsCommentsItem::loadMessageData() +{ +#ifdef DEBUG_ITEM + std::cerr << "ChannelsCommentsItem::loadCommentData()"; + std::cerr << std::endl; +#endif + mLoadingMessage = true; + + RsThread::async([this]() + { + // 1 - get message and comment data + + std::vector posts; + std::vector comments; + std::vector votes; + + if(! rsGxsChannels->getChannelContent( groupId(), std::set( { mThreadId } ),posts,comments,votes)) + { + RsErr() << "GxsGxsChannelGroupItem::loadMessage() ERROR getting data" << std::endl; + mLoadingMessage = false; + return; + } + + // now that everything is in place, update the UI + + RsQThreadUtils::postToObject( [posts,this]() + { + /* Here it goes any code you want to be executed on the Qt Gui + * thread, for example to update the data model with new information + * after a blocking call to RetroShare API complete */ + + if(posts.size()!=1) // the original post cannot be found. Removing the comment item. + { + mLoadingMessage = false; + removeItem(); + return; + } + + mPost = posts[0]; + mLoadingMessage = false; + + update(); + + }, this ); + }); +} +void ChannelsCommentsItem::loadCommentData() +{ +#ifdef DEBUG_ITEM + std::cerr << "ChannelsCommentsItem::loadCommentData()"; + std::cerr << std::endl; +#endif + mLoadingComment = true; + + RsThread::async([this]() + { + // 1 - get message and comment data std::vector posts; std::vector comments; @@ -313,53 +298,28 @@ void ChannelsCommentsItem::load() if(! rsGxsChannels->getChannelContent( groupId(), std::set( { messageId(),mThreadId } ),posts,comments,votes)) { - RsErr() << "GxsGxsChannelGroupItem::loadGroup() ERROR getting data" << std::endl; - mLoading= false; + RsErr() << "GxsGxsChannelGroupItem::loadComment() ERROR getting data" << std::endl; + mLoadingComment = false; return; } + if(comments.size()!=1) + { + mLoadingComment = false; + return; + } - // now that everything is in place, update the UI + // now that everything is in place, update the UI - RsQThreadUtils::postToObject( [group,posts,comments,this]() + RsQThreadUtils::postToObject( [comments,this]() { /* Here it goes any code you want to be executed on the Qt Gui * thread, for example to update the data model with new information * after a blocking call to RetroShare API complete */ - mGroupMeta = group.mMeta; + mComment = comments[0]; + mLoadingComment = false; - if(comments.size()!=1) - { - mLoading=false; - removeItem(); - } - - RsGxsComment cmt(comments[0]); - - uint32_t autorized_lines = (int)floor( (ui->avatarLabel->height() - ui->button_HL->sizeHint().height()) - / QFontMetricsF(ui->subjectLabel->font()).height()); - - ui->commLabel->setText(RsHtml().formatText(NULL, RsStringUtil::CopyLines(QString::fromUtf8(cmt.mComment.c_str()), autorized_lines), RSHTML_FORMATTEXT_EMBED_LINKS)); - ui->nameLabel->setId(cmt.mMeta.mAuthorId); - ui->datetimeLabel->setText(DateTime::formatLongDateTime(cmt.mMeta.mPublishTs)); - - RsIdentityDetails idDetails ; - rsIdentity->getIdDetails(cmt.mMeta.mAuthorId,idDetails); - QPixmap pixmap ; - - if(idDetails.mAvatar.mSize == 0 || !GxsIdDetails::loadPixmapFromData(idDetails.mAvatar.mData, idDetails.mAvatar.mSize, pixmap,GxsIdDetails::SMALL)) - pixmap = GxsIdDetails::makeDefaultIcon(cmt.mMeta.mAuthorId,GxsIdDetails::LARGE); - ui->avatarLabel->setPixmap(pixmap); - - //Change this item to be uploaded with thread element. This is really bad practice. - - if (posts.size() == 1) - setPost(posts[0]); - else - setMissingPost(); - - emit sizeChanged(this); - mLoading=false; + update(); }, this ); }); @@ -372,11 +332,9 @@ void ChannelsCommentsItem::fill(bool missing_post) std::cerr << std::endl; #endif - mInFill = true; - if (!mIsHome) { - if (mCloseOnRead && !IS_MSG_NEW(mPost.mMeta.mMsgStatus)) { + if (mCloseOnRead && !IS_MSG_NEW(mComment.mMeta.mMsgStatus)) { removeItem(); } @@ -393,13 +351,13 @@ void ChannelsCommentsItem::fill(bool missing_post) ui->readButton->hide(); - if (IS_MSG_NEW(mPost.mMeta.mMsgStatus)) { + if (IS_MSG_NEW(mComment.mMeta.mMsgStatus)) { mCloseOnRead = true; } } else { - if(missing_post) + if(mPost.mMeta.mMsgId.isNull()) ui->subjectLabel->setText("[" + QObject::tr("Missing channel post")+"]"); else ui->subjectLabel->setText(RsStringUtil::CopyLines(QString::fromUtf8(mPost.mMsg.c_str()), 2)) ; @@ -415,7 +373,7 @@ void ChannelsCommentsItem::fill(bool missing_post) { ui->readButton->setVisible(true); - setReadStatus(IS_MSG_NEW(mPost.mMeta.mMsgStatus), IS_MSG_UNREAD(mPost.mMeta.mMsgStatus) || IS_MSG_NEW(mPost.mMeta.mMsgStatus)); + setReadStatus(IS_MSG_NEW(mComment.mMeta.mMsgStatus), IS_MSG_UNREAD(mComment.mMeta.mMsgStatus) || IS_MSG_NEW(mComment.mMeta.mMsgStatus)); } else { @@ -424,31 +382,44 @@ void ChannelsCommentsItem::fill(bool missing_post) mCloseOnRead = false; } - - mInFill = false; + uint32_t autorized_lines = (int)floor( (ui->avatarLabel->height() - ui->button_HL->sizeHint().height()) + / QFontMetricsF(ui->subjectLabel->font()).height()); + + ui->commLabel->setText(RsHtml().formatText(NULL, RsStringUtil::CopyLines(QString::fromUtf8(mComment.mComment.c_str()), autorized_lines), RSHTML_FORMATTEXT_EMBED_LINKS)); + ui->nameLabel->setId(mComment.mMeta.mAuthorId); + ui->datetimeLabel->setText(DateTime::formatLongDateTime(mComment.mMeta.mPublishTs)); + + RsIdentityDetails idDetails ; + rsIdentity->getIdDetails(mComment.mMeta.mAuthorId,idDetails); + QPixmap pixmap ; + + if(idDetails.mAvatar.mSize == 0 || !GxsIdDetails::loadPixmapFromData(idDetails.mAvatar.mData, idDetails.mAvatar.mSize, pixmap,GxsIdDetails::SMALL)) + pixmap = GxsIdDetails::makeDefaultIcon(mComment.mMeta.mAuthorId,GxsIdDetails::LARGE); + ui->avatarLabel->setPixmap(pixmap); + } QString ChannelsCommentsItem::messageName() { - return QString::fromUtf8(mPost.mMeta.mMsgName.c_str()); + return QString::fromUtf8(mPost.mMeta.mMsgName.c_str()); } void ChannelsCommentsItem::setReadStatus(bool isNew, bool isUnread) { if (isNew) - mPost.mMeta.mMsgStatus |= GXS_SERV::GXS_MSG_STATUS_GUI_NEW; + mComment.mMeta.mMsgStatus |= GXS_SERV::GXS_MSG_STATUS_GUI_NEW; else - mPost.mMeta.mMsgStatus &= ~GXS_SERV::GXS_MSG_STATUS_GUI_NEW; + mComment.mMeta.mMsgStatus &= ~GXS_SERV::GXS_MSG_STATUS_GUI_NEW; if (isUnread) { - mPost.mMeta.mMsgStatus |= GXS_SERV::GXS_MSG_STATUS_GUI_UNREAD; + mComment.mMeta.mMsgStatus |= GXS_SERV::GXS_MSG_STATUS_GUI_UNREAD; whileBlocking(ui->readButton)->setChecked(true); ui->readButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/images/message-state-unread.png")); } else { - mPost.mMeta.mMsgStatus &= ~GXS_SERV::GXS_MSG_STATUS_GUI_UNREAD; + mComment.mMeta.mMsgStatus &= ~GXS_SERV::GXS_MSG_STATUS_GUI_UNREAD; whileBlocking(ui->readButton)->setChecked(false); ui->readButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/images/message-state-read.png")); } @@ -522,24 +493,18 @@ void ChannelsCommentsItem::unsubscribeChannel() void ChannelsCommentsItem::readToggled(bool /*checked*/) { - if (mInFill) { - return; - } - mCloseOnRead = false; RsGxsGrpMsgIdPair msgPair = std::make_pair(groupId(), messageId()); rsGxsChannels->setCommentReadStatus(msgPair, isUnread()); - - //setReadStatus(false, checked); // Updated by events } void ChannelsCommentsItem::makeDownVote() { RsGxsGrpMsgIdPair msgId; - msgId.first = mPost.mMeta.mGroupId; - msgId.second = mPost.mMeta.mMsgId; + msgId.first = mComment.mMeta.mGroupId; + msgId.second = mComment.mMeta.mMsgId; ui->voteUpButton->setEnabled(false); ui->voteDownButton->setEnabled(false); @@ -550,8 +515,8 @@ void ChannelsCommentsItem::makeDownVote() void ChannelsCommentsItem::makeUpVote() { RsGxsGrpMsgIdPair msgId; - msgId.first = mPost.mMeta.mGroupId; - msgId.second = mPost.mMeta.mMsgId; + msgId.first = mComment.mMeta.mGroupId; + msgId.second = mComment.mMeta.mMsgId; ui->voteUpButton->setEnabled(false); ui->voteDownButton->setEnabled(false); diff --git a/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.h b/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.h index c245cbca7..d8f38e1d4 100644 --- a/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.h +++ b/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.h @@ -50,34 +50,25 @@ public: bool isHome, bool autoUpdate); - // This one is used in channel thread widget. We don't want the group data to reload at every post, so we load it in the hosting - // GxsChannelsPostsWidget and pass it to created items. - // ChannelsCommentsItem(FeedHolder *feedHolder, uint32_t feedId, const RsGroupMetaData& group, const RsGxsMessageId &messageId, bool isHome, bool autoUpdate, const std::set& older_versions = std::set()); - virtual ~ChannelsCommentsItem(); uint64_t uniqueIdentifier() const override { return hash_64bits("ChannelsCommentsItem " + messageId().toStdString()) ; } - bool setGroup(const RsGxsChannelGroup& group, bool doFill = true); - bool setPost(const RsGxsChannelPost& post, bool doFill = true); - bool setMissingPost(); +protected: + enum LoadingStatus { + NO_DATA = 0x00, + HAS_DATA = 0x01, + FILLED = 0x02 + }; - QString getTitleLabel(); - QString getMsgLabel(); - - bool isLoaded() const {return mLoaded;}; bool isUnread() const ; void setReadStatus(bool isNew, bool isUnread); - const std::set& olderVersions() const { return mPost.mOlderVersions; } - static uint64_t computeIdentifier(const RsGxsMessageId& msgid) { return hash64("ChannelsCommentsItem " + msgid.toStdString()) ; } -protected: - //void init(const RsGxsMessageId& messageId,const std::set& older_versions); /* FeedItem */ - virtual void doExpand(bool open); - virtual void expandFill(bool first); + virtual void doExpand(bool open) override; + virtual void expandFill(bool first) override; // This does nothing except triggering the loading of the post data and comments. This function is mainly used to detect // when the post is actually made visible. @@ -85,12 +76,12 @@ protected: virtual void paintEvent(QPaintEvent *) override; /* GxsGroupFeedItem */ - virtual QString groupName(); - virtual void loadGroup() override; - virtual RetroShareLink::enumType getLinkType() { return RetroShareLink::TYPE_CHANNEL; } + virtual QString groupName() override; + virtual void loadGroup() override {} + virtual RetroShareLink::enumType getLinkType() override { return RetroShareLink::TYPE_CHANNEL; } /* GxsFeedItem */ - virtual QString messageName(); + virtual QString messageName() override; virtual void loadMessage() override {} virtual void loadComment() override {} @@ -110,19 +101,23 @@ signals: void vote(const RsGxsGrpMsgIdPair& msgId, bool up); private: - void load(); void setup(); void fill(bool missing_post=false); + void loadGroupData(); + void loadMessageData(); + void loadCommentData(); -private: - bool mInFill; bool mCloseOnRead; - bool mLoaded; - bool mLoading; + LoadingStatus mLoadingStatus; + + bool mLoadingComment; + bool mLoadingGroup; + bool mLoadingMessage; RsGroupMetaData mGroupMeta; - RsGxsChannelPost mPost; + RsGxsComment mComment; + RsGxsChannelPost mPost; RsGxsMessageId mThreadId; /** Qt Designer generated object */ diff --git a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp index 51772f125..703d5e6b9 100644 --- a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp +++ b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp @@ -58,6 +58,8 @@ GxsChannelPostItem::GxsChannelPostItem(FeedHolder *feedHolder, uint32_t feedId, v.push_back(messageId); mLoadingStatus = NO_DATA; + mLoadingMessage = false; + mLoadingGroup = false; setMessageVersions(v) ; setup(); @@ -173,8 +175,6 @@ void GxsChannelPostItem::setup() // hide voting buttons, backend is not implemented yet ui->voteUpButton->hide(); ui->voteDownButton->hide(); - //connect(ui-> voteUpButton, SIGNAL(clicked()), this, SLOT(makeUpVote())); - //connect(ui->voteDownButton, SIGNAL(clicked()), this, SLOT(makeDownVote())); ui->scoreLabel->hide(); @@ -533,22 +533,6 @@ void GxsChannelPostItem::setReadStatus(bool isNew, bool isUnread) ui->feedFrame->style()->polish( ui->feedFrame); } -// void GxsChannelPostItem::setFileCleanUpWarning(uint32_t time_left) -// { -// int hours = (int)time_left/3600; -// int minutes = (time_left - hours*3600)%60; -// -// ui->warning_label->setText(tr("Warning! You have less than %1 hours and %2 minute before this file is deleted Consider saving it.").arg( -// QString::number(hours)).arg(QString::number(minutes))); -// -// QFont warnFont = ui->warning_label->font(); -// warnFont.setBold(true); -// ui->warning_label->setFont(warnFont); -// -// ui->warn_image_label->setVisible(true); -// ui->warning_label->setVisible(true); -// } - void GxsChannelPostItem::updateItem() { /* fill in */ @@ -732,28 +716,3 @@ void GxsChannelPostItem::readToggled(bool /*checked*/) //setReadStatus(false, checked); // Updated by events } -void GxsChannelPostItem::makeDownVote() -{ - RsGxsGrpMsgIdPair msgId; - msgId.first = mPost.mMeta.mGroupId; - msgId.second = mPost.mMeta.mMsgId; - - ui->voteUpButton->setEnabled(false); - ui->voteDownButton->setEnabled(false); - - emit vote(msgId, false); -} - -void GxsChannelPostItem::makeUpVote() -{ - RsGxsGrpMsgIdPair msgId; - msgId.first = mPost.mMeta.mGroupId; - msgId.second = mPost.mMeta.mMsgId; - - ui->voteUpButton->setEnabled(false); - ui->voteDownButton->setEnabled(false); - - emit vote(msgId, true); -} - - diff --git a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.h b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.h index de2a50559..44cb27b37 100644 --- a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.h +++ b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.h @@ -76,7 +76,6 @@ protected: const std::set& olderVersions() const { return mPost.mOlderVersions; } static uint64_t computeIdentifier(const RsGxsMessageId& msgid) { return hash64("GxsChannelPostItem " + msgid.toStdString()) ; } - //void init(const RsGxsMessageId& messageId,const std::set& older_versions); /* FeedItem */ virtual void doExpand(bool open) override; @@ -110,9 +109,6 @@ private slots: void unsubscribeChannel(); void updateItem(); - void makeUpVote(); - void makeDownVote(); - signals: void vote(const RsGxsGrpMsgIdPair& msgId, bool up); From 785a83f62530dd94422d8fae6135db13fbdcda19 Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 1 Nov 2025 17:24:58 +0100 Subject: [PATCH 05/13] fixed GxsChannelGroupItem --- .../src/gui/feeds/GxsChannelGroupItem.cpp | 74 +++++++++++-------- .../src/gui/feeds/GxsChannelGroupItem.h | 29 +++++--- .../src/gui/feeds/GxsChannelPostItem.cpp | 8 +- .../src/gui/feeds/GxsChannelPostItem.h | 2 - 4 files changed, 64 insertions(+), 49 deletions(-) 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(); From f8061d452c0057b50a2ba8bd5bf67585e7f9e0b9 Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 1 Nov 2025 18:05:26 +0100 Subject: [PATCH 06/13] 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(); From 5e4249663e6bb4001accf8bb63b2b6a4fa8cab4d Mon Sep 17 00:00:00 2001 From: csoler Date: Sun, 2 Nov 2025 18:25:01 +0100 Subject: [PATCH 07/13] fixed GxsForumMsgItem --- .../src/gui/feeds/GxsForumMsgItem.cpp | 231 +++++++----------- .../src/gui/feeds/GxsForumMsgItem.h | 26 +- 2 files changed, 98 insertions(+), 159 deletions(-) diff --git a/retroshare-gui/src/gui/feeds/GxsForumMsgItem.cpp b/retroshare-gui/src/gui/feeds/GxsForumMsgItem.cpp index 2b56e9ba6..1d37e48b1 100644 --- a/retroshare-gui/src/gui/feeds/GxsForumMsgItem.cpp +++ b/retroshare-gui/src/gui/feeds/GxsForumMsgItem.cpp @@ -48,56 +48,88 @@ GxsForumMsgItem::GxsForumMsgItem(FeedHolder *feedHolder, uint32_t feedId, const mMessage.mMeta.mMsgId = messageId; // useful for uniqueIdentifier() before the post is actually loaded mMessage.mMeta.mGroupId = groupId; + mLoadingStatus = NO_DATA; + mLoadingGroup = false; mLoadingMessage = false; mLoadingSetAsRead = false; - mLoadingParentMessage = false; setup(); - - requestGroup(); - requestMessage(); } -GxsForumMsgItem::GxsForumMsgItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsForumGroup &group, const RsGxsForumMsg &post, bool isHome, bool autoUpdate) : - GxsFeedItem(feedHolder, feedId, post.mMeta.mGroupId, post.mMeta.mMsgId, isHome, rsGxsForums, autoUpdate) +// GxsForumMsgItem::GxsForumMsgItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsForumGroup &group, const RsGxsForumMsg &post, bool isHome, bool autoUpdate) : +// GxsFeedItem(feedHolder, feedId, post.mMeta.mGroupId, post.mMeta.mMsgId, isHome, rsGxsForums, autoUpdate) +// { +// #ifdef DEBUG_ITEM +// std::cerr << "GxsForumMsgItem::GxsForumMsgItem() Direct Load"; +// std::cerr << std::endl; +// #endif +// +// setup(); +// +// setGroup(group, false); +// setMessage(post); +// } + +// GxsForumMsgItem::GxsForumMsgItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsForumMsg &post, bool isHome, bool autoUpdate) : +// GxsFeedItem(feedHolder, feedId, post.mMeta.mGroupId, post.mMeta.mMsgId, isHome, rsGxsForums, autoUpdate) +// { +// #ifdef DEBUG_ITEM +// std::cerr << "GxsForumMsgItem::GxsForumMsgItem() Direct Load"; +// std::cerr << std::endl; +// #endif +// +// setup(); +// +// requestGroup(); +// setMessage(post); +// } + +void GxsForumMsgItem::paintEvent(QPaintEvent *e) { -#ifdef DEBUG_ITEM - std::cerr << "GxsForumMsgItem::GxsForumMsgItem() Direct Load"; - std::cerr << std::endl; -#endif + /* This method employs a trick to trigger a deferred loading. The post and group is requested only + * when actually displayed on the screen. */ - setup(); + if(mLoadingStatus != FILLED && !mGroup.mMeta.mGroupId.isNull() && !mMessage.mMeta.mMsgId.isNull()) + mLoadingStatus = HAS_DATA; - setGroup(group, false); - setMessage(post); -} + if(mGroup.mMeta.mGroupId.isNull() && !mLoadingGroup) + requestGroup(); -GxsForumMsgItem::GxsForumMsgItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsForumMsg &post, bool isHome, bool autoUpdate) : - GxsFeedItem(feedHolder, feedId, post.mMeta.mGroupId, post.mMeta.mMsgId, isHome, rsGxsForums, autoUpdate) -{ -#ifdef DEBUG_ITEM - std::cerr << "GxsForumMsgItem::GxsForumMsgItem() Direct Load"; - std::cerr << std::endl; -#endif + if(mMessage.mMeta.mMsgId.isNull() && !mLoadingMessage) + requestMessage(); - setup(); + switch(mLoadingStatus) + { + case FILLED: + case NO_DATA: + default: + break; - requestGroup(); - setMessage(post); + case HAS_DATA: + fillGroup(); + fillMessage(); + + if(!mParentMessage.mMeta.mMsgId.isNull()) + fillParentMessage(); + + mLoadingStatus = FILLED; + break; + } + + GxsFeedItem::paintEvent(e) ; } GxsForumMsgItem::~GxsForumMsgItem() { auto timeout = std::chrono::steady_clock::now() + std::chrono::milliseconds(GROUP_ITEM_LOADING_TIMEOUT_ms); - while( (mLoadingGroup || mLoadingMessage || mLoadingSetAsRead || mLoadingParentMessage) + while( (mLoadingGroup || mLoadingMessage || mLoadingSetAsRead) && std::chrono::steady_clock::now() < timeout) { RsDbg() << __PRETTY_FUNCTION__ << " is Waiting for " << (mLoadingGroup ? "Group " : "") << (mLoadingMessage ? "Message " : "") - << (mLoadingParentMessage ? "Parent message " : "") << (mLoadingSetAsRead ? "Set as read" : "") << "loading." << std::endl; std::this_thread::sleep_for(std::chrono::milliseconds(100)); @@ -113,7 +145,6 @@ void GxsForumMsgItem::setup() setAttribute(Qt::WA_DeleteOnClose, true); - mInFill = false; mCloseOnRead = false; /* clear ui */ @@ -144,41 +175,6 @@ void GxsForumMsgItem::setup() ui->parentFrame->hide(); } -bool GxsForumMsgItem::setGroup(const RsGxsForumGroup &group, bool doFill) -{ - if (groupId() != group.mMeta.mGroupId) { - std::cerr << "GxsForumMsgItem::setGroup() - Wrong id, cannot set post"; - std::cerr << std::endl; - return false; - } - - mGroup = group; - - if (doFill) - fillGroup(); - - return true; -} - -bool GxsForumMsgItem::setMessage(const RsGxsForumMsg &msg, bool doFill) -{ - if (groupId() != msg.mMeta.mGroupId || messageId() != msg.mMeta.mMsgId) { - std::cerr << "GxsForumMsgItem::setPost() - Wrong id, cannot set post"; - std::cerr << std::endl; - return false; - } - - mMessage = msg; - - if(! mMessage.mMeta.mParentId.isNull()) - loadParentMessage(mMessage.mMeta.mParentId); - - if(doFill) - fillMessage(); - - return true; -} - QString GxsForumMsgItem::groupName() { return QString::fromUtf8(mGroup.mMeta.mGroupName.c_str()); @@ -221,7 +217,7 @@ void GxsForumMsgItem::loadGroup() * thread, for example to update the data model with new information * after a blocking call to RetroShare API complete */ - setGroup(group); + mGroup = group; mLoadingGroup = false; }, this ); @@ -244,93 +240,50 @@ void GxsForumMsgItem::loadMessage() std::cerr << "Retrieving post data for post " << mThreadId << std::endl; #endif - std::vector msgs; - const std::list forumIds = { groupId() }; + auto getMessageData = [](const RsGxsGroupId& gid,const RsGxsMessageId& msg_id,RsGxsForumMsg& msg) -> bool + { + std::vector msgs; - if(!rsGxsForums->getForumContent(groupId(),std::set( { messageId() } ),msgs)) - { - std::cerr << "GxsForumMsgItem::loadMessage() ERROR getting data"; - std::cerr << std::endl; + if(!rsGxsForums->getForumContent(gid,std::set( { msg_id } ),msgs)) + return false; + + if (msgs.size() != 1) + return false; + + msg = msgs[0]; + + return true; + }; + + RsGxsForumMsg msg,parent_msg; + + if(!getMessageData(groupId(),messageId(),msg)) + { + std::cerr << "GxsForumMsgItem::loadMessage() ERROR getting message data"; mLoadingMessage = false; return; - } + } + // now load the parent message. If not found, it's not a problem. - if (msgs.size() != 1) - { - std::cerr << "GxsForumMsgItem::loadMessage() Wrong number of Items"; - std::cerr << std::endl; - mLoadingMessage = false; - return; - } - RsGxsForumMsg msg(msgs[0]); + if(!msg.mMeta.mParentId.isNull() && !getMessageData(groupId(),msg.mMeta.mParentId,parent_msg)) + std::cerr << "GxsForumMsgItem::loadMessage() ERROR getting parent message data. Maybe the parent msg is not available."; - RsQThreadUtils::postToObject( [msg,this]() + RsQThreadUtils::postToObject( [msg,parent_msg,this]() { /* Here it goes any code you want to be executed on the Qt Gui * thread, for example to update the data model with new information * after a blocking call to RetroShare API complete */ - setMessage(msg); + mMessage = msg; + mParentMessage = parent_msg; mLoadingMessage = false; }, this ); }); } -void GxsForumMsgItem::loadParentMessage(const RsGxsMessageId& parent_msg) -{ -#ifdef DEBUG_ITEM - std::cerr << "GxsForumMsgItem::loadParentMessage()"; - std::cerr << std::endl; -#endif - mLoadingParentMessage = true; - - RsThread::async([parent_msg,this]() - { - // 1 - get group data - -#ifdef DEBUG_FORUMS - std::cerr << "Retrieving post data for post " << mThreadId << std::endl; -#endif - - std::vector msgs; - const std::list forumIds = { groupId() }; - - if(!rsGxsForums->getForumContent(groupId(),std::set( { parent_msg } ),msgs)) - { - std::cerr << "GxsForumMsgItem::loadMessage() ERROR getting data"; - std::cerr << std::endl; - mLoadingParentMessage = false; - return; - } - - if (msgs.size() != 1) - { - std::cerr << "GxsForumMsgItem::loadMessage() Wrong number of Items"; - std::cerr << std::endl; - mLoadingParentMessage = false; - return; - } - RsGxsForumMsg msg(msgs[0]); - - RsQThreadUtils::postToObject( [msg,this]() - { - /* Here it goes any code you want to be executed on the Qt Gui - * thread, for example to update the data model with new information - * after a blocking call to RetroShare API complete */ - - mParentMessage = msg; - fillParentMessage(); - - mLoadingParentMessage = false; - - }, this ); - }); -} void GxsForumMsgItem::fillParentMessage() { - mInFill = true; - ui->parentFrame->hide(); RetroShareLink linkParent = RetroShareLink::createGxsMessageLink(RetroShareLink::TYPE_FORUM, mParentMessage.mMeta.mGroupId, mParentMessage.mMeta.mMsgId, QString::fromUtf8(mParentMessage.mMeta.mMsgName.c_str())); @@ -347,8 +300,6 @@ void GxsForumMsgItem::fillParentMessage() pixmap = GxsIdDetails::makeDefaultIcon(mParentMessage.mMeta.mAuthorId,GxsIdDetails::SMALL); ui->parentAvatar->setPixmap(pixmap); - - mInFill = false; } void GxsForumMsgItem::fillMessage() { @@ -357,8 +308,6 @@ void GxsForumMsgItem::fillMessage() std::cerr << std::endl; #endif - mInFill = true; - if(!mIsHome && mCloseOnRead && !IS_MSG_NEW(mMessage.mMeta.mMsgStatus)) removeItem(); @@ -400,21 +349,15 @@ void GxsForumMsgItem::fillMessage() ui->clearButton->setEnabled(false); ui->clearButton->hide(); } - - mInFill = false; } void GxsForumMsgItem::fillGroup() { - mInFill = true; - ui->unsubscribeButton->setEnabled(IS_GROUP_SUBSCRIBED(mGroup.mMeta.mSubscribeFlags) || IS_GROUP_ADMIN(mGroup.mMeta.mSubscribeFlags)) ; if (IS_GROUP_PUBLISHER(mGroup.mMeta.mSubscribeFlags)) ui->iconLabel->setPixmap(FilesDefs::getPixmapFromQtResourcePath(":/icons/png/forums.png")); else ui->iconLabel->setPixmap(FilesDefs::getPixmapFromQtResourcePath(":/icons/png/forums-default.png")); - - mInFill = false; } void GxsForumMsgItem::fillExpandFrame() @@ -508,10 +451,6 @@ void GxsForumMsgItem::unsubscribeForum() void GxsForumMsgItem::setAsRead(bool doUpdate) { - if (mInFill) { - return; - } - mCloseOnRead = false; mLoadingSetAsRead = true; diff --git a/retroshare-gui/src/gui/feeds/GxsForumMsgItem.h b/retroshare-gui/src/gui/feeds/GxsForumMsgItem.h index ec933d96e..8d882785e 100644 --- a/retroshare-gui/src/gui/feeds/GxsForumMsgItem.h +++ b/retroshare-gui/src/gui/feeds/GxsForumMsgItem.h @@ -36,22 +36,18 @@ class GxsForumMsgItem : public GxsFeedItem public: GxsForumMsgItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsGroupId &groupId, const RsGxsMessageId &messageId, bool isHome, bool autoUpdate); - GxsForumMsgItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsForumGroup &group, const RsGxsForumMsg &post, bool isHome, bool autoUpdate); - GxsForumMsgItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsForumMsg &post, bool isHome, bool autoUpdate); - virtual ~GxsForumMsgItem(); - bool setGroup(const RsGxsForumGroup &group, bool doFill = true); - bool setMessage(const RsGxsForumMsg &msg, bool doFill = true); + //GxsForumMsgItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsForumGroup &group, const RsGxsForumMsg &post, bool isHome, bool autoUpdate); + //GxsForumMsgItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsForumMsg &post, bool isHome, bool autoUpdate); + virtual ~GxsForumMsgItem(); uint64_t uniqueIdentifier() const override { return hash_64bits("GxsForumMsgItem " + messageId().toStdString()) ; } protected: - /* FeedItem */ + virtual void paintEvent(QPaintEvent *e) override; + /* FeedItem */ virtual void doExpand(bool open) override; virtual void expandFill(bool first) override; - /* load message data */ - virtual void loadParentMessage(const RsGxsMessageId &parent_msg); - /* GxsGroupFeedItem */ virtual QString groupName() override; virtual void loadGroup() override; @@ -77,6 +73,7 @@ signals: private: void setup(); + void fillGroup(); void fillMessage(); void fillParentMessage(); @@ -85,16 +82,19 @@ private: void setAsRead(bool doUpdate); private: - bool mInFill; bool mCloseOnRead; + + LoadingStatus mLoadingStatus; + bool mLoadingMessage; - bool mLoadingParentMessage; bool mLoadingGroup; bool mLoadingSetAsRead; + bool mHasParentMessage; // set to false when we see that the msg does not have a parent. + RsGxsForumGroup mGroup; - RsGxsForumMsg mMessage; - RsGxsForumMsg mParentMessage; + RsGxsForumMsg mMessage; + RsGxsForumMsg mParentMessage; /** Qt Designer generated object */ Ui::GxsForumMsgItem *ui; From 6b88c9a49e0569d002721df6dbadca324b2851a8 Mon Sep 17 00:00:00 2001 From: csoler Date: Sun, 2 Nov 2025 18:36:23 +0100 Subject: [PATCH 08/13] fixed PostedGroupItem --- .../src/gui/feeds/PostedGroupItem.cpp | 72 +++++++++++-------- .../src/gui/feeds/PostedGroupItem.h | 16 ++--- 2 files changed, 50 insertions(+), 38 deletions(-) diff --git a/retroshare-gui/src/gui/feeds/PostedGroupItem.cpp b/retroshare-gui/src/gui/feeds/PostedGroupItem.cpp index 34fd378f2..2a45fcf0a 100644 --- a/retroshare-gui/src/gui/feeds/PostedGroupItem.cpp +++ b/retroshare-gui/src/gui/feeds/PostedGroupItem.cpp @@ -35,29 +35,55 @@ PostedGroupItem::PostedGroupItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsGroupId &groupId, bool isHome, bool autoUpdate) : GxsGroupFeedItem(feedHolder, feedId, groupId, isHome, rsPosted, autoUpdate) { - mIsLoadingGroup = false; - setup(); + mLoadingGroup = false; + mLoadingStatus = NO_DATA; - requestGroup(); + setup(); } -PostedGroupItem::PostedGroupItem(FeedHolder *feedHolder, uint32_t feedId, const RsPostedGroup &group, bool isHome, bool autoUpdate) : - GxsGroupFeedItem(feedHolder, feedId, group.mMeta.mGroupId, isHome, rsPosted, autoUpdate) +//PostedGroupItem::PostedGroupItem(FeedHolder *feedHolder, uint32_t feedId, const RsPostedGroup &group, bool isHome, bool autoUpdate) : +// GxsGroupFeedItem(feedHolder, feedId, group.mMeta.mGroupId, isHome, rsPosted, autoUpdate) +//{ +// mIsLoadingGroup = false; +// setup(); +// +// setGroup(group); +//} + +void PostedGroupItem::paintEvent(QPaintEvent *e) { - mIsLoadingGroup = false; - setup(); + /* This method employs a trick to trigger a deferred loading. The post and group is requested only + * when actually displayed on the screen. */ - setGroup(group); + 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) ; } - PostedGroupItem::~PostedGroupItem() { auto timeout = std::chrono::steady_clock::now() + std::chrono::milliseconds(GROUP_ITEM_LOADING_TIMEOUT_ms); - while( mIsLoadingGroup && std::chrono::steady_clock::now() < timeout) + while( mLoadingGroup && std::chrono::steady_clock::now() < timeout) { RsDbg() << __PRETTY_FUNCTION__ << " is Waiting " - << (mIsLoadingGroup ? "Group " : "") + << (mLoadingGroup ? "Group " : "") << "loading finished." << std::endl; std::this_thread::sleep_for(std::chrono::milliseconds(100)); @@ -91,23 +117,9 @@ void PostedGroupItem::setup() ui->expandFrame->hide(); } -bool PostedGroupItem::setGroup(const RsPostedGroup &group) -{ - if (groupId() != group.mMeta.mGroupId) { - std::cerr << "PostedGroupItem::setContent() - Wrong id, cannot set post"; - std::cerr << std::endl; - return false; - } - - mGroup = group; - fill(); - - return true; -} - void PostedGroupItem::loadGroup() { - mIsLoadingGroup = true; + mLoadingGroup = true; RsThread::async([this]() { @@ -123,7 +135,7 @@ void PostedGroupItem::loadGroup() if(!rsPosted->getBoardsInfo(groupIds,groups)) { RsErr() << "GxsPostedGroupItem::loadGroup() ERROR getting data" << std::endl; - mIsLoadingGroup = false; + mLoadingGroup = false; return; } @@ -131,7 +143,7 @@ void PostedGroupItem::loadGroup() { std::cerr << "GxsPostedGroupItem::loadGroup() Wrong number of Items"; std::cerr << std::endl; - mIsLoadingGroup = false; + mLoadingGroup = false; return; } RsPostedGroup group(groups[0]); @@ -142,8 +154,8 @@ void PostedGroupItem::loadGroup() * thread, for example to update the data model with new information * after a blocking call to RetroShare API complete */ - setGroup(group); - mIsLoadingGroup = false; + mGroup = group; + mLoadingGroup = false; }, this ); }); diff --git a/retroshare-gui/src/gui/feeds/PostedGroupItem.h b/retroshare-gui/src/gui/feeds/PostedGroupItem.h index fa8fe65d6..835c7ce19 100644 --- a/retroshare-gui/src/gui/feeds/PostedGroupItem.h +++ b/retroshare-gui/src/gui/feeds/PostedGroupItem.h @@ -37,21 +37,20 @@ class PostedGroupItem : public GxsGroupFeedItem public: /** Default Constructor */ PostedGroupItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsGroupId &groupId, bool isHome, bool autoUpdate); - PostedGroupItem(FeedHolder *feedHolder, uint32_t feedId, const RsPostedGroup &group, bool isHome, bool autoUpdate); - ~PostedGroupItem(); - - bool setGroup(const RsPostedGroup &group); + virtual ~PostedGroupItem() override; uint64_t uniqueIdentifier() const override { return hash_64bits("PostedGroupItem " + groupId().toStdString()) ; } protected: + virtual void paintEvent(QPaintEvent *e) override; + /* FeedItem */ - virtual void doExpand(bool open); + virtual void doExpand(bool open) 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; } private slots: void toggle() override; @@ -63,7 +62,8 @@ private: private: RsPostedGroup mGroup; - bool mIsLoadingGroup; + bool mLoadingGroup; + LoadingStatus mLoadingStatus; /** Qt Designer generated object */ Ui::PostedGroupItem *ui; From 8a23d378706f539d7461dcdf5d50dc08444bc468 Mon Sep 17 00:00:00 2001 From: csoler Date: Mon, 3 Nov 2025 16:32:49 +0100 Subject: [PATCH 09/13] removed some dead code --- .../src/gui/feeds/GxsChannelGroupItem.cpp | 9 ------ .../src/gui/feeds/GxsChannelPostItem.cpp | 13 --------- .../src/gui/feeds/GxsChannelPostItem.h | 2 -- .../src/gui/feeds/GxsForumMsgItem.cpp | 28 ------------------- .../src/gui/feeds/GxsForumMsgItem.h | 3 -- .../src/gui/feeds/PostedGroupItem.cpp | 9 ------ 6 files changed, 64 deletions(-) diff --git a/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.cpp b/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.cpp index 510302ae2..0e3d88023 100644 --- a/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.cpp +++ b/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.cpp @@ -44,15 +44,6 @@ GxsChannelGroupItem::GxsChannelGroupItem(FeedHolder *feedHolder, uint32_t feedId 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() { mEventHandlerId = 0; diff --git a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp index bc5f385d7..cc5390782 100644 --- a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp +++ b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp @@ -197,19 +197,6 @@ void GxsChannelPostItem::setup() ui->expandFrame->hide(); } - -QString GxsChannelPostItem::getTitleLabel() -{ - return QString::fromUtf8(mPost.mMeta.mMsgName.c_str()); -} - -QString GxsChannelPostItem::getMsgLabel() -{ - //return RsHtml().formatText(NULL, QString::fromUtf8(mPost.mMsg.c_str()), RSHTML_FORMATTEXT_EMBED_SMILEYS | RSHTML_FORMATTEXT_EMBED_LINKS); - // Disabled, because emoticon replacement kills performance. - return QString::fromUtf8(mPost.mMsg.c_str()); -} - QString GxsChannelPostItem::groupName() { return QString::fromUtf8(mGroupMeta.mGroupName.c_str()); diff --git a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.h b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.h index fd5ccfd86..cdcd56088 100644 --- a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.h +++ b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.h @@ -58,8 +58,6 @@ public: protected: //void setFileCleanUpWarning(uint32_t time_left); - QString getTitleLabel(); - QString getMsgLabel(); const std::list &getFileItems() {return mFileItems; } bool isUnread() const ; diff --git a/retroshare-gui/src/gui/feeds/GxsForumMsgItem.cpp b/retroshare-gui/src/gui/feeds/GxsForumMsgItem.cpp index 1d37e48b1..1ce7d0093 100644 --- a/retroshare-gui/src/gui/feeds/GxsForumMsgItem.cpp +++ b/retroshare-gui/src/gui/feeds/GxsForumMsgItem.cpp @@ -57,34 +57,6 @@ GxsForumMsgItem::GxsForumMsgItem(FeedHolder *feedHolder, uint32_t feedId, const setup(); } -// GxsForumMsgItem::GxsForumMsgItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsForumGroup &group, const RsGxsForumMsg &post, bool isHome, bool autoUpdate) : -// GxsFeedItem(feedHolder, feedId, post.mMeta.mGroupId, post.mMeta.mMsgId, isHome, rsGxsForums, autoUpdate) -// { -// #ifdef DEBUG_ITEM -// std::cerr << "GxsForumMsgItem::GxsForumMsgItem() Direct Load"; -// std::cerr << std::endl; -// #endif -// -// setup(); -// -// setGroup(group, false); -// setMessage(post); -// } - -// GxsForumMsgItem::GxsForumMsgItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsForumMsg &post, bool isHome, bool autoUpdate) : -// GxsFeedItem(feedHolder, feedId, post.mMeta.mGroupId, post.mMeta.mMsgId, isHome, rsGxsForums, autoUpdate) -// { -// #ifdef DEBUG_ITEM -// std::cerr << "GxsForumMsgItem::GxsForumMsgItem() Direct Load"; -// std::cerr << std::endl; -// #endif -// -// setup(); -// -// requestGroup(); -// setMessage(post); -// } - void GxsForumMsgItem::paintEvent(QPaintEvent *e) { /* This method employs a trick to trigger a deferred loading. The post and group is requested only diff --git a/retroshare-gui/src/gui/feeds/GxsForumMsgItem.h b/retroshare-gui/src/gui/feeds/GxsForumMsgItem.h index 8d882785e..e6dc533d5 100644 --- a/retroshare-gui/src/gui/feeds/GxsForumMsgItem.h +++ b/retroshare-gui/src/gui/feeds/GxsForumMsgItem.h @@ -37,8 +37,6 @@ class GxsForumMsgItem : public GxsFeedItem public: GxsForumMsgItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsGroupId &groupId, const RsGxsMessageId &messageId, bool isHome, bool autoUpdate); - //GxsForumMsgItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsForumGroup &group, const RsGxsForumMsg &post, bool isHome, bool autoUpdate); - //GxsForumMsgItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsForumMsg &post, bool isHome, bool autoUpdate); virtual ~GxsForumMsgItem(); uint64_t uniqueIdentifier() const override { return hash_64bits("GxsForumMsgItem " + messageId().toStdString()) ; } @@ -52,7 +50,6 @@ protected: virtual QString groupName() override; virtual void loadGroup() override; virtual RetroShareLink::enumType getLinkType() override { return RetroShareLink::TYPE_FORUM; } - //virtual bool isLoading(); /* GxsFeedItem */ virtual QString messageName() override; diff --git a/retroshare-gui/src/gui/feeds/PostedGroupItem.cpp b/retroshare-gui/src/gui/feeds/PostedGroupItem.cpp index 2a45fcf0a..56d3d4d09 100644 --- a/retroshare-gui/src/gui/feeds/PostedGroupItem.cpp +++ b/retroshare-gui/src/gui/feeds/PostedGroupItem.cpp @@ -41,15 +41,6 @@ PostedGroupItem::PostedGroupItem(FeedHolder *feedHolder, uint32_t feedId, const setup(); } -//PostedGroupItem::PostedGroupItem(FeedHolder *feedHolder, uint32_t feedId, const RsPostedGroup &group, bool isHome, bool autoUpdate) : -// GxsGroupFeedItem(feedHolder, feedId, group.mMeta.mGroupId, isHome, rsPosted, autoUpdate) -//{ -// mIsLoadingGroup = false; -// setup(); -// -// setGroup(group); -//} - void PostedGroupItem::paintEvent(QPaintEvent *e) { /* This method employs a trick to trigger a deferred loading. The post and group is requested only From 6a0dda8cf7d461963a508f64defab19acee38775 Mon Sep 17 00:00:00 2001 From: csoler Date: Mon, 3 Nov 2025 16:38:57 +0100 Subject: [PATCH 10/13] left test code template in place --- build_scripts/OBS | 2 +- libretroshare | 2 +- openpgpsdk | 2 +- retroshare-gui/src/gui/NewsFeed.cpp | 8 ++++++++ supportlibs/cmark | 2 +- supportlibs/libsam3 | 2 +- supportlibs/rapidjson | 2 +- 7 files changed, 14 insertions(+), 6 deletions(-) diff --git a/build_scripts/OBS b/build_scripts/OBS index 0a3997cc1..9dd9d7f94 160000 --- a/build_scripts/OBS +++ b/build_scripts/OBS @@ -1 +1 @@ -Subproject commit 0a3997cc1355b2c848161dca015b7e2df039707b +Subproject commit 9dd9d7f94a600e8c8478887a4f7784fdc3294034 diff --git a/libretroshare b/libretroshare index da6b849a4..a82f87cc9 160000 --- a/libretroshare +++ b/libretroshare @@ -1 +1 @@ -Subproject commit da6b849a41f3cf6e60f6f76e1f3c4463876a8741 +Subproject commit a82f87cc935694e903bc5b99768d4390d421fb14 diff --git a/openpgpsdk b/openpgpsdk index 178aa8ebc..634f701d4 160000 --- a/openpgpsdk +++ b/openpgpsdk @@ -1 +1 @@ -Subproject commit 178aa8ebcef47e3271d5a5ca5c07e45d3b71c81d +Subproject commit 634f701d44585e4648b898be99d26e288db1881e diff --git a/retroshare-gui/src/gui/NewsFeed.cpp b/retroshare-gui/src/gui/NewsFeed.cpp index dc0834e71..de2767286 100644 --- a/retroshare-gui/src/gui/NewsFeed.cpp +++ b/retroshare-gui/src/gui/NewsFeed.cpp @@ -512,6 +512,14 @@ void NewsFeed::handleSecurityEvent(std::shared_ptr event) void NewsFeed::testFeeds(uint /*notifyFlags*/) { + auto feedItem = new GxsChannelPostItem(instance, + NEWSFEED_CHANNELNEWLIST, + RsGxsGroupId ("00000000000000000000000000000000"), + RsGxsMessageId("0000000000000000000000000000000000000000") + , false, true); + + instance->addFeedItem(feedItem); + #ifdef TO_REMOVE if (!instance) { return; diff --git a/supportlibs/cmark b/supportlibs/cmark index 3460cd809..b9c7a496b 160000 --- a/supportlibs/cmark +++ b/supportlibs/cmark @@ -1 +1 @@ -Subproject commit 3460cd809b6dd311b58e92733ece2fc956224fd2 +Subproject commit b9c7a496ba7dd9c3495bae2ff2855899e47b245d diff --git a/supportlibs/libsam3 b/supportlibs/libsam3 index f90555ba4..8623304b6 160000 --- a/supportlibs/libsam3 +++ b/supportlibs/libsam3 @@ -1 +1 @@ -Subproject commit f90555ba4d6f9fadb6f0fbb1e2253e13557aad34 +Subproject commit 8623304b62294dafbe477573f321a464fef721dd diff --git a/supportlibs/rapidjson b/supportlibs/rapidjson index 24b5e7a8b..f54b0e47a 160000 --- a/supportlibs/rapidjson +++ b/supportlibs/rapidjson @@ -1 +1 @@ -Subproject commit 24b5e7a8b27f42fa16b96fc70aade9106cf7102f +Subproject commit f54b0e47a08782a6131cc3d60f94d038fa6e0a51 From c0c9684adf24ffb516c1b5e2c2b1fb750ab63b50 Mon Sep 17 00:00:00 2001 From: csoler Date: Tue, 4 Nov 2025 21:27:21 +0100 Subject: [PATCH 11/13] fixed forum msg item loading --- retroshare-gui/src/gui/feeds/GxsForumMsgItem.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/retroshare-gui/src/gui/feeds/GxsForumMsgItem.cpp b/retroshare-gui/src/gui/feeds/GxsForumMsgItem.cpp index 1ce7d0093..e675c7714 100644 --- a/retroshare-gui/src/gui/feeds/GxsForumMsgItem.cpp +++ b/retroshare-gui/src/gui/feeds/GxsForumMsgItem.cpp @@ -45,9 +45,6 @@ GxsForumMsgItem::GxsForumMsgItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsGroupId &groupId, const RsGxsMessageId &messageId, bool isHome, bool autoUpdate) : GxsFeedItem(feedHolder, feedId, groupId, messageId, isHome, rsGxsForums, autoUpdate) { - mMessage.mMeta.mMsgId = messageId; // useful for uniqueIdentifier() before the post is actually loaded - mMessage.mMeta.mGroupId = groupId; - mLoadingStatus = NO_DATA; mLoadingGroup = false; @@ -160,14 +157,13 @@ void GxsForumMsgItem::loadGroup() { // 1 - get group data -#ifdef DEBUG_FORUMS - std::cerr << "Retrieving post data for post " << mThreadId << std::endl; +#ifndef DEBUG_FORUMS + std::cerr << "Retrieving forum group data for forum " << groupId() << std::endl; #endif std::vector groups; - const std::list forumIds = { groupId() }; - if(!rsGxsForums->getForumsInfo(forumIds,groups)) + if(!rsGxsForums->getForumsInfo({ groupId() },groups)) { RsErr() << "GxsForumGroupItem::loadGroup() ERROR getting data" << std::endl; mLoadingGroup = false; From 89cb02528cf21285d500549b5f6403c1fd6701f2 Mon Sep 17 00:00:00 2001 From: csoler Date: Wed, 5 Nov 2025 20:30:26 +0100 Subject: [PATCH 12/13] changed enum for data loading in feed items to some more specific name --- .../src/gui/feeds/ChannelsCommentsItem.cpp | 14 +++++++------- .../src/gui/feeds/GxsChannelGroupItem.cpp | 16 ++++++++-------- .../src/gui/feeds/GxsChannelPostItem.cpp | 14 +++++++------- .../src/gui/feeds/GxsForumGroupItem.cpp | 18 +++++++++--------- .../src/gui/feeds/GxsForumMsgItem.cpp | 14 +++++++------- .../src/gui/feeds/PostedGroupItem.cpp | 14 +++++++------- retroshare-gui/src/gui/gxs/GxsGroupFeedItem.h | 6 +++--- 7 files changed, 48 insertions(+), 48 deletions(-) diff --git a/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.cpp b/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.cpp index 5c112689a..a7bd64bc6 100644 --- a/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.cpp +++ b/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.cpp @@ -53,7 +53,7 @@ ChannelsCommentsItem::ChannelsCommentsItem(FeedHolder *feedHolder, uint32_t feed GxsFeedItem(feedHolder, feedId, groupId, commentId, isHome, rsGxsChannels, autoUpdate), // this one should be in GxsFeedItem mThreadId(threadId) { - mLoadingStatus = NO_DATA; + mLoadingStatus = LOADING_STATUS_NO_DATA; mLoadingComment = false; mLoadingGroup = false; mLoadingMessage = false; @@ -66,8 +66,8 @@ void ChannelsCommentsItem::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 && !mGroupMeta.mGroupId.isNull() && !mComment.mMeta.mMsgId.isNull()) - mLoadingStatus = HAS_DATA; + if(mLoadingStatus != LOADING_STATUS_FILLED && !mGroupMeta.mGroupId.isNull() && !mComment.mMeta.mMsgId.isNull()) + mLoadingStatus = LOADING_STATUS_HAS_DATA; if(mGroupMeta.mGroupId.isNull() && !mLoadingGroup) loadGroupData(); @@ -80,13 +80,13 @@ void ChannelsCommentsItem::paintEvent(QPaintEvent *e) switch(mLoadingStatus) { - case FILLED: - case NO_DATA: + case LOADING_STATUS_FILLED: + case LOADING_STATUS_NO_DATA: default: break; - case HAS_DATA: + case LOADING_STATUS_HAS_DATA: fill(); - mLoadingStatus = FILLED; + mLoadingStatus = LOADING_STATUS_FILLED; break; } diff --git a/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.cpp b/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.cpp index 0e3d88023..56c10508a 100644 --- a/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.cpp +++ b/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.cpp @@ -37,7 +37,7 @@ GxsChannelGroupItem::GxsChannelGroupItem(FeedHolder *feedHolder, uint32_t feedId GxsGroupFeedItem(feedHolder, feedId, groupId, isHome, rsGxsChannels, autoUpdate) { mLoadingGroup = false; - mLoadingStatus = NO_DATA; + mLoadingStatus = LOADING_STATUS_NO_DATA; setup(); requestGroup(); @@ -61,7 +61,7 @@ void GxsChannelGroupItem::addEventHandler() case RsChannelEventCode::SUBSCRIBE_STATUS_CHANGED: case RsChannelEventCode::UPDATED_CHANNEL: case RsChannelEventCode::RECEIVED_PUBLISH_KEY: - mLoadingStatus = NO_DATA; + mLoadingStatus = LOADING_STATUS_NO_DATA; mGroup = RsGxsChannelGroup(); break; default: @@ -76,22 +76,22 @@ 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(mLoadingStatus != LOADING_STATUS_FILLED && !mGroup.mMeta.mGroupId.isNull()) + mLoadingStatus = LOADING_STATUS_HAS_DATA; if(mGroup.mMeta.mGroupId.isNull() && !mLoadingGroup) loadGroup(); switch(mLoadingStatus) { - case FILLED: - case NO_DATA: + case LOADING_STATUS_FILLED: + case LOADING_STATUS_NO_DATA: default: break; - case HAS_DATA: + case LOADING_STATUS_HAS_DATA: fill(); - mLoadingStatus = FILLED; + mLoadingStatus = LOADING_STATUS_FILLED; break; } diff --git a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp index cc5390782..abd10ed2b 100644 --- a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp +++ b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp @@ -57,7 +57,7 @@ GxsChannelPostItem::GxsChannelPostItem(FeedHolder *feedHolder, uint32_t feedId, if(older_versions.find(messageId) == older_versions.end()) v.push_back(messageId); - mLoadingStatus = NO_DATA; + mLoadingStatus = LOADING_STATUS_NO_DATA; mLoadingMessage = false; mLoadingGroup = false; @@ -70,8 +70,8 @@ void GxsChannelPostItem::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 && !mGroupMeta.mGroupId.isNull() && !mPost.mMeta.mMsgId.isNull() ) - mLoadingStatus = HAS_DATA; + if(mLoadingStatus != LOADING_STATUS_FILLED && !mGroupMeta.mGroupId.isNull() && !mPost.mMeta.mMsgId.isNull() ) + mLoadingStatus = LOADING_STATUS_HAS_DATA; if(mGroupMeta.mGroupId.isNull() && !mLoadingGroup) requestGroup(); @@ -81,14 +81,14 @@ void GxsChannelPostItem::paintEvent(QPaintEvent *e) switch(mLoadingStatus) { - case FILLED: - case NO_DATA: + case LOADING_STATUS_FILLED: + case LOADING_STATUS_NO_DATA: default: break; - case HAS_DATA: + case LOADING_STATUS_HAS_DATA: fill(); - mLoadingStatus = FILLED; + mLoadingStatus = LOADING_STATUS_FILLED; break; } diff --git a/retroshare-gui/src/gui/feeds/GxsForumGroupItem.cpp b/retroshare-gui/src/gui/feeds/GxsForumGroupItem.cpp index d338ebb57..7e0fdca71 100644 --- a/retroshare-gui/src/gui/feeds/GxsForumGroupItem.cpp +++ b/retroshare-gui/src/gui/feeds/GxsForumGroupItem.cpp @@ -35,7 +35,7 @@ GxsForumGroupItem::GxsForumGroupItem(FeedHolder *feedHolder, uint32_t feedId, co GxsGroupFeedItem(feedHolder, feedId, groupId, isHome, rsGxsForums, autoUpdate) { mLoadingGroup = false; - mLoadingStatus = NO_DATA; + mLoadingStatus = LOADING_STATUS_NO_DATA; setup(); addEventHandler(); } @@ -46,7 +46,7 @@ GxsForumGroupItem::GxsForumGroupItem(FeedHolder *feedHolder, uint32_t feedId, co mRemovedModerators(removed_moderators) { mLoadingGroup = false; - mLoadingStatus = NO_DATA; + mLoadingStatus = LOADING_STATUS_NO_DATA; setup(); addEventHandler(); } @@ -68,7 +68,7 @@ void GxsForumGroupItem::addEventHandler() case RsForumEventCode::SUBSCRIBE_STATUS_CHANGED: case RsForumEventCode::UPDATED_FORUM: case RsForumEventCode::MODERATOR_LIST_CHANGED: - mLoadingStatus = NO_DATA; + mLoadingStatus = LOADING_STATUS_NO_DATA; mGroup = RsGxsForumGroup(); break; default: @@ -83,22 +83,22 @@ void GxsForumGroupItem::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(mLoadingStatus != LOADING_STATUS_FILLED && !mGroup.mMeta.mGroupId.isNull()) + mLoadingStatus = LOADING_STATUS_HAS_DATA; if(mGroup.mMeta.mGroupId.isNull() && !mLoadingGroup) loadGroup(); switch(mLoadingStatus) { - case FILLED: - case NO_DATA: + case LOADING_STATUS_FILLED: + case LOADING_STATUS_NO_DATA: default: break; - case HAS_DATA: + case LOADING_STATUS_HAS_DATA: fill(); - mLoadingStatus = FILLED; + mLoadingStatus = LOADING_STATUS_FILLED; break; } diff --git a/retroshare-gui/src/gui/feeds/GxsForumMsgItem.cpp b/retroshare-gui/src/gui/feeds/GxsForumMsgItem.cpp index e675c7714..9e07c6de8 100644 --- a/retroshare-gui/src/gui/feeds/GxsForumMsgItem.cpp +++ b/retroshare-gui/src/gui/feeds/GxsForumMsgItem.cpp @@ -45,7 +45,7 @@ GxsForumMsgItem::GxsForumMsgItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsGroupId &groupId, const RsGxsMessageId &messageId, bool isHome, bool autoUpdate) : GxsFeedItem(feedHolder, feedId, groupId, messageId, isHome, rsGxsForums, autoUpdate) { - mLoadingStatus = NO_DATA; + mLoadingStatus = LOADING_STATUS_NO_DATA; mLoadingGroup = false; mLoadingMessage = false; @@ -59,8 +59,8 @@ void GxsForumMsgItem::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() && !mMessage.mMeta.mMsgId.isNull()) - mLoadingStatus = HAS_DATA; + if(mLoadingStatus != LOADING_STATUS_FILLED && !mGroup.mMeta.mGroupId.isNull() && !mMessage.mMeta.mMsgId.isNull()) + mLoadingStatus = LOADING_STATUS_HAS_DATA; if(mGroup.mMeta.mGroupId.isNull() && !mLoadingGroup) requestGroup(); @@ -70,19 +70,19 @@ void GxsForumMsgItem::paintEvent(QPaintEvent *e) switch(mLoadingStatus) { - case FILLED: - case NO_DATA: + case LOADING_STATUS_FILLED: + case LOADING_STATUS_NO_DATA: default: break; - case HAS_DATA: + case LOADING_STATUS_HAS_DATA: fillGroup(); fillMessage(); if(!mParentMessage.mMeta.mMsgId.isNull()) fillParentMessage(); - mLoadingStatus = FILLED; + mLoadingStatus = LOADING_STATUS_FILLED; break; } diff --git a/retroshare-gui/src/gui/feeds/PostedGroupItem.cpp b/retroshare-gui/src/gui/feeds/PostedGroupItem.cpp index 56d3d4d09..e4e416faa 100644 --- a/retroshare-gui/src/gui/feeds/PostedGroupItem.cpp +++ b/retroshare-gui/src/gui/feeds/PostedGroupItem.cpp @@ -36,7 +36,7 @@ PostedGroupItem::PostedGroupItem(FeedHolder *feedHolder, uint32_t feedId, const GxsGroupFeedItem(feedHolder, feedId, groupId, isHome, rsPosted, autoUpdate) { mLoadingGroup = false; - mLoadingStatus = NO_DATA; + mLoadingStatus = LOADING_STATUS_NO_DATA; setup(); } @@ -46,22 +46,22 @@ void PostedGroupItem::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(mLoadingStatus != LOADING_STATUS_FILLED && !mGroup.mMeta.mGroupId.isNull()) + mLoadingStatus = LOADING_STATUS_HAS_DATA; if(mGroup.mMeta.mGroupId.isNull() && !mLoadingGroup) loadGroup(); switch(mLoadingStatus) { - case FILLED: - case NO_DATA: + case LOADING_STATUS_FILLED: + case LOADING_STATUS_NO_DATA: default: break; - case HAS_DATA: + case LOADING_STATUS_HAS_DATA: fill(); - mLoadingStatus = FILLED; + mLoadingStatus = LOADING_STATUS_FILLED; break; } diff --git a/retroshare-gui/src/gui/gxs/GxsGroupFeedItem.h b/retroshare-gui/src/gui/gxs/GxsGroupFeedItem.h index cd051ccee..9bb21b6d0 100644 --- a/retroshare-gui/src/gui/gxs/GxsGroupFeedItem.h +++ b/retroshare-gui/src/gui/gxs/GxsGroupFeedItem.h @@ -46,9 +46,9 @@ public: protected: enum LoadingStatus { - NO_DATA = 0x00, - HAS_DATA = 0x01, - FILLED = 0x02 + LOADING_STATUS_NO_DATA = 0x00, + LOADING_STATUS_HAS_DATA = 0x01, + LOADING_STATUS_FILLED = 0x02 }; /* load group data */ From 0502dba2e6894edd47490711fdf697748a3190fd Mon Sep 17 00:00:00 2001 From: csoler Date: Fri, 7 Nov 2025 14:26:19 +0100 Subject: [PATCH 13/13] fixed missing link in ChannelsCommentsItem --- .../src/gui/feeds/ChannelsCommentsItem.cpp | 67 +-- .../src/gui/feeds/ChannelsCommentsItem.ui | 548 +++++++++--------- 2 files changed, 300 insertions(+), 315 deletions(-) diff --git a/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.cpp b/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.cpp index a7bd64bc6..88425975d 100644 --- a/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.cpp +++ b/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.cpp @@ -53,6 +53,9 @@ ChannelsCommentsItem::ChannelsCommentsItem(FeedHolder *feedHolder, uint32_t feed GxsFeedItem(feedHolder, feedId, groupId, commentId, isHome, rsGxsChannels, autoUpdate), // this one should be in GxsFeedItem mThreadId(threadId) { + mGroupMeta.mGroupId.clear(); // safety measure + mComment.mMeta.mMsgId.clear(); + mLoadingStatus = LOADING_STATUS_NO_DATA; mLoadingComment = false; mLoadingGroup = false; @@ -66,7 +69,7 @@ void ChannelsCommentsItem::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 != LOADING_STATUS_FILLED && !mGroupMeta.mGroupId.isNull() && !mComment.mMeta.mMsgId.isNull()) + if(mLoadingStatus != LOADING_STATUS_FILLED && !mGroupMeta.mGroupId.isNull() && !mComment.mMeta.mMsgId.isNull() && !mPost.mMeta.mMsgId.isNull()) mLoadingStatus = LOADING_STATUS_HAS_DATA; if(mGroupMeta.mGroupId.isNull() && !mLoadingGroup) @@ -328,60 +331,31 @@ void ChannelsCommentsItem::loadCommentData() void ChannelsCommentsItem::fill(bool missing_post) { #ifdef DEBUG_ITEM - std::cerr << "ChannelsCommentsItem::fill()"; - std::cerr << std::endl; + std::cerr << "ChannelsCommentsItem::fill()"; + std::cerr << std::endl; #endif - if (!mIsHome) - { - if (mCloseOnRead && !IS_MSG_NEW(mComment.mMeta.mMsgStatus)) { - removeItem(); - } - //RetroShareLink link = RetroShareLink::createGxsGroupLink(RetroShareLink::TYPE_CHANNEL, mPost.mMeta.mGroupId, groupName()); - //title += link.toHtml(); - //ui->titleLabel->setText(title); + if (mCloseOnRead && !IS_MSG_NEW(mComment.mMeta.mMsgStatus)) { + removeItem(); + } - RetroShareLink msgLink = RetroShareLink::createGxsMessageLink(RetroShareLink::TYPE_CHANNEL, mPost.mMeta.mGroupId, mPost.mMeta.mMsgId, messageName()); + RetroShareLink grplink = RetroShareLink::createGxsGroupLink(RetroShareLink::TYPE_CHANNEL, mGroupMeta.mGroupId, groupName()); + RetroShareLink msgLink = RetroShareLink::createGxsMessageLink(RetroShareLink::TYPE_CHANNEL, mPost.mMeta.mGroupId, mPost.mMeta.mMsgId, messageName()); - if(missing_post) - ui->subjectLabel->setText("[" + QObject::tr("Missing channel post")+"]"); - else - ui->subjectLabel->setText(msgLink.toHtml()); + if(missing_post) + ui->subjectLabel->setText("[" + QObject::tr("Missing channel post")+"]"); + else + ui->subjectLabel->setText(msgLink.toHtml()); - ui->readButton->hide(); + ui->readButton->hide(); - if (IS_MSG_NEW(mComment.mMeta.mMsgStatus)) { - mCloseOnRead = true; - } - } - else - { - if(mPost.mMeta.mMsgId.isNull()) - ui->subjectLabel->setText("[" + QObject::tr("Missing channel post")+"]"); - else - ui->subjectLabel->setText(RsStringUtil::CopyLines(QString::fromUtf8(mPost.mMsg.c_str()), 2)) ; + if (IS_MSG_NEW(mComment.mMeta.mMsgStatus)) { + mCloseOnRead = true; + } - /* disable buttons: deletion facility not enabled with cache services yet */ - ui->clearButton->setEnabled(false); - ui->clearButton->hide(); - ui->readAndClearButton->hide(); - ui->copyLinkButton->show(); - //ui->titleLabel->hide(); + ui->newCommentLabel->setText(groupName()+": "); - if (IS_GROUP_SUBSCRIBED(mGroupMeta.mSubscribeFlags) || IS_GROUP_ADMIN(mGroupMeta.mSubscribeFlags)) - { - ui->readButton->setVisible(true); - - setReadStatus(IS_MSG_NEW(mComment.mMeta.mMsgStatus), IS_MSG_UNREAD(mComment.mMeta.mMsgStatus) || IS_MSG_NEW(mComment.mMeta.mMsgStatus)); - } - else - { - ui->readButton->setVisible(false); - } - - mCloseOnRead = false; - } uint32_t autorized_lines = (int)floor( (ui->avatarLabel->height() - ui->button_HL->sizeHint().height()) / QFontMetricsF(ui->subjectLabel->font()).height()); @@ -396,7 +370,6 @@ void ChannelsCommentsItem::fill(bool missing_post) if(idDetails.mAvatar.mSize == 0 || !GxsIdDetails::loadPixmapFromData(idDetails.mAvatar.mData, idDetails.mAvatar.mSize, pixmap,GxsIdDetails::SMALL)) pixmap = GxsIdDetails::makeDefaultIcon(mComment.mMeta.mAuthorId,GxsIdDetails::LARGE); ui->avatarLabel->setPixmap(pixmap); - } QString ChannelsCommentsItem::messageName() diff --git a/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.ui b/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.ui index db4ac6b1a..c5643f7de 100644 --- a/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.ui +++ b/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.ui @@ -50,202 +50,6 @@ 3 - - - - 8 - - - - - - - I like this - - - - - - - - - - - 75 - true - - - - 0 - - - - - - - I dislike this - - - - - - - - - - - - - 24 - 16777215 - - - - Qt::NoFocus - - - Toggle Message Read Status - - - true - - - false - - - false - - - - - - - Avatar - - - - - - - - 0 - 0 - - - - - 12 - 75 - true - - - - New Comment - - - true - - - - - - - - 12 - 75 - true - - - - POST TITLE - - - true - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - Qt::NoFocus - - - Copy RetroShare Link - - - - - - - - - - - 0 - 0 - - - - Qt::NoFocus - - - Expand - - - - - - - - 0 - 0 - - - - Qt::NoFocus - - - Set as read and remove item - - - - - - - - 0 - 0 - - - - Qt::NoFocus - - - Remove Item - - - - - @@ -257,79 +61,91 @@ - - - 3 - - - 0 - - - 9 - - - 0 - - - 3 - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 288 - 17 - - - + + + + + + + + 0 + 0 + + + + + 12 + 75 + true + + + + New Comment from + + + true + + + + + + + + 0 + 0 + + + + + 11 + 75 + true + true + + + + Name + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 288 + 17 + + + + + + + + + 75 + true + + + + DateTime + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + - - - - - 75 - true - - - - DateTime - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - - - - - - 0 - 0 - - - - - 11 - 75 - true - true - - - - Name - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - - + @@ -360,6 +176,202 @@ + + + + 8 + + + + + + + I like this + + + + + + + + + + + 75 + true + + + + 0 + + + + + + + I dislike this + + + + + + + + + + + + + 24 + 16777215 + + + + Qt::NoFocus + + + Toggle Message Read Status + + + true + + + false + + + false + + + + + + + Avatar + + + + + + + + 0 + 0 + + + + + 12 + 75 + true + + + + New Comment + + + true + + + + + + + + 12 + 75 + true + + + + POST TITLE + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + Qt::NoFocus + + + Copy RetroShare Link + + + + + + + + + + + 0 + 0 + + + + Qt::NoFocus + + + Expand + + + + + + + + 0 + 0 + + + + Qt::NoFocus + + + Set as read and remove item + + + + + + + + 0 + 0 + + + + Qt::NoFocus + + + Remove Item + + + + +