From e1f2fea488efc9665026bbd08d5ef8e785db694d Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 13 Sep 2019 14:54:34 +0200 Subject: QmlDesigner: Check complete type hierarchy for hints A type can have hints provided by the .metainfo files. Without this patch hints from parent classes/components are not inherited. Therefore we have to walk the class hierarchy. Once we find hints they have precedence over all hints from further parent classes. Task-number: QDS-1056 Change-Id: I8dc8e7e92939e8e7eb834b94afbf5e396e8975de Reviewed-by: Miikka Heikkinen --- .../designercore/metainfo/nodehints.cpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp index dcb350c448..4862b59c04 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include @@ -89,13 +90,30 @@ static QVariant evaluateExpression(const QString &expression, const ModelNode &m QmlDesigner::NodeHints::NodeHints(const ModelNode &node) : m_modelNode(node) { - if (isValid()) { - const ItemLibraryInfo *libraryInfo = model()->metaInfo().itemLibraryInfo(); + if (!isValid()) + return; + + const ItemLibraryInfo *libraryInfo = model()->metaInfo().itemLibraryInfo(); + + if (!m_modelNode.metaInfo().isValid()) { + QList itemLibraryEntryList = libraryInfo->entriesForType( modelNode().type(), modelNode().majorVersion(), modelNode().minorVersion()); if (!itemLibraryEntryList.isEmpty()) m_hints = itemLibraryEntryList.constFirst().hints(); + } else { /* If we have meta information we run the complete type hierarchy and check for hints */ + const auto classHierarchy = m_modelNode.metaInfo().classHierarchy(); + for (const NodeMetaInfo &metaInfo : classHierarchy) { + QList itemLibraryEntryList = libraryInfo->entriesForType( + metaInfo.typeName(), metaInfo.majorVersion(), metaInfo.minorVersion()); + + if (!itemLibraryEntryList.isEmpty() && !itemLibraryEntryList.constFirst().hints().isEmpty()) { + m_hints = itemLibraryEntryList.constFirst().hints(); + return; + } + + } } } -- cgit v1.2.1