From 2a6e63595e0cfe01799970facdcdd0628042d389 Mon Sep 17 00:00:00 2001 From: James Graham Date: Fri, 8 Mar 2024 18:36:43 +0000 Subject: [PATCH] Fix space tree refresh Stop space hierarchy being duplicated. This is done by making sure old jobs are cleared at all resets and to make doubly sure when a child is inserted it overrides itself so there can never be duplicates --- src/models/spacechildrenmodel.cpp | 21 ++++++++++++--------- src/models/spacetreeitem.cpp | 19 ++++++++++++++++--- src/models/spacetreeitem.h | 6 ++++-- 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/models/spacechildrenmodel.cpp b/src/models/spacechildrenmodel.cpp index 49cdaca59..5447642f3 100644 --- a/src/models/spacechildrenmodel.cpp +++ b/src/models/spacechildrenmodel.cpp @@ -38,13 +38,6 @@ void SpaceChildrenModel::setSpace(NeoChatRoom *space) m_space = space; Q_EMIT spaceChanged(); - for (auto job : m_currentJobs) { - if (job) { - job->abandon(); - } - } - m_currentJobs.clear(); - auto connection = m_space->connection(); connect(connection, &Quotient::Connection::loadedRoomState, this, [this](Quotient::Room *room) { if (m_pendingChildren.contains(room->name())) { @@ -66,6 +59,17 @@ bool SpaceChildrenModel::loading() const void SpaceChildrenModel::refreshModel() { + for (auto job : m_currentJobs) { + if (job) { + job->abandon(); + } + } + m_currentJobs.clear(); + + if (m_space == nullptr) { + return; + } + beginResetModel(); m_replacedRooms.clear(); delete m_rootItem; @@ -120,8 +124,7 @@ void SpaceChildrenModel::insertChildren(std::vectorrooms(), index(insertRow, 0, parent)); }); } - parentItem->insertChild(insertRow, - new SpaceTreeItem(dynamic_cast(m_space->connection()), + parentItem->insertChild(new SpaceTreeItem(dynamic_cast(m_space->connection()), parentItem, children[i].roomId, children[i].name, diff --git a/src/models/spacetreeitem.cpp b/src/models/spacetreeitem.cpp index ebe5c818e..eee028d0a 100644 --- a/src/models/spacetreeitem.cpp +++ b/src/models/spacetreeitem.cpp @@ -37,6 +37,11 @@ SpaceTreeItem::~SpaceTreeItem() qDeleteAll(m_children); } +bool SpaceTreeItem::operator==(const SpaceTreeItem &other) const +{ + return m_id == other.id(); +} + SpaceTreeItem *SpaceTreeItem::child(int number) { if (number < 0 || number >= m_children.size()) { @@ -50,12 +55,20 @@ int SpaceTreeItem::childCount() const return m_children.count(); } -bool SpaceTreeItem::insertChild(int row, SpaceTreeItem *newChild) +bool SpaceTreeItem::insertChild(SpaceTreeItem *newChild) { - if (row < 0 || row > m_children.size()) { + if (newChild == nullptr) { return false; } - m_children.insert(row, newChild); + + for (auto it = m_children.begin(), end = m_children.end(); it != end; ++it) { + if (*it == newChild) { + *it = newChild; + return true; + } + } + + m_children.append(newChild); return true; } diff --git a/src/models/spacetreeitem.h b/src/models/spacetreeitem.h index f339f3770..2f43fbc4e 100644 --- a/src/models/spacetreeitem.h +++ b/src/models/spacetreeitem.h @@ -35,6 +35,8 @@ public: Quotient::StateEvents childStates = {}); ~SpaceTreeItem(); + bool operator==(const SpaceTreeItem &other) const; + /** * @brief Return the child at the given row number. * @@ -48,9 +50,9 @@ public: int childCount() const; /** - * @brief Insert the given child at the given row number. + * @brief Insert the given child. */ - bool insertChild(int row, SpaceTreeItem *newChild); + bool insertChild(SpaceTreeItem *newChild); /** * @brief Remove the child at the given row number.