diff --git a/src/plugins/cppeditor/cpptypehierarchy.cpp b/src/plugins/cppeditor/cpptypehierarchy.cpp index 2c5c79d5d20..88ca5f89287 100644 --- a/src/plugins/cppeditor/cpptypehierarchy.cpp +++ b/src/plugins/cppeditor/cpptypehierarchy.cpp @@ -196,46 +196,24 @@ void CppTypeHierarchyWidget::perform() m_inspectedClass->setup(cppClass); QStandardItem *bases = new QStandardItem(tr("Bases")); m_model->invisibleRootItem()->appendRow(bases); - QVector v; - v.push_back(*cppClass); - buildBaseHierarchy(&v); - m_treeView->expand(m_model->indexFromItem(bases)); + buildHierarchy(*cppClass, bases, true, &CppClass::bases); QStandardItem *derived = new QStandardItem(tr("Derived")); m_model->invisibleRootItem()->appendRow(derived); - foreach (const CppClass &derivedClass, sortClasses(cppClass->derived())) - buildDerivedHierarchy(derivedClass, derived); + buildHierarchy(*cppClass, derived, true, &CppClass::derived); + m_treeView->expandAll(); } } } -void CppTypeHierarchyWidget::buildBaseHierarchy(QVector *s) +void CppTypeHierarchyWidget::buildHierarchy(const CppClass &cppClass, QStandardItem *parent, bool isRoot, HierarchyFunc func) { - const CppClass ¤t = s->back(); - const QList &bases = sortClasses(current.bases()); - if (!bases.isEmpty()) { - foreach (const CppClass &base, bases) { - s->push_back(base); - buildBaseHierarchy(s); - s->pop_back(); - } - } else { - QStandardItem *parent = m_model->item(0, 0); - for (int i = s->size() - 1; i > 0; --i) { - QStandardItem *item = itemForClass(s->at(i)); - parent->appendRow(item); - m_treeView->expand(m_model->indexFromItem(parent)); - parent = item; - } + if (!isRoot) { + QStandardItem *item = itemForClass(cppClass); + parent->appendRow(item); + parent = item; } -} - -void CppTypeHierarchyWidget::buildDerivedHierarchy(const CppClass &cppClass, QStandardItem *parent) -{ - QStandardItem *item = itemForClass(cppClass); - parent->appendRow(item); - foreach (const CppClass &derived, sortClasses(cppClass.derived())) - buildDerivedHierarchy(derived, item); - m_treeView->expand(m_model->indexFromItem(parent)); + foreach (const CppClass &klass, sortClasses((cppClass.*func)())) + buildHierarchy(klass, parent, false, func); } void CppTypeHierarchyWidget::onItemClicked(const QModelIndex &index) diff --git a/src/plugins/cppeditor/cpptypehierarchy.h b/src/plugins/cppeditor/cpptypehierarchy.h index d9c5e8d9410..2d862d69044 100644 --- a/src/plugins/cppeditor/cpptypehierarchy.h +++ b/src/plugins/cppeditor/cpptypehierarchy.h @@ -43,6 +43,7 @@ class QStandardItem; class QModelIndex; class QLabel; template class QVector; +template class QList; QT_END_NAMESPACE namespace Core { @@ -77,8 +78,8 @@ private slots: void onItemClicked(const QModelIndex &index); private: - void buildDerivedHierarchy(const CppClass &cppClass, QStandardItem *parent); - void buildBaseHierarchy(QVector *s); + typedef const QList &(CppClass::* HierarchyFunc)() const; + void buildHierarchy(const CppClass &cppClass, QStandardItem *parent, bool isRoot, HierarchyFunc func); CPPEditorWidget *m_cppEditor; Utils::NavigationTreeView *m_treeView;