From 2b19081cb0840fe9e8d467e7905fbefb680858e1 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 22 Apr 2015 14:49:14 +0200 Subject: [PATCH] TreeModel: More API cleanup - introduce topLevelItemCount (similar to QTreeWidget) - squash untypedTreeLevelItems() - rename removeItems() to clear() - rename removeItem() to takeItem() - rename treeLevelItems<> to itemsAtLevel<> Change-Id: I0f1bb4110f7687b20da3d92e3d943858645a9fa2 Reviewed-by: Eike Ziller --- src/libs/extensionsystem/pluginview.cpp | 2 +- src/libs/utils/treemodel.cpp | 26 +++++++------ src/libs/utils/treemodel.h | 38 ++++++++----------- .../cmakeprojectmanager/cmakesettingspage.cpp | 6 +-- src/plugins/debugger/breakhandler.cpp | 6 +-- src/plugins/debugger/cdb/cdbengine.cpp | 2 +- src/plugins/debugger/debuggerengine.cpp | 2 +- src/plugins/debugger/debuggeroptionspage.cpp | 4 +- .../debugger/debuggertooltipmanager.cpp | 2 +- src/plugins/debugger/moduleshandler.cpp | 6 +-- src/plugins/debugger/pdb/pdbengine.cpp | 2 +- src/plugins/debugger/watchhandler.cpp | 8 ++-- src/plugins/projectexplorer/kitmodel.cpp | 20 +++++----- .../projectexplorer/toolchainoptionspage.cpp | 8 ++-- tests/auto/utils/treemodel/tst_treemodel.cpp | 2 +- 15 files changed, 65 insertions(+), 69 deletions(-) diff --git a/src/libs/extensionsystem/pluginview.cpp b/src/libs/extensionsystem/pluginview.cpp index a0b87a51cfb..53f3b71524d 100644 --- a/src/libs/extensionsystem/pluginview.cpp +++ b/src/libs/extensionsystem/pluginview.cpp @@ -392,7 +392,7 @@ PluginSpec *PluginView::pluginForIndex(const QModelIndex &index) const void PluginView::updatePlugins() { // Model. - m_model->removeItems(); + m_model->clear(); PluginCollection *defaultCollection = 0; QList collections; diff --git a/src/libs/utils/treemodel.cpp b/src/libs/utils/treemodel.cpp index 76aed344c34..131a56768a0 100644 --- a/src/libs/utils/treemodel.cpp +++ b/src/libs/utils/treemodel.cpp @@ -984,6 +984,11 @@ TreeItem *TreeModel::rootItem() const return m_root; } +int TreeModel::topLevelItemCount() const +{ + return m_root->childCount(); +} + void TreeModel::setRootItem(TreeItem *item) { delete m_root; @@ -1030,25 +1035,22 @@ QModelIndex TreeModel::indexForItem(const TreeItem *item) const return createIndex(row, 0, mitem); } -void TreeModel::removeItems() +/*! + Destroys all items in them model except the invisible root item. +*/ +void TreeModel::clear() { if (m_root) m_root->removeChildren(); } -UntypedTreeLevelItems TreeModel::untypedLevelItems(int level, TreeItem *start) const -{ - if (start == 0) - start = m_root; - return UntypedTreeLevelItems(start, level); -} +/*! + Removes the specified item from the model. -UntypedTreeLevelItems TreeModel::untypedLevelItems(TreeItem *start) const -{ - return UntypedTreeLevelItems(start, 1); -} + \note The item is not destroyed, ownership is effectively passed to the caller. + */ -void TreeModel::removeItem(TreeItem *item) +void TreeModel::takeItem(TreeItem *item) { #if USE_MODEL_TEST (void) new ModelTest(this, this); diff --git a/src/libs/utils/treemodel.h b/src/libs/utils/treemodel.h index 1ce85ef3343..fef813dfe73 100644 --- a/src/libs/utils/treemodel.h +++ b/src/libs/utils/treemodel.h @@ -99,6 +99,8 @@ public: void setLazy(bool on); void setPopulated(bool on); void setFlags(Qt::ItemFlags flags); + int childCount() const { return m_children.size(); } + TreeItem *childAt(int index) const { return m_children.at(index); } QVector children() const { return m_children; } QModelIndex index() const; @@ -258,8 +260,17 @@ class QTCREATOR_UTILS_EXPORT TreeModel : public QAbstractItemModel public: explicit TreeModel(QObject *parent = 0); explicit TreeModel(TreeItem *root, QObject *parent = 0); - virtual ~TreeModel(); + ~TreeModel(); + void setHeader(const QStringList &displays); + void clear(); + + TreeItem *rootItem() const; + void setRootItem(TreeItem *item); + TreeItem *itemForIndex(const QModelIndex &) const; + QModelIndex indexForItem(const TreeItem *needle) const; + + int topLevelItemCount() const; int rowCount(const QModelIndex &idx = QModelIndex()) const; int columnCount(const QModelIndex &idx) const; @@ -274,36 +285,19 @@ public: bool canFetchMore(const QModelIndex &idx) const; void fetchMore(const QModelIndex &idx); - TreeItem *rootItem() const; - void setRootItem(TreeItem *item); - TreeItem *itemForIndex(const QModelIndex &) const; - QModelIndex indexForItem(const TreeItem *needle) const; - void removeItems(); - - void setHeader(const QStringList &displays); - - UntypedTreeLevelItems untypedLevelItems(int level = 0, TreeItem *start = 0) const; - UntypedTreeLevelItems untypedLevelItems(TreeItem *start) const; - template - TreeLevelItems treeLevelItems(int level, TreeItem *start = 0) const + TreeLevelItems itemsAtLevel(int level, TreeItem *start = 0) const { - return TreeLevelItems(untypedLevelItems(level, start)); - } - - template - TreeLevelItems treeLevelItems(TreeItem *start) const - { - return TreeLevelItems(untypedLevelItems(start)); + return TreeLevelItems(UntypedTreeLevelItems(start ? start : m_root, level)); } template T findItemAtLevel(int level, std::function f, TreeItem *start = 0) const { - return Utils::findOrDefault(treeLevelItems(level, start), f); + return Utils::findOrDefault(itemsAtLevel(level, start), f); } - void removeItem(TreeItem *item); // item is not destroyed. + void takeItem(TreeItem *item); // item is not destroyed. signals: void requestExpansion(QModelIndex); diff --git a/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp b/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp index bb9ba4305bf..3436b87e5dc 100644 --- a/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp +++ b/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp @@ -237,7 +237,7 @@ void CMakeToolItemModel::removeCMakeTool(const Core::Id &id) CMakeToolTreeItem *treeItem = cmakeToolItem(id); QTC_ASSERT(treeItem, return); - removeItem(treeItem); + takeItem(treeItem); m_removedItems.append(id); delete treeItem; @@ -248,7 +248,7 @@ void CMakeToolItemModel::apply() foreach (const Core::Id &id, m_removedItems) CMakeToolManager::deregisterCMakeTool(id); - foreach (auto item, treeLevelItems(2)) { + foreach (auto item, itemsAtLevel(2)) { item->m_changed = false; bool isNew = false; @@ -300,7 +300,7 @@ void CMakeToolItemModel::setDefaultItemId(const Core::Id &id) QString CMakeToolItemModel::uniqueDisplayName(const QString &base) const { QStringList names; - foreach (CMakeToolTreeItem *item, treeLevelItems(2)) + foreach (CMakeToolTreeItem *item, itemsAtLevel(2)) names << item->m_name; return ProjectExplorer::Project::makeUnique(base, names); diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp index 28d3ed71ac9..78ca7a69482 100644 --- a/src/plugins/debugger/breakhandler.cpp +++ b/src/plugins/debugger/breakhandler.cpp @@ -401,7 +401,7 @@ void BreakHandler::deletionHelper(BreakpointModelId id) { Breakpoint b = breakpointById(id); QTC_ASSERT(b, return); - removeItem(b.b); + takeItem(b.b); delete b.b; } @@ -1132,7 +1132,7 @@ void BreakHandler::saveSessionData() void BreakHandler::loadSessionData() { - removeItems(); + clear(); loadBreakpoints(); } @@ -1216,7 +1216,7 @@ void BreakHandler::changeLineNumberFromMarkerHelper(BreakpointModelId id) Breakpoint b = breakpointById(id); QTC_ASSERT(b, return); BreakpointParameters params = b.parameters(); - removeItem(b.b); + takeItem(b.b); delete b.b; appendBreakpoint(params); } diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index c9c49200846..4d6acbbb0c3 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -1875,7 +1875,7 @@ void CdbEngine::handleLocals(const CdbResponse &response, bool newFrame) QSet toDelete; if (newFrame) { - foreach (WatchItem *item, handler->model()->treeLevelItems(2)) + foreach (WatchItem *item, handler->model()->itemsAtLevel(2)) toDelete.insert(item->iname); } diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index 5c688ba4891..f22dc5a3c25 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -1944,7 +1944,7 @@ void DebuggerEngine::updateLocalsView(const GdbMi &all) QSet toDelete; if (!partial) { - foreach (WatchItem *item, handler->model()->treeLevelItems(2)) + foreach (WatchItem *item, handler->model()->itemsAtLevel(2)) toDelete.insert(item->iname); } diff --git a/src/plugins/debugger/debuggeroptionspage.cpp b/src/plugins/debugger/debuggeroptionspage.cpp index 32653c25c6a..00198db40ed 100644 --- a/src/plugins/debugger/debuggeroptionspage.cpp +++ b/src/plugins/debugger/debuggeroptionspage.cpp @@ -165,7 +165,7 @@ void DebuggerItemModel::removeCurrentDebugger() QVariant id = m_currentTreeItem->m_item.id(); DebuggerTreeItem *treeItem = m_currentTreeItem; m_currentTreeItem = 0; - removeItem(treeItem); + takeItem(treeItem); delete treeItem; m_removedItems.append(id); } @@ -175,7 +175,7 @@ void DebuggerItemModel::apply() foreach (const QVariant &id, m_removedItems) DebuggerItemManager::deregisterDebugger(id); - foreach (auto item, treeLevelItems(2)) { + foreach (auto item, itemsAtLevel(2)) { item->m_changed = false; DebuggerItemManager::updateOrAddDebugger(item->m_item); } diff --git a/src/plugins/debugger/debuggertooltipmanager.cpp b/src/plugins/debugger/debuggertooltipmanager.cpp index 14ae377d044..a62d93b793a 100644 --- a/src/plugins/debugger/debuggertooltipmanager.cpp +++ b/src/plugins/debugger/debuggertooltipmanager.cpp @@ -199,7 +199,7 @@ public: ToolTipWatchItem(WatchItem *item); bool hasChildren() const { return expandable; } - bool canFetchMore() const { return children().isEmpty() && expandable && model(); } + bool canFetchMore() const { return childCount() == 0 && expandable && model(); } void fetchMore() {} QVariant data(int column, int role) const; diff --git a/src/plugins/debugger/moduleshandler.cpp b/src/plugins/debugger/moduleshandler.cpp index 3e793a424b6..0e62454b78f 100644 --- a/src/plugins/debugger/moduleshandler.cpp +++ b/src/plugins/debugger/moduleshandler.cpp @@ -197,7 +197,7 @@ QAbstractItemModel *ModulesHandler::model() const void ModulesHandler::removeAll() { - m_model->removeItems(); + m_model->clear(); } Modules ModulesHandler::modules() const @@ -212,7 +212,7 @@ Modules ModulesHandler::modules() const void ModulesHandler::removeModule(const QString &modulePath) { if (ModuleItem *item = moduleFromPath(m_model->rootItem(), modulePath)) - m_model->removeItem(item); + m_model->takeItem(item); } void ModulesHandler::updateModule(const Module &module) @@ -254,7 +254,7 @@ void ModulesHandler::endUpdateAll() for (int i = root->rowCount(); --i >= 0; ) { auto item = static_cast(root->child(i)); if (!item->updated) - m_model->removeItem(item); + m_model->takeItem(item); } } diff --git a/src/plugins/debugger/pdb/pdbengine.cpp b/src/plugins/debugger/pdb/pdbengine.cpp index 88d3bb7abf3..7bca79d9a3b 100644 --- a/src/plugins/debugger/pdb/pdbengine.cpp +++ b/src/plugins/debugger/pdb/pdbengine.cpp @@ -572,7 +572,7 @@ void PdbEngine::refreshLocals(const GdbMi &vars) handler->resetValueCache(); QSet toDelete; - foreach (WatchItem *item, handler->model()->treeLevelItems(2)) + foreach (WatchItem *item, handler->model()->itemsAtLevel(2)) toDelete.insert(item->iname); foreach (const GdbMi &child, vars.children()) { diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index 59675a068f8..a7cf1237bb6 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -1241,7 +1241,7 @@ void WatchModel::insertItem(WatchItem *item) { WatchItem *existing = findItem(item->iname); if (existing) - removeItem(existing); + takeItem(existing); //item->walkTree([item](TreeItem *sub) { sub->sortChildren(&watchItemSorter); }); item->sortChildren(&watchItemSorter); @@ -1308,7 +1308,7 @@ void WatchHandler::purgeOutdatedItems(const QSet &inames) { foreach (const QByteArray &iname, inames) { WatchItem *item = findItem(iname); - m_model->removeItem(item); + m_model->takeItem(item); } m_model->layoutChanged(); @@ -1326,7 +1326,7 @@ void WatchHandler::removeItemByIName(const QByteArray &iname) theWatcherNames.remove(item->exp); saveWatchers(); } - m_model->removeItem(item); + m_model->takeItem(item); delete item; updateWatchersWindow(); } @@ -1492,7 +1492,7 @@ void WatchHandler::updateWatchersWindow() // Force show/hide of watchers and return view. int showWatch = !theWatcherNames.isEmpty(); - int showReturn = !m_model->m_returnRoot->children().isEmpty(); + int showReturn = m_model->m_returnRoot->childCount() != 0; Internal::updateWatchersWindow(showWatch, showReturn); } diff --git a/src/plugins/projectexplorer/kitmodel.cpp b/src/plugins/projectexplorer/kitmodel.cpp index 5296dcd1470..fd24304194e 100644 --- a/src/plugins/projectexplorer/kitmodel.cpp +++ b/src/plugins/projectexplorer/kitmodel.cpp @@ -192,8 +192,8 @@ void KitModel::isAutoDetectedChanged() if (oldParent && oldParent != newParent) { beginMoveRows(indexForItem(oldParent), idx, idx, indexForItem(newParent), newParent->children().size()); - TreeItem *n = oldParent->children().at(idx); - removeItem(n); + TreeItem *n = oldParent->childAt(idx); + takeItem(n); newParent->appendChild(n); endMoveRows(); } @@ -202,7 +202,7 @@ void KitModel::isAutoDetectedChanged() void KitModel::validateKitNames() { QHash nameHash; - foreach (KitNode *n, treeLevelItems(2)) { + foreach (KitNode *n, itemsAtLevel(2)) { const QString displayName = n->widget->displayName(); if (nameHash.contains(displayName)) ++nameHash[displayName]; @@ -210,7 +210,7 @@ void KitModel::validateKitNames() nameHash.insert(displayName, 1); } - foreach (KitNode *n, treeLevelItems(2)) { + foreach (KitNode *n, itemsAtLevel(2)) { const QString displayName = n->widget->displayName(); n->widget->setHasUniqueName(nameHash.value(displayName) == 1); } @@ -223,7 +223,7 @@ void KitModel::apply() n->widget->removeKit(); // Update kits: - foreach (KitNode *n, treeLevelItems(2)) { + foreach (KitNode *n, itemsAtLevel(2)) { if (n->widget->isDirty()) { n->widget->apply(); n->update(); @@ -249,7 +249,7 @@ void KitModel::markForRemoval(Kit *k) if (node == m_defaultNode) setDefaultNode(findItemAtLevel(2, [node](KitNode *kn) { return kn != node; })); - removeItem(node); + takeItem(node); if (node->widget->configures(0)) delete node; else @@ -279,7 +279,7 @@ Kit *KitModel::markForAddition(Kit *baseKit) KitNode *KitModel::findWorkingCopy(Kit *k) const { - foreach (KitNode *n, treeLevelItems(2)) { + foreach (KitNode *n, itemsAtLevel(2)) { if (n->widget->workingCopy() == k) return n; } @@ -349,7 +349,7 @@ void KitModel::removeKit(Kit *k) } KitNode *node = 0; - foreach (KitNode *n, treeLevelItems(2)) { + foreach (KitNode *n, itemsAtLevel(2)) { if (n->widget->configures(k)) { node = n; break; @@ -359,7 +359,7 @@ void KitModel::removeKit(Kit *k) if (node == m_defaultNode) setDefaultNode(findItemAtLevel(2, [node](KitNode *kn) { return kn != node; })); - removeItem(node); + takeItem(node); delete node; validateKitNames(); @@ -369,7 +369,7 @@ void KitModel::removeKit(Kit *k) void KitModel::changeDefaultKit() { Kit *defaultKit = KitManager::defaultKit(); - foreach (KitNode *n, treeLevelItems(2)) { + foreach (KitNode *n, itemsAtLevel(2)) { if (n->widget->configures(defaultKit)) { setDefaultNode(n); return; diff --git a/src/plugins/projectexplorer/toolchainoptionspage.cpp b/src/plugins/projectexplorer/toolchainoptionspage.cpp index 8c985e21d63..6482acebdb4 100644 --- a/src/plugins/projectexplorer/toolchainoptionspage.cpp +++ b/src/plugins/projectexplorer/toolchainoptionspage.cpp @@ -219,7 +219,7 @@ public: void ToolChainOptionsWidget::markForRemoval(ToolChainTreeItem *item) { - m_model.removeItem(item); + m_model.takeItem(item); if (m_toAddList.contains(item)) { delete item->toolChain; item->toolChain = 0; @@ -257,9 +257,9 @@ void ToolChainOptionsWidget::removeToolChain(ToolChain *tc) } TreeItem *parent = m_model.rootItem()->child(tc->isAutoDetected() ? 0 : 1); - foreach (ToolChainTreeItem *item, m_model.treeLevelItems(1, parent)) { + foreach (ToolChainTreeItem *item, m_model.itemsAtLevel(1, parent)) { if (item->toolChain == tc) { - m_model.removeItem(item); + m_model.takeItem(item); delete item; break; } @@ -292,7 +292,7 @@ void ToolChainOptionsWidget::apply() Q_ASSERT(m_toRemoveList.isEmpty()); // Update tool chains: - foreach (ToolChainTreeItem *item, m_model.treeLevelItems(1, m_manualRoot)) { + foreach (ToolChainTreeItem *item, m_model.itemsAtLevel(1, m_manualRoot)) { if (item->changed) { Q_ASSERT(item->toolChain); if (item->widget) diff --git a/tests/auto/utils/treemodel/tst_treemodel.cpp b/tests/auto/utils/treemodel/tst_treemodel.cpp index b4982b14829..1ad7cd19f34 100644 --- a/tests/auto/utils/treemodel/tst_treemodel.cpp +++ b/tests/auto/utils/treemodel/tst_treemodel.cpp @@ -47,7 +47,7 @@ private slots: static int countLevelItems(TreeItem *base, int level) { int n = 0; - foreach (TreeItem *item, base->model()->untypedLevelItems(level, base)) { + foreach (TreeItem *item, base->model()->untypedItemsAtLevel(level, base)) { Q_UNUSED(item); ++n; }