mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-05-06 16:15:23 -04:00
added icon over posts with comments in channels
This commit is contained in:
parent
3cac0c030d
commit
08e2987154
4 changed files with 50 additions and 5 deletions
|
@ -71,14 +71,14 @@ struct RsGxsChannelGroup : RsSerializable, RsGxsGenericGroupData
|
||||||
|
|
||||||
struct RsGxsChannelPost : RsSerializable, RsGxsGenericMsgData
|
struct RsGxsChannelPost : RsSerializable, RsGxsGenericMsgData
|
||||||
{
|
{
|
||||||
RsGxsChannelPost() : mAttachmentCount(0), mSize(0) {}
|
RsGxsChannelPost() : mAttachmentCount(0), mCommentCount(0), mSize(0) {}
|
||||||
|
|
||||||
std::set<RsGxsMessageId> mOlderVersions;
|
std::set<RsGxsMessageId> mOlderVersions;
|
||||||
std::string mMsg; // UTF8 encoded.
|
std::string mMsg; // UTF8 encoded.
|
||||||
|
|
||||||
std::list<RsGxsFile> mFiles;
|
std::list<RsGxsFile> mFiles;
|
||||||
uint32_t mAttachmentCount; // auto calced.
|
uint32_t mAttachmentCount; // auto calced.
|
||||||
uint32_t mCommentCount; // auto calced.
|
uint32_t mCommentCount; // auto calced. WARNING: not computed yet. In the future we need a background process to update this and store in the service string.
|
||||||
uint64_t mSize; // auto calced.
|
uint64_t mSize; // auto calced.
|
||||||
|
|
||||||
RsGxsImage mThumbnail;
|
RsGxsImage mThumbnail;
|
||||||
|
|
|
@ -474,7 +474,8 @@ void PostedListWidgetWithModel::handleEvent_main_thread(std::shared_ptr<const Rs
|
||||||
|
|
||||||
switch(e->mPostedEventCode)
|
switch(e->mPostedEventCode)
|
||||||
{
|
{
|
||||||
case RsPostedEventCode::NEW_MESSAGE: // [[fallthrough]];
|
case RsPostedEventCode::NEW_COMMENT: // [[fallthrough]];
|
||||||
|
case RsPostedEventCode::NEW_VOTE: // [[fallthrough]];
|
||||||
{
|
{
|
||||||
// special treatment here because the message might be a comment, so we need to refresh the comment tab if openned
|
// special treatment here because the message might be a comment, so we need to refresh the comment tab if openned
|
||||||
|
|
||||||
|
@ -486,6 +487,7 @@ void PostedListWidgetWithModel::handleEvent_main_thread(std::shared_ptr<const Rs
|
||||||
t->refresh();
|
t->refresh();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
case RsPostedEventCode::NEW_MESSAGE: // [[fallthrough]];
|
||||||
case RsPostedEventCode::NEW_POSTED_GROUP: // [[fallthrough]];
|
case RsPostedEventCode::NEW_POSTED_GROUP: // [[fallthrough]];
|
||||||
case RsPostedEventCode::UPDATED_POSTED_GROUP: // [[fallthrough]];
|
case RsPostedEventCode::UPDATED_POSTED_GROUP: // [[fallthrough]];
|
||||||
case RsPostedEventCode::UPDATED_MESSAGE:
|
case RsPostedEventCode::UPDATED_MESSAGE:
|
||||||
|
|
|
@ -522,6 +522,29 @@ void RsGxsChannelPostsModel::setPosts(const RsGxsChannelGroup& group, std::vecto
|
||||||
emit channelPostsLoaded();
|
emit channelPostsLoaded();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void updateCommentCounts( std::vector<RsGxsChannelPost>& posts, std::vector<RsGxsComment>& comments)
|
||||||
|
{
|
||||||
|
// Store posts IDs in a std::map to avoid a quadratic cost
|
||||||
|
|
||||||
|
std::map<RsGxsMessageId,uint32_t> post_indices;
|
||||||
|
|
||||||
|
for(uint32_t i=0;i<posts.size();++i)
|
||||||
|
{
|
||||||
|
post_indices[posts[i].mMeta.mMsgId] = i;
|
||||||
|
posts[i].mCommentCount = 0; // should be 0 already, but we secure that value.
|
||||||
|
|
||||||
|
std::cerr << "Zeroing comments for post " << posts[i].mMeta.mMsgId << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// now look into comments and increase the count
|
||||||
|
|
||||||
|
for(uint32_t i=0;i<comments.size();++i)
|
||||||
|
{
|
||||||
|
std::cerr << "Found new comment " << comments[i].mMeta.mMsgId << " for post" << comments[i].mMeta.mThreadId << std::endl;
|
||||||
|
++posts[post_indices[comments[i].mMeta.mThreadId]].mCommentCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void RsGxsChannelPostsModel::update_posts(const RsGxsGroupId& group_id)
|
void RsGxsChannelPostsModel::update_posts(const RsGxsGroupId& group_id)
|
||||||
{
|
{
|
||||||
if(group_id.isNull())
|
if(group_id.isNull())
|
||||||
|
@ -557,6 +580,11 @@ void RsGxsChannelPostsModel::update_posts(const RsGxsGroupId& group_id)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This shouldn't be needed normally. We need it until a background process computes the number of comments per
|
||||||
|
// post and stores it in the service string. Since we request all data, this process isn't costing much anyway.
|
||||||
|
|
||||||
|
updateCommentCounts(*posts,*comments);
|
||||||
|
|
||||||
// 2 - update the model in the UI thread.
|
// 2 - update the model in the UI thread.
|
||||||
|
|
||||||
RsQThreadUtils::postToObject( [group,posts,comments,votes,this]()
|
RsQThreadUtils::postToObject( [group,posts,comments,votes,this]()
|
||||||
|
|
|
@ -76,6 +76,7 @@ QColor SelectedColor = QRgb(0xff308dc7);
|
||||||
#define COLUMN_SIZE_FONT_FACTOR_H 10
|
#define COLUMN_SIZE_FONT_FACTOR_H 10
|
||||||
|
|
||||||
#define STAR_OVERLAY_IMAGE ":icons/star_overlay_128.png"
|
#define STAR_OVERLAY_IMAGE ":icons/star_overlay_128.png"
|
||||||
|
#define COMMENT_OVERLAY_IMAGE ":images/white-bubble-64.png"
|
||||||
#define IMAGE_COPYLINK ":icons/png/copy.png"
|
#define IMAGE_COPYLINK ":icons/png/copy.png"
|
||||||
#define IMAGE_GRID_VIEW ":icons/png/menu.png"
|
#define IMAGE_GRID_VIEW ":icons/png/menu.png"
|
||||||
#define IMAGE_DOWNLOAD ":icons/png/download.png"
|
#define IMAGE_DOWNLOAD ":icons/png/download.png"
|
||||||
|
@ -179,8 +180,20 @@ void ChannelPostDelegate::paint(QPainter * painter, const QStyleOptionViewItem &
|
||||||
QPainter p(&pixmap);
|
QPainter p(&pixmap);
|
||||||
QFontMetricsF fm(option.font);
|
QFontMetricsF fm(option.font);
|
||||||
|
|
||||||
p.drawPixmap(mZoom*QPoint(0.1*fm.height(),-3.6*fm.height()),FilesDefs::getPixmapFromQtResourcePath(STAR_OVERLAY_IMAGE).scaled(mZoom*7*fm.height(),mZoom*7*fm.height(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
|
p.drawPixmap(mZoom*QPoint(0.1*fm.height(),-3.4*fm.height()),FilesDefs::getPixmapFromQtResourcePath(STAR_OVERLAY_IMAGE).scaled(mZoom*6*fm.height(),mZoom*6*fm.height(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::cerr << "mCommentCount=" << post.mCommentCount << std::endl;
|
||||||
|
if(post.mCommentCount)
|
||||||
|
{
|
||||||
|
QPainter p(&pixmap);
|
||||||
|
QFontMetricsF fm(option.font);
|
||||||
|
|
||||||
|
p.drawPixmap(QPoint(pixmap.width(),0.0)+mZoom*QPoint(-2.9*fm.height(),0.4*fm.height()),
|
||||||
|
FilesDefs::getPixmapFromQtResourcePath(COMMENT_OVERLAY_IMAGE).scaled(mZoom*3*fm.height(),mZoom*3*fm.height(),
|
||||||
|
Qt::KeepAspectRatio,Qt::SmoothTransformation));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
painter->drawPixmap(option.rect.topLeft(),
|
painter->drawPixmap(option.rect.topLeft(),
|
||||||
|
@ -703,6 +716,8 @@ void GxsChannelPostsWidgetWithModel::handleEvent_main_thread(std::shared_ptr<con
|
||||||
switch(e->mChannelEventCode)
|
switch(e->mChannelEventCode)
|
||||||
{
|
{
|
||||||
case RsChannelEventCode::NEW_CHANNEL: // [[fallthrough]];
|
case RsChannelEventCode::NEW_CHANNEL: // [[fallthrough]];
|
||||||
|
case RsChannelEventCode::NEW_COMMENT: // [[fallthrough]];
|
||||||
|
case RsChannelEventCode::NEW_VOTE: // [[fallthrough]];
|
||||||
case RsChannelEventCode::UPDATED_CHANNEL: // [[fallthrough]];
|
case RsChannelEventCode::UPDATED_CHANNEL: // [[fallthrough]];
|
||||||
case RsChannelEventCode::NEW_MESSAGE: // [[fallthrough]];
|
case RsChannelEventCode::NEW_MESSAGE: // [[fallthrough]];
|
||||||
case RsChannelEventCode::UPDATED_MESSAGE:
|
case RsChannelEventCode::UPDATED_MESSAGE:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue