fixed saving/restoring of expanded items in forum model

This commit is contained in:
csoler 2018-12-05 20:28:58 +01:00
parent 11b4981bd4
commit 600a3d8e16
No known key found for this signature in database
GPG key ID: 7BCA522266C0804C
2 changed files with 74 additions and 33 deletions

View file

@ -582,16 +582,47 @@ static void removeMessages(std::map<RsGxsGroupId, std::set<RsGxsMessageId> > &ms
} }
} }
void GxsForumThreadWidget::saveExpandedItems(QList<RsGxsMessageId>& expanded_items) const
{
expanded_items.clear();
for(int row = 0; row < mThreadProxyModel->rowCount(); ++row)
{
std::string path = mThreadProxyModel->index(row,0).data(Qt::DisplayRole).toString().toStdString();
recursSaveExpandedItems(mThreadProxyModel->index(row,0),expanded_items);
}
}
void GxsForumThreadWidget::recursSaveExpandedItems(const QModelIndex& index, QList<RsGxsMessageId>& expanded_items) const
{
if(ui->threadTreeWidget->isExpanded(index))
{
for(int row=0;row<mThreadProxyModel->rowCount(index);++row)
recursSaveExpandedItems(index.child(row,0),expanded_items) ;
RsGxsMessageId message_id(index.sibling(index.row(),RsGxsForumModel::COLUMN_THREAD_MSGID).data(Qt::UserRole).toString().toStdString());
expanded_items.push_back(message_id);
}
}
void GxsForumThreadWidget::recursRestoreExpandedItems(const QModelIndex& index, const QList<RsGxsMessageId>& expanded_items)
{
for(auto it(expanded_items.begin());it!=expanded_items.end();++it)
ui->threadTreeWidget->setExpanded( mThreadProxyModel->mapFromSource(mThreadModel->getIndexOfMessage(*it)) ,true) ;
}
void GxsForumThreadWidget::updateDisplay(bool complete) void GxsForumThreadWidget::updateDisplay(bool complete)
{ {
if(mUpdating) if(mUpdating)
return; return;
if (complete) { if (complete) {
/* Fill complete */ /* Fill complete */
saveExpandedItems(mSavedExpandedMessages);
mUpdating=true; mUpdating=true;
updateGroupData(); updateGroupData();
mThreadModel->setForum(groupId()); mThreadModel->setForum(groupId());
insertMessage(); insertMessage();
@ -600,37 +631,44 @@ void GxsForumThreadWidget::updateDisplay(bool complete)
return; return;
} }
else
{
bool updateGroup = false; bool updateGroup = false;
const std::set<RsGxsGroupId> &grpIdsMeta = getGrpIdsMeta(); const std::set<RsGxsGroupId> &grpIdsMeta = getGrpIdsMeta();
if(grpIdsMeta.find(groupId())!=grpIdsMeta.end()) if(grpIdsMeta.find(groupId())!=grpIdsMeta.end())
updateGroup = true; updateGroup = true;
const std::set<RsGxsGroupId> &grpIds = getGrpIds(); const std::set<RsGxsGroupId> &grpIds = getGrpIds();
if (grpIds.find(groupId())!=grpIds.end()){
updateGroup = true;
/* Update threads */
mUpdating=true;
mThreadModel->setForum(groupId());
} else {
std::map<RsGxsGroupId, std::set<RsGxsMessageId> > msgIds;
getAllMsgIds(msgIds);
if (!mIgnoredMsgId.empty()) { if (grpIds.find(groupId())!=grpIds.end()){
/* Filter ignored messages */ updateGroup = true;
removeMessages(msgIds, mIgnoredMsgId); /* Update threads */
mUpdating=true;
mThreadModel->setForum(groupId());
}
else
{
std::map<RsGxsGroupId, std::set<RsGxsMessageId> > msgIds;
getAllMsgIds(msgIds);
if (!mIgnoredMsgId.empty()) /* Filter ignored messages */
removeMessages(msgIds, mIgnoredMsgId);
if (msgIds.find(groupId()) != msgIds.end())
{
mUpdating=true;
saveExpandedItems(mSavedExpandedMessages);
mThreadModel->setForum(groupId()); /* Update threads */
}
} }
if (msgIds.find(groupId()) != msgIds.end()) if (updateGroup)
{ updateGroupData();
mUpdating=true;
mThreadModel->setForum(groupId()); /* Update threads */
}
}
if (updateGroup) {
updateGroupData();
} }
} }
@ -1531,10 +1569,6 @@ void GxsForumThreadWidget::replyForumMessageData(const RsGxsForumMsg &msg)
{ {
CreateGxsForumMsg *cfm = new CreateGxsForumMsg(groupId(), mThreadId,RsGxsMessageId()); CreateGxsForumMsg *cfm = new CreateGxsForumMsg(groupId(), mThreadId,RsGxsMessageId());
// QTextDocument doc ;
// doc.setHtml(QString::fromUtf8(msg.mMsg.c_str()) );
// std::string cited_text(doc.toPlainText().toStdString()) ;
RsHtml::makeQuotedText(ui->postText); RsHtml::makeQuotedText(ui->postText);
cfm->insertPastedText(RsHtml::makeQuotedText(ui->postText)) ; cfm->insertPastedText(RsHtml::makeQuotedText(ui->postText)) ;
@ -1651,11 +1685,14 @@ void GxsForumThreadWidget::postForumLoading()
ui->threadTreeWidget->selectionModel()->reset(); ui->threadTreeWidget->selectionModel()->reset();
mThreadId.clear(); mThreadId.clear();
} }
// we also need to restore expanded threads
ui->forumName->setText(QString::fromUtf8(mForumGroup.mMeta.mGroupName.c_str())); ui->forumName->setText(QString::fromUtf8(mForumGroup.mMeta.mGroupName.c_str()));
ui->threadTreeWidget->sortByColumn(RsGxsForumModel::COLUMN_THREAD_DATE, Qt::DescendingOrder); ui->threadTreeWidget->sortByColumn(RsGxsForumModel::COLUMN_THREAD_DATE, Qt::DescendingOrder);
ui->threadTreeWidget->update(); ui->threadTreeWidget->update();
recursRestoreExpandedItems(mThreadProxyModel->mapFromSource(mThreadModel->root()),mSavedExpandedMessages);
mUpdating = false; mUpdating = false;
} }
void GxsForumThreadWidget::updateGroupData() void GxsForumThreadWidget::updateGroupData()
@ -1665,7 +1702,6 @@ void GxsForumThreadWidget::updateGroupData()
mSubscribeFlags = 0; mSubscribeFlags = 0;
mSignFlags = 0; mSignFlags = 0;
//mThreadId.clear();
mForumDescription.clear(); mForumDescription.clear();
ui->threadTreeWidget->selectionModel()->clear(); ui->threadTreeWidget->selectionModel()->clear();
ui->threadTreeWidget->selectionModel()->reset(); ui->threadTreeWidget->selectionModel()->reset();

View file

@ -152,6 +152,10 @@ private:
void insertMessage(); void insertMessage();
void insertGroupData(); void insertGroupData();
void recursRestoreExpandedItems(const QModelIndex& index, const QList<RsGxsMessageId>& expanded_items);
void recursSaveExpandedItems(const QModelIndex& index, QList<RsGxsMessageId>& expanded_items) const;
void saveExpandedItems(QList<RsGxsMessageId>& expanded_items) const;
int getSelectedMsgCount(QList<QTreeWidgetItem*> *pRows, QList<QTreeWidgetItem*> *pRowsRead, QList<QTreeWidgetItem*> *pRowsUnread); int getSelectedMsgCount(QList<QTreeWidgetItem*> *pRows, QList<QTreeWidgetItem*> *pRowsRead, QList<QTreeWidgetItem*> *pRowsUnread);
void setMsgReadStatus(QList<QTreeWidgetItem*> &rows, bool read); void setMsgReadStatus(QList<QTreeWidgetItem*> &rows, bool read);
void markMsgAsReadUnread(bool read, bool children, bool forum); void markMsgAsReadUnread(bool read, bool children, bool forum);
@ -159,7 +163,7 @@ private:
void togglethreadview_internal(); void togglethreadview_internal();
bool filterItem(QTreeWidgetItem *item, const QString &text, int filterColumn); //bool filterItem(QTreeWidgetItem *item, const QString &text, int filterColumn);
void processSettings(bool bLoad); void processSettings(bool bLoad);
@ -197,6 +201,7 @@ private:
RsGxsForumModel *mThreadModel; RsGxsForumModel *mThreadModel;
QSortFilterProxyModel *mThreadProxyModel; QSortFilterProxyModel *mThreadProxyModel;
QList<RsGxsMessageId> mSavedExpandedMessages;
Ui::GxsForumThreadWidget *ui; Ui::GxsForumThreadWidget *ui;
}; };