From fb962c4b5bc05b365c45962c44861f72634afa49 Mon Sep 17 00:00:00 2001 From: csoler Date: Tue, 4 Dec 2018 09:36:06 +0100 Subject: [PATCH] attempt to fix crash when threads collide in forum model --- .../src/gui/gxsforums/GxsForumModel.cpp | 49 ++++++++++--------- .../src/gui/gxsforums/GxsForumModel.h | 3 ++ .../gui/gxsforums/GxsForumThreadWidget.cpp | 20 ++++++++ .../src/gui/gxsforums/GxsForumThreadWidget.h | 1 + 4 files changed, 50 insertions(+), 23 deletions(-) diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumModel.cpp b/retroshare-gui/src/gui/gxsforums/GxsForumModel.cpp index d4ca2b085..e5c49caa3 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumModel.cpp +++ b/retroshare-gui/src/gui/gxsforums/GxsForumModel.cpp @@ -49,39 +49,46 @@ RsGxsForumModel::RsGxsForumModel(QObject *parent) mFilteringEnabled=false; } +void RsGxsForumModel::preMods() +{ + emit layoutAboutToBeChanged(); + beginResetModel(); +} +void RsGxsForumModel::postMods() +{ + endResetModel(); + emit dataChanged(createIndex(0,0,(void*)NULL), createIndex(0,COLUMN_THREAD_NB_COLUMNS-1,(void*)NULL)); + emit layoutChanged(); +} + void RsGxsForumModel::setTreeMode(TreeMode mode) { if(mode == mTreeMode) return; - emit layoutAboutToBeChanged(); - + preMods(); mTreeMode = mode; - - emit dataChanged(createIndex(0,0,(void*)NULL), createIndex(0,COLUMN_THREAD_NB_COLUMNS-1,(void*)NULL)); - emit layoutChanged(); + postMods(); } void RsGxsForumModel::setSortMode(SortMode mode) { - emit layoutAboutToBeChanged(); + preMods(); mSortMode = mode; - emit dataChanged(createIndex(0,0,(void*)NULL), createIndex(0,COLUMN_THREAD_NB_COLUMNS-1,(void*)NULL)); - emit layoutChanged(); + postMods(); } void RsGxsForumModel::initEmptyHierarchy(std::vector& posts) { - emit layoutAboutToBeChanged(); + preMods(); posts.resize(1); // adds a sentinel item posts[0].mTitle = "Root sentinel post" ; posts[0].mParent = 0; - emit dataChanged(createIndex(0,0,(void*)NULL), createIndex(0,COLUMN_THREAD_NB_COLUMNS-1,(void*)NULL)); - emit layoutChanged(); + postMods(); } int RsGxsForumModel::rowCount(const QModelIndex& parent) const @@ -474,7 +481,7 @@ uint32_t RsGxsForumModel::recursUpdateFilterStatus(ForumModelIndex i,int column, void RsGxsForumModel::setFilter(int column,const QStringList& strings,uint32_t& count) { - emit layoutAboutToBeChanged(); + preMods(); if(!strings.empty()) { @@ -484,8 +491,7 @@ void RsGxsForumModel::setFilter(int column,const QStringList& strings,uint32_t& else mFilteringEnabled = false; - emit dataChanged(createIndex(0,0,(void*)NULL), createIndex(0,COLUMN_THREAD_NB_COLUMNS-1,(void*)NULL)); - emit layoutChanged(); + postMods(); } QVariant RsGxsForumModel::missingRole(const ForumModelPostEntry& fmpe,int column) const @@ -672,19 +678,18 @@ void RsGxsForumModel::setForum(const RsGxsGroupId& forum_group_id) void RsGxsForumModel::clear() { - emit layoutAboutToBeChanged(); + preMods(); mPosts.clear(); mPostVersions.clear(); - emit layoutChanged(); + postMods(); emit forumLoaded(); - emit dataChanged(createIndex(0,0,(void*)NULL), createIndex(0,COLUMN_THREAD_NB_COLUMNS-1,(void*)NULL)); } void RsGxsForumModel::setPosts(const RsGxsForumGroup& group, const std::vector& posts,const std::map > >& post_versions) { - emit layoutAboutToBeChanged(); + preMods(); mForumGroup = group; mPosts = posts; @@ -707,9 +712,8 @@ void RsGxsForumModel::setPosts(const RsGxsForumGroup& group, const std::vector > &ms void GxsForumThreadWidget::updateDisplay(bool complete) { + if(mUpdating) + return; + if (complete) { /* Fill complete */ + mUpdating=true; updateGroupData(); mThreadModel->setForum(groupId()); insertMessage(); @@ -604,6 +609,7 @@ void GxsForumThreadWidget::updateDisplay(bool complete) if (grpIds.find(groupId())!=grpIds.end()){ updateGroup = true; /* Update threads */ + mUpdating=true; mThreadModel->setForum(groupId()); } else { std::map > msgIds; @@ -615,7 +621,10 @@ void GxsForumThreadWidget::updateDisplay(bool complete) } if (msgIds.find(groupId()) != msgIds.end()) + { + mUpdating=true; mThreadModel->setForum(groupId()); /* Update threads */ + } } if (updateGroup) { @@ -855,6 +864,9 @@ void GxsForumThreadWidget::togglethreadview_internal() void GxsForumThreadWidget::changedVersion() { + if(mUpdating) + return; + mThreadId = RsGxsMessageId(ui->versions_CB->itemData(ui->versions_CB->currentIndex()).toString().toStdString()) ; ui->postText->resetImagesStatus(Settings->getForumLoadEmbeddedImages()) ; @@ -863,6 +875,9 @@ void GxsForumThreadWidget::changedVersion() void GxsForumThreadWidget::changedThread(QModelIndex index) { + if(mUpdating) + return; + if(!index.isValid()) { mThreadId.clear(); @@ -884,6 +899,9 @@ void GxsForumThreadWidget::changedThread(QModelIndex index) void GxsForumThreadWidget::clickedThread(QModelIndex index) { + if(mUpdating) + return; + if(!index.isValid()) return; @@ -1622,6 +1640,8 @@ void GxsForumThreadWidget::updateGroupName() ui->forumName->setText(QString::fromUtf8(mForumGroup.mMeta.mGroupName.c_str())); ui->threadTreeWidget->sortByColumn(RsGxsForumModel::COLUMN_THREAD_DATE, Qt::DescendingOrder); ui->threadTreeWidget->update(); + + mUpdating = false; } void GxsForumThreadWidget::updateGroupData() { diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h index e4d4c8d7a..46e80aa33 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h @@ -176,6 +176,7 @@ private: QString mForumDescription; int mSubscribeFlags; int mSignFlags; + bool mUpdating; bool mInProcessSettings; bool mInMsgAsReadUnread; int mLastViewType;