diff --git a/src/libs/utils/treemodel.h b/src/libs/utils/treemodel.h index 01a02f64438..8683643f818 100644 --- a/src/libs/utils/treemodel.h +++ b/src/libs/utils/treemodel.h @@ -188,13 +188,32 @@ private: TreeItem *m_parent; // Not owned. TreeModel *m_model; // Not owned. - QVector m_children; // Owned. QStringList *m_displays; Qt::ItemFlags m_flags; + protected: + QVector m_children; // Owned. friend class TreeModel; }; +// A TreeItem with children all of the same type. +template +class TypedTreeItem : public TreeItem +{ +public: + void sortChildren(const std::function &lessThan) + { + return TreeItem::sortChildren([lessThan](const TreeItem *a, const TreeItem *b) { + return lessThan(static_cast(a), static_cast(b)); + }); + } + + template + void forAllChildren(const Predicate &pred) const { + return TreeItem::forAllChildren(pred); + } +}; + // A general purpose multi-level model where each item can have its // own (TreeItem-derived) type. class QTCREATOR_UTILS_EXPORT TreeModel : public QAbstractItemModel diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp index b865945fabe..f84813595d9 100644 --- a/src/plugins/debugger/qml/qmlengine.cpp +++ b/src/plugins/debugger/qml/qmlengine.cpp @@ -2418,9 +2418,8 @@ void QmlEnginePrivate::insertSubItems(WatchItem *parent, const QVariantList &pro } if (boolSetting(SortStructMembers)) { - parent->sortChildren([](const TreeItem *item1, const TreeItem *item2) -> bool { - return static_cast(item1)->name - < static_cast(item2)->name; + parent->sortChildren([](const WatchItem *item1, const WatchItem *item2) { + return item1->name < item2->name; }); } diff --git a/src/plugins/debugger/watchdata.cpp b/src/plugins/debugger/watchdata.cpp index 41e3203ac62..ed8cb0c8af7 100644 --- a/src/plugins/debugger/watchdata.cpp +++ b/src/plugins/debugger/watchdata.cpp @@ -394,15 +394,12 @@ public: quint64 addrstep; }; -static bool sortByName(const Utils::TreeItem *a, const Utils::TreeItem *b) +static bool sortByName(const WatchItem *a, const WatchItem *b) { - auto aa = static_cast(a); - auto bb = static_cast(b); + if (a->sortGroup != b->sortGroup) + return a->sortGroup > b->sortGroup; - if (aa->sortGroup != bb->sortGroup) - return aa->sortGroup > bb->sortGroup; - - return aa->name < bb->name; + return a->name < b->name; } void WatchItem::parseHelper(const GdbMi &input, bool maySort) diff --git a/src/plugins/debugger/watchdata.h b/src/plugins/debugger/watchdata.h index 654e92db54e..e712b6d961c 100644 --- a/src/plugins/debugger/watchdata.h +++ b/src/plugins/debugger/watchdata.h @@ -39,7 +39,7 @@ namespace Internal { class GdbMi; -class WatchItem : public Utils::TreeItem +class WatchItem : public Utils::TypedTreeItem { public: WatchItem(); diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index a842b2c591e..e72771dc394 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -1253,16 +1253,14 @@ void WatchHandler::cleanup() m_model->m_separatedView->hide(); } -static bool sortByName(const TreeItem *a, const TreeItem *b) +static bool sortByName(const WatchItem *a, const WatchItem *b) { - auto aa = static_cast(a); - auto bb = static_cast(b); - return aa->name < bb->name; + return a->name < b->name; } void WatchHandler::insertItems(const GdbMi &data) { - QSet itemsToSort; + QSet itemsToSort; const bool sortStructMembers = boolSetting(SortStructMembers); foreach (const GdbMi &child, data.children()) { @@ -1274,10 +1272,10 @@ void WatchHandler::insertItems(const GdbMi &data) const bool added = insertItem(item); if (added && item->level() == 2) - itemsToSort.insert(item->parent()); + itemsToSort.insert(static_cast(item->parent())); } - foreach (TreeItem *toplevel, itemsToSort) + foreach (WatchItem *toplevel, itemsToSort) toplevel->sortChildren(&sortByName); } @@ -1303,7 +1301,7 @@ bool WatchHandler::insertItem(WatchItem *item) item->update(); - item->forAllChildren([this](WatchItem *sub) { m_model->showEditValue(sub); }); + item->forAllChildren([this](WatchItem *sub) { m_model->showEditValue(sub); }); return !found; } @@ -1349,16 +1347,16 @@ void WatchHandler::resetWatchers() void WatchHandler::notifyUpdateStarted(const QStringList &inames) { - auto marker = [](TreeItem *it) { static_cast(it)->outdated = true; }; + auto marker = [](WatchItem *item) { item->outdated = true; }; if (inames.isEmpty()) { m_model->forSecondLevelItems([marker](WatchItem *item) { - item->forAllChildren(marker); + item->forAllChildren(marker); }); } else { for (auto iname : inames) { if (WatchItem *item = m_model->findItem(iname)) - item->forAllChildren(marker); + item->forAllChildren(marker); } }