added sorting based on most recent TS from children

This commit is contained in:
csoler 2018-12-02 16:34:43 +01:00
parent 37f721f305
commit 91321725e6
No known key found for this signature in database
GPG Key ID: 7BCA522266C0804C
3 changed files with 44 additions and 17 deletions

View File

@ -42,6 +42,16 @@ void RsGxsForumModel::setTreeMode(TreeMode mode)
emit layoutChanged(); emit layoutChanged();
} }
void RsGxsForumModel::setSortMode(SortMode mode)
{
emit layoutAboutToBeChanged();
mSortMode = mode;
emit dataChanged(createIndex(0,0,(void*)NULL), createIndex(0,COLUMN_THREAD_NB_COLUMNS-1,(void*)NULL));
emit layoutChanged();
}
void RsGxsForumModel::initEmptyHierarchy(std::vector<ForumModelPostEntry>& posts) void RsGxsForumModel::initEmptyHierarchy(std::vector<ForumModelPostEntry>& posts)
{ {
emit layoutAboutToBeChanged(); emit layoutAboutToBeChanged();
@ -552,7 +562,11 @@ QVariant RsGxsForumModel::sortRole(const ForumModelPostEntry& fmpe,int column) c
{ {
switch(column) switch(column)
{ {
case COLUMN_THREAD_DATE: return QVariant(QString::number(fmpe.mPublishTs)); // we should probably have leading zeroes here case COLUMN_THREAD_DATE: if(mSortMode == SORT_MODE_PUBLISH_TS)
return QVariant(QString::number(fmpe.mPublishTs)); // we should probably have leading zeroes here
else
return QVariant(QString::number(fmpe.mMostRecentTsInThread)); // we should probably have leading zeroes here
case COLUMN_THREAD_READ: return QVariant((bool)IS_MSG_UNREAD(fmpe.mMsgStatus)); case COLUMN_THREAD_READ: return QVariant((bool)IS_MSG_UNREAD(fmpe.mMsgStatus));
case COLUMN_THREAD_DISTRIBUTION: return decorationRole(fmpe,column); case COLUMN_THREAD_DISTRIBUTION: return decorationRole(fmpe,column);
case COLUMN_THREAD_AUTHOR: case COLUMN_THREAD_AUTHOR:
@ -657,8 +671,10 @@ void RsGxsForumModel::setPosts(const RsGxsForumGroup& group, const std::vector<F
mPosts[0].prow = 0; mPosts[0].prow = 0;
bool has_unread_below,has_read_below ; bool has_unread_below,has_read_below ;
recursUpdateReadStatus(0,has_unread_below,has_read_below) ;
recursUpdateReadStatusAndTimes(0,has_unread_below,has_read_below) ;
recursUpdateFilterStatus(0,0,QStringList()); recursUpdateFilterStatus(0,0,QStringList());
#ifndef DEBUG_FORUMMODEL #ifndef DEBUG_FORUMMODEL
debug_dump(); debug_dump();
#endif #endif
@ -1129,7 +1145,7 @@ void RsGxsForumModel::setMsgReadStatus(const QModelIndex& i,bool read_status,boo
bool has_unread_below,has_read_below; bool has_unread_below,has_read_below;
recursSetMsgReadStatus(entry,read_status,with_children) ; recursSetMsgReadStatus(entry,read_status,with_children) ;
recursUpdateReadStatus(0,has_unread_below,has_read_below); recursUpdateReadStatusAndTimes(0,has_unread_below,has_read_below);
emit dataChanged(createIndex(0,0,(void*)NULL), createIndex(0,COLUMN_THREAD_NB_COLUMNS-1,(void*)NULL)); emit dataChanged(createIndex(0,0,(void*)NULL), createIndex(0,COLUMN_THREAD_NB_COLUMNS-1,(void*)NULL));
} }
@ -1151,20 +1167,25 @@ void RsGxsForumModel::recursSetMsgReadStatus(ForumModelIndex i,bool read_status,
recursSetMsgReadStatus(mPosts[i].mChildren[j],read_status,with_children); recursSetMsgReadStatus(mPosts[i].mChildren[j],read_status,with_children);
} }
void RsGxsForumModel::recursUpdateReadStatus(ForumModelIndex i,bool& has_unread_below,bool& has_read_below) void RsGxsForumModel::recursUpdateReadStatusAndTimes(ForumModelIndex i,bool& has_unread_below,bool& has_read_below)
{ {
has_unread_below = IS_MSG_UNREAD(mPosts[i].mMsgStatus); has_unread_below = IS_MSG_UNREAD(mPosts[i].mMsgStatus);
has_read_below = !IS_MSG_UNREAD(mPosts[i].mMsgStatus); has_read_below = !IS_MSG_UNREAD(mPosts[i].mMsgStatus);
mPosts[i].mMostRecentTsInThread = mPosts[i].mPublishTs;
for(uint32_t j=0;j<mPosts[i].mChildren.size();++j) for(uint32_t j=0;j<mPosts[i].mChildren.size();++j)
{ {
bool ub,rb; bool ub,rb;
recursUpdateReadStatus(mPosts[i].mChildren[j],ub,rb); recursUpdateReadStatusAndTimes(mPosts[i].mChildren[j],ub,rb);
has_unread_below = has_unread_below || ub ; has_unread_below = has_unread_below || ub ;
has_read_below = has_read_below || rb ; has_read_below = has_read_below || rb ;
if(mPosts[i].mMostRecentTsInThread < mPosts[mPosts[i].mChildren[j]].mMostRecentTsInThread)
mPosts[i].mMostRecentTsInThread = mPosts[mPosts[i].mChildren[j]].mMostRecentTsInThread;
if(ub && rb) // optimization if(ub && rb) // optimization
break; break;
} }

View File

@ -28,7 +28,7 @@ typedef uint32_t ForumModelIndex;
struct ForumModelPostEntry struct ForumModelPostEntry
{ {
ForumModelPostEntry() : mPublishTs(0),mPostFlags(0),mReputationWarningLevel(0),mMsgStatus(0),prow(0) {} ForumModelPostEntry() : mPublishTs(0),mMostRecentTsInThread(0),mPostFlags(0),mReputationWarningLevel(0),mMsgStatus(0),prow(0) {}
enum { // flags for display of posts. To be used in mPostFlags enum { // flags for display of posts. To be used in mPostFlags
FLAG_POST_IS_PINNED = 0x0001, FLAG_POST_IS_PINNED = 0x0001,
@ -44,6 +44,7 @@ struct ForumModelPostEntry
RsGxsId mAuthorId ; RsGxsId mAuthorId ;
RsGxsMessageId mMsgId; RsGxsMessageId mMsgId;
uint32_t mPublishTs; uint32_t mPublishTs;
uint32_t mMostRecentTsInThread;
uint32_t mPostFlags; uint32_t mPostFlags;
int mReputationWarningLevel; int mReputationWarningLevel;
int mMsgStatus; int mMsgStatus;
@ -87,6 +88,10 @@ public:
TREE_MODE_TREE = 0x01, TREE_MODE_TREE = 0x01,
}; };
enum SortMode{ SORT_MODE_PUBLISH_TS = 0x00,
SORT_MODE_CHILDREN_PUBLISH_TS = 0x01,
};
QModelIndex root() const{ return createIndex(0,0,(void*)NULL) ;} QModelIndex root() const{ return createIndex(0,0,(void*)NULL) ;}
QModelIndex getIndexOfMessage(const RsGxsMessageId& mid) const; QModelIndex getIndexOfMessage(const RsGxsMessageId& mid) const;
@ -119,6 +124,7 @@ public:
// This method will asynchroneously update the data // This method will asynchroneously update the data
void setForum(const RsGxsGroupId& forumGroup); void setForum(const RsGxsGroupId& forumGroup);
void setTreeMode(TreeMode mode) ; void setTreeMode(TreeMode mode) ;
void setSortMode(SortMode mode) ;
void setTextColorRead (QColor color) { mTextColorRead = color;} void setTextColorRead (QColor color) { mTextColorRead = color;}
void setTextColorUnread (QColor color) { mTextColorUnread = color;} void setTextColorUnread (QColor color) { mTextColorUnread = color;}
@ -172,6 +178,7 @@ private:
bool mUseChildTS; bool mUseChildTS;
bool mFilteringEnabled; bool mFilteringEnabled;
TreeMode mTreeMode; TreeMode mTreeMode;
SortMode mSortMode;
void *getParentRef(void *ref,int& row) const; void *getParentRef(void *ref,int& row) const;
void *getChildRef(void *ref,int row) const; void *getChildRef(void *ref,int row) const;
@ -183,9 +190,9 @@ private:
void update_posts(const RsGxsGroupId &group_id); void update_posts(const RsGxsGroupId &group_id);
void setForumMessageSummary(const std::vector<RsGxsForumMsg>& messages); void setForumMessageSummary(const std::vector<RsGxsForumMsg>& messages);
void recursUpdateReadStatus(ForumModelIndex i,bool& has_unread_below,bool& has_read_below); void recursUpdateReadStatusAndTimes(ForumModelIndex i,bool& has_unread_below,bool& has_read_below);
void recursSetMsgReadStatus(ForumModelIndex i,bool read_status,bool with_children);
uint32_t recursUpdateFilterStatus(ForumModelIndex i,int column,const QStringList& strings); uint32_t recursUpdateFilterStatus(ForumModelIndex i,int column,const QStringList& strings);
void recursSetMsgReadStatus(ForumModelIndex i,bool read_status,bool with_children);
static void generateMissingItem(const RsGxsMessageId &msgId,ForumModelPostEntry& entry); static void generateMissingItem(const RsGxsMessageId &msgId,ForumModelPostEntry& entry);
static ForumModelIndex addEntry(std::vector<ForumModelPostEntry>& posts,const ForumModelPostEntry& entry,ForumModelIndex parent); static ForumModelIndex addEntry(std::vector<ForumModelPostEntry>& posts,const ForumModelPostEntry& entry,ForumModelIndex parent);

View File

@ -2655,16 +2655,15 @@ void GxsForumThreadWidget::changedViewBox()
// save index // save index
Settings->setValueToGroup("ForumThreadWidget", "viewBox", ui->viewBox->currentIndex()); Settings->setValueToGroup("ForumThreadWidget", "viewBox", ui->viewBox->currentIndex());
switch(ui->viewBox->currentIndex()) if(ui->viewBox->currentIndex() == VIEW_FLAT)
{ mThreadModel->setTreeMode(RsGxsForumModel::TREE_MODE_FLAT);
default: else
case VIEW_THREADED: mThreadModel->setTreeMode(RsGxsForumModel::TREE_MODE_TREE);
case VIEW_LAST_POST: mThreadModel->setTreeMode(RsGxsForumModel::TREE_MODE_TREE);
break;
case VIEW_FLAT: mThreadModel->setTreeMode(RsGxsForumModel::TREE_MODE_FLAT); if(ui->viewBox->currentIndex() == VIEW_LAST_POST)
break; mThreadModel->setSortMode(RsGxsForumModel::SORT_MODE_CHILDREN_PUBLISH_TS);
} else
mThreadModel->setSortMode(RsGxsForumModel::SORT_MODE_PUBLISH_TS);
} }
void GxsForumThreadWidget::filterColumnChanged(int column) void GxsForumThreadWidget::filterColumnChanged(int column)