diff options
| author | Richard Moe Gustavsen <richard.gustavsen@qt.io> | 2025-12-15 10:51:07 +0100 |
|---|---|---|
| committer | Richard Moe Gustavsen <richard.gustavsen@qt.io> | 2025-12-15 16:40:56 +0100 |
| commit | c755209ce457db55e65066c5ca15cfa888e2dcf6 (patch) | |
| tree | c2268c4f043bd263eaa305cda5a1250e8018781e /src | |
| parent | f0aaf5c9b7fc53bec9c2a96be233f25d5cb0d68b (diff) | |
StyleKit: reimplement broken QQStyleKitDebug::propertyPath()
QQStyleKitDebug previously printed property paths under
the assumption that nested property groups followed the
same parent–child hierarchy as they are written in the style.
After a recent optimization in QQStyleKitPropertyGroup, this
assumption is no longer valid.
As part of that optimization, all property groups now have
the root QQStyleKitControlProperties as their parent in order
to avoid unnecessary hierarchy traversals. This change broke
the logic used to reconstruct property paths for debugging.
This patch introduces QQStyleKitPropertyGroup::pathToString(),
which reconstructs a property path in the same order as it is
written in the style. While this functionality may also enable
future optimizations, it is currently used to restore correct
and readable debug output.
Task-number: QTBUG-130067
Pick-to: 6.11
Change-Id: I60e0aac3320c703b5b0995daa5a68a8ea1f015c5
Reviewed-by: Doris Verria <doris.verria@qt.io>
Diffstat (limited to 'src')
| -rw-r--r-- | src/labs/stylekit/qqstylekitcontrolproperties.cpp | 50 | ||||
| -rw-r--r-- | src/labs/stylekit/qqstylekitcontrolproperties_p.h | 3 | ||||
| -rw-r--r-- | src/labs/stylekit/qqstylekitdebug.cpp | 37 | ||||
| -rw-r--r-- | src/labs/stylekit/qqstylekitglobal_p.h | 1 |
4 files changed, 58 insertions, 33 deletions
diff --git a/src/labs/stylekit/qqstylekitcontrolproperties.cpp b/src/labs/stylekit/qqstylekitcontrolproperties.cpp index d44bf6050d..d35935860f 100644 --- a/src/labs/stylekit/qqstylekitcontrolproperties.cpp +++ b/src/labs/stylekit/qqstylekitcontrolproperties.cpp @@ -11,6 +11,8 @@ QT_BEGIN_NAMESPACE // ************* QQStyleKitPropertyGroup **************** +QHash<PropertyPathId_t, QString> QQStyleKitPropertyGroup::s_pathStrings; + QQStyleKitPropertyGroup::QQStyleKitPropertyGroup(QQSK::PropertyGroup, QObject *parent) : QObject(parent) { @@ -27,6 +29,51 @@ PropertyPathId QQStyleKitPropertyGroup::propertyPathId(QQSK::Property property, return PropertyPathId(property, m_groupSpace.start, QQSK::PropertyGroup::DelegateSubtype0); } +QString QQStyleKitPropertyGroup::pathToString() const +{ + /* Start from the root of the path and build the path down to this group. This + * mirrors how the groups were originally created and avoids rounding issues + * that can arise if attempting to reconstruct the path “backwards”. + * Note: For each group, m_groupSpace.start is stored relative to the root, + * while m_groupSpace.size is relative to the parent group. However, when + * calculating the group index, the group-space start must be computed + * relative to the parent group. + * We cache the requested paths, as the same paths are typically requested + * repeatedly. The number of possible paths (and thus leaf groups) is well below + * 100, and in practice the cache usually ends up with fewer than 20 entries. */ + if (s_pathStrings.contains(m_groupSpace.start)) + return s_pathStrings[m_groupSpace.start]; + + constexpr PropertyPathId_t rootGroupsSize = nestedGroupsStartSize / nestedGroupCount; + const auto metaEnum = QMetaEnum::fromType<QQSK::PropertyGroup>(); + + PropertyPathId_t nestedGroupStart = m_groupSpace.start; + PropertyPathId_t nestedGroupSize = rootGroupsSize; + PropertyPathId_t nestedGroupIndex = nestedGroupStart / nestedGroupSize; + auto groupType = QQSK::PropertyGroup(nestedGroupIndex); + if (groupType == QQSK::PropertyGroup::Control) + return {}; + + QString groupName = QString::fromLatin1(metaEnum.valueToKey(static_cast<int>(groupType))); + groupName[0] = groupName[0].toLower(); + QString pathString = groupName; + + while (true) { + nestedGroupStart -= nestedGroupIndex * nestedGroupSize; + nestedGroupSize /= nestedGroupCount; + nestedGroupIndex = nestedGroupStart / nestedGroupSize; + groupType = QQSK::PropertyGroup(nestedGroupIndex); + if (groupType == QQSK::PropertyGroup::Control) + break; + + QString groupName = QString::fromLatin1(metaEnum.valueToKey(static_cast<int>(groupType))); + groupName[0] = groupName[0].toLower(); + pathString += '.'_L1 + groupName; + } + + return pathString; +} + QQStyleKitControlProperties *QQStyleKitPropertyGroup::controlProperties() const { if (isControlProperties()) { @@ -63,9 +110,8 @@ T *QQStyleKitPropertyGroup::lazyCreateGroup(T * const &ptr, QQSK::PropertyGroup /* Calculate the available property ID space for the nested group. This is done by * dividing the available space inside _this_ group on the number of potential groups * that _this_ group can potentially contain. */ - constexpr PropertyPathId_t groupCount = PropertyPathId_t(QQSK::PropertyGroup::PATH_ID_GROUP_COUNT); const PropertyPathId_t nestedGroupIndex = PropertyPathId_t(group); - const PropertyPathId_t nestedGroupSize = m_groupSpace.size / groupCount; + const PropertyPathId_t nestedGroupSize = m_groupSpace.size / nestedGroupCount; nestedGroup->m_groupSpace.size = nestedGroupSize; nestedGroup->m_groupSpace.start = m_groupSpace.start + (nestedGroupIndex * nestedGroupSize); /* Ensure that we haven’t exhausted the available PropertyPathId space. There must be diff --git a/src/labs/stylekit/qqstylekitcontrolproperties_p.h b/src/labs/stylekit/qqstylekitcontrolproperties_p.h index f2c7f35216..fb6df9fb81 100644 --- a/src/labs/stylekit/qqstylekitcontrolproperties_p.h +++ b/src/labs/stylekit/qqstylekitcontrolproperties_p.h @@ -45,6 +45,7 @@ public: QQStyleKitPropertyGroup(QQSK::PropertyGroup group, QObject *parent); PropertyPathId propertyPathId(QQSK::Property property, PropertyPathId::Flag flag) const; + QString pathToString() const; template<typename T> inline T styleProperty( @@ -101,6 +102,8 @@ protected: private: bool shouldEmitLocally(); bool shouldEmitGlobally(); + + static QHash<PropertyPathId_t, QString> s_pathStrings; }; // ************* QQStyleKitImageProperties **************** diff --git a/src/labs/stylekit/qqstylekitdebug.cpp b/src/labs/stylekit/qqstylekitdebug.cpp index dcd191959d..4f6cd78b61 100644 --- a/src/labs/stylekit/qqstylekitdebug.cpp +++ b/src/labs/stylekit/qqstylekitdebug.cpp @@ -52,37 +52,12 @@ QString QQStyleKitDebug::styleReaderToString(const QQStyleKitReader *reader) QString QQStyleKitDebug::propertyPath(const QQStyleKitPropertyGroup *group, const PropertyPathId property) { - QString path = enumToString(property.property()); - path[0] = path[0].toLower(); - const QQStyleKitPropertyGroup *childGroup = group; - const int startIndex = QQStyleKitPropertyGroup::staticMetaObject.propertyOffset(); - - while (childGroup) { - if (childGroup->isControlProperties()) - break; - const QQStyleKitPropertyGroup *parentGroup = - qobject_cast<const QQStyleKitPropertyGroup *>(childGroup->parent()); - if (!parentGroup) - break; - - // Resolve group name by inspecting which property in the parent group it belongs to - const QMetaObject* parentMeta = parentGroup->metaObject(); - for (int i = startIndex; i < parentMeta->propertyCount(); ++i) { - const QMetaProperty prop = parentMeta->property(i); - const QMetaObject* typeMeta = QMetaType::fromName(prop.typeName()).metaObject(); - if (!typeMeta || !typeMeta->inherits(&QQStyleKitPropertyGroup::staticMetaObject)) - continue; - QObject *propGroup = prop.read(parentGroup).value<QQStyleKitPropertyGroup *>(); - if (propGroup == childGroup) { - path.prepend(QString::fromUtf8(prop.name()) + kDot); - break; - } - } - - childGroup = parentGroup; - } - - return path; + const QString path = group->pathToString(); + QString propertyName = enumToString(property.property()); + propertyName[0] = propertyName[0].toLower(); + if (path.isEmpty()) + return propertyName; + return path + kDot + propertyName; } QString QQStyleKitDebug::controlToString(const QQStyleKitControlProperties *control) diff --git a/src/labs/stylekit/qqstylekitglobal_p.h b/src/labs/stylekit/qqstylekitglobal_p.h index 3808def107..e4d6a151dc 100644 --- a/src/labs/stylekit/qqstylekitglobal_p.h +++ b/src/labs/stylekit/qqstylekitglobal_p.h @@ -171,6 +171,7 @@ using QQStyleKitExtendableControlType = quint32; using QQStyleKitPropertyStorage = QHash<PropertyStorageId, QVariant>; constexpr PropertyPathId_t maxPropertyStorageSpaceSize = std::numeric_limits<PropertyPathId_t>::max(); +constexpr PropertyPathId_t nestedGroupCount = PropertyPathId_t(QQSK::PropertyGroup::PATH_ID_GROUP_COUNT); constexpr PropertyPathId_t maxStateCombinationCount = PropertyPathId_t(QQSK::StateFlag::MAX_STATE); constexpr PropertyPathId_t stateStorageSpaceSize = maxPropertyStorageSpaceSize / maxStateCombinationCount; constexpr PropertyPathId_t subtypeCount = PropertyPathId_t(QQSK::PropertyPathFlag::DelegateSubtype2) - PropertyPathId_t(QQSK::PropertyPathFlag::DelegateSubtype0) + 1; |
