diff --git a/src/models/spacechildrenmodel.cpp b/src/models/spacechildrenmodel.cpp index 1844aad2c..8a7933868 100644 --- a/src/models/spacechildrenmodel.cpp +++ b/src/models/spacechildrenmodel.cpp @@ -131,18 +131,18 @@ void SpaceChildrenModel::insertChildren(std::vectorrooms(), index(insertRow, 0, parent)); }); } - parentItem->insertChild(new SpaceTreeItem(dynamic_cast(m_space->connection()), - parentItem, - children[i].roomId, - children[i].name, - children[i].canonicalAlias, - children[i].topic, - children[i].numJoinedMembers, - children[i].avatarUrl, - children[i].guestCanJoin, - children[i].worldReadable, - children[i].roomType == QLatin1String("m.space"), - std::move(children[i].childrenState))); + parentItem->insertChild(std::make_unique(dynamic_cast(m_space->connection()), + parentItem, + children[i].roomId, + children[i].name, + children[i].canonicalAlias, + children[i].topic, + children[i].numJoinedMembers, + children[i].avatarUrl, + children[i].guestCanJoin, + children[i].worldReadable, + children[i].roomType == QLatin1String("m.space"), + std::move(children[i].childrenState))); } } endInsertRows(); diff --git a/src/models/spacetreeitem.cpp b/src/models/spacetreeitem.cpp index eee028d0a..892190e13 100644 --- a/src/models/spacetreeitem.cpp +++ b/src/models/spacetreeitem.cpp @@ -32,30 +32,22 @@ SpaceTreeItem::SpaceTreeItem(NeoChatConnection *connection, { } -SpaceTreeItem::~SpaceTreeItem() -{ - qDeleteAll(m_children); -} - bool SpaceTreeItem::operator==(const SpaceTreeItem &other) const { return m_id == other.id(); } -SpaceTreeItem *SpaceTreeItem::child(int number) +SpaceTreeItem *SpaceTreeItem::child(int row) { - if (number < 0 || number >= m_children.size()) { - return nullptr; - } - return m_children[number]; + return row >= 0 && row < childCount() ? m_children.at(row).get() : nullptr; } int SpaceTreeItem::childCount() const { - return m_children.count(); + return int(m_children.size()); } -bool SpaceTreeItem::insertChild(SpaceTreeItem *newChild) +bool SpaceTreeItem::insertChild(std::unique_ptr newChild) { if (newChild == nullptr) { return false; @@ -63,30 +55,39 @@ bool SpaceTreeItem::insertChild(SpaceTreeItem *newChild) for (auto it = m_children.begin(), end = m_children.end(); it != end; ++it) { if (*it == newChild) { - *it = newChild; + *it = std::move(newChild); return true; } } - m_children.append(newChild); + m_children.push_back(std::move(newChild)); return true; } bool SpaceTreeItem::removeChild(int row) { - if (row < 0 || row >= m_children.size()) { + if (row < 0 || row >= childCount()) { return false; } - delete m_children.takeAt(row); + m_children.erase(m_children.begin() + row); return true; } int SpaceTreeItem::row() const { - if (m_parentItem) { - return m_parentItem->m_children.indexOf(const_cast(this)); + if (m_parentItem == nullptr) { + return 0; } - return 0; + + const auto it = std::find_if(m_parentItem->m_children.cbegin(), m_parentItem->m_children.cend(), [this](const std::unique_ptr &treeItem) { + return treeItem.get() == this; + }); + + if (it != m_parentItem->m_children.cend()) { + return std::distance(m_parentItem->m_children.cbegin(), it); + } + Q_ASSERT(false); // should not happen + return -1; } SpaceTreeItem *SpaceTreeItem::parentItem() const diff --git a/src/models/spacetreeitem.h b/src/models/spacetreeitem.h index 2f43fbc4e..1075cb3a5 100644 --- a/src/models/spacetreeitem.h +++ b/src/models/spacetreeitem.h @@ -33,7 +33,6 @@ public: bool worldReadable = {}, bool isSpace = {}, Quotient::StateEvents childStates = {}); - ~SpaceTreeItem(); bool operator==(const SpaceTreeItem &other) const; @@ -42,7 +41,7 @@ public: * * Nullptr is returned if there is no child at the given row number. */ - SpaceTreeItem *child(int number); + SpaceTreeItem *child(int row); /** * @brief The number of children this item has. @@ -52,7 +51,7 @@ public: /** * @brief Insert the given child. */ - bool insertChild(SpaceTreeItem *newChild); + bool insertChild(std::unique_ptr newChild); /** * @brief Remove the child at the given row number. @@ -151,7 +150,7 @@ public: private: NeoChatConnection *m_connection; - QList m_children; + std::vector> m_children; SpaceTreeItem *m_parentItem; QString m_id;