diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2023-10-18 13:49:34 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-11-02 08:58:46 +0000 |
commit | 091487d67f11ecba22e3f859c8e03e29f26b3eb8 (patch) | |
tree | af7bd22359781961437b1be382d0a5ea6e303abb | |
parent | 5735fd272caa3b317a6df6c7930eafdd3b07498a (diff) |
Qt Designer: Prepare for reading fully qualified enumeration values
Task-number: PYSIDE-2492
Task-number: QTBUG-118240
Task-number: QTBUG-118473
Pick-to: 6.5
Change-Id: I8d9c8ddab555eca49f513069b98bf3871a0e28e6
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
(cherry picked from commit 9acc2df00b03854fa4bd1234053c89059c2310fe)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/designer/src/lib/shared/qdesigner_utils_p.h | 5 | ||||
-rw-r--r-- | src/designer/src/lib/uilib/abstractformbuilder.cpp | 14 | ||||
-rw-r--r-- | src/designer/src/lib/uilib/properties.cpp | 33 |
3 files changed, 34 insertions, 18 deletions
diff --git a/src/designer/src/lib/shared/qdesigner_utils_p.h b/src/designer/src/lib/shared/qdesigner_utils_p.h index 28db155a5..cea7dedcb 100644 --- a/src/designer/src/lib/shared/qdesigner_utils_p.h +++ b/src/designer/src/lib/shared/qdesigner_utils_p.h @@ -115,8 +115,9 @@ QString MetaEnum<IntType>::valueToKey(IntType value, bool *ok) const template <class IntType> IntType MetaEnum<IntType>::keyToValue(QString key, bool *ok) const { - if (!m_scope.isEmpty() && key.startsWith(m_scope)) - key.remove(0, m_scope.size() + m_separator.size()); + const auto lastSep = key.lastIndexOf(m_separator); + if (lastSep != -1) + key.remove(0, lastSep + m_separator.size()); const auto it = m_keyToValueMap.find(key); const bool found = it != m_keyToValueMap.constEnd(); if (ok) diff --git a/src/designer/src/lib/uilib/abstractformbuilder.cpp b/src/designer/src/lib/uilib/abstractformbuilder.cpp index b4b4af528..b2e152a62 100644 --- a/src/designer/src/lib/uilib/abstractformbuilder.cpp +++ b/src/designer/src/lib/uilib/abstractformbuilder.cpp @@ -728,19 +728,19 @@ static inline Qt::Alignment alignmentFromDom(const QString &in) Qt::Alignment rc; if (!in.isEmpty()) { for (const auto &f : qTokenize(in, u'|')) { - if (f == "Qt::AlignLeft"_L1) { + if (f.endsWith("::AlignLeft"_L1)) { rc |= Qt::AlignLeft; - } else if (f == "Qt::AlignRight"_L1) { + } else if (f.endsWith("::AlignRight"_L1)) { rc |= Qt::AlignRight; - } else if (f == "Qt::AlignHCenter"_L1) { + } else if (f.endsWith("::AlignHCenter"_L1)) { rc |= Qt::AlignHCenter; - } else if (f == "Qt::AlignJustify"_L1) { + } else if (f.endsWith("::AlignJustify"_L1)) { rc |= Qt::AlignJustify; - } else if (f == "Qt::AlignTop"_L1) { + } else if (f.endsWith("::AlignTop"_L1)) { rc |= Qt::AlignTop; - } else if (f == "Qt::AlignBottom"_L1) { + } else if (f.endsWith("::AlignBottom"_L1)) { rc |= Qt::AlignBottom; - } else if (f == "Qt::AlignVCenter"_L1) { + } else if (f.endsWith("::AlignVCenter"_L1)) { rc |= Qt::AlignVCenter; } } diff --git a/src/designer/src/lib/uilib/properties.cpp b/src/designer/src/lib/uilib/properties.cpp index 8988c9517..d70f4dbfe 100644 --- a/src/designer/src/lib/uilib/properties.cpp +++ b/src/designer/src/lib/uilib/properties.cpp @@ -28,14 +28,30 @@ namespace QFormInternal { #endif -static inline void fixEnum(QString &s) +static QStringView fixEnum(QStringView s) { - qsizetype qualifierIndex = s.lastIndexOf(u':'); - if (qualifierIndex == -1) - qualifierIndex = s.lastIndexOf(u'.'); - if (qualifierIndex != -1) - s.remove(0, qualifierIndex + 1); + qsizetype valuePos = s.lastIndexOf(u':'); // "E::A" -> 3 + if (valuePos == -1) + valuePos = s.lastIndexOf(u'.'); + return valuePos != -1 ? s.sliced(valuePos + 1) : s; } + +// "QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok" +// -> "Cancel|Ok" +// ### FIXME Remove/check when QTBUG-118240 is fixed. +static inline QString fixFlags(QStringView s) +{ + QString result; + result.reserve(s.size()); + const auto flags = s.split(u'|'); + for (const auto &flag : flags) { + if (!result.isEmpty()) + result.append(u'|'); + result.append(fixEnum(flag)); + } + return result; +} + // Convert complex DOM types with the help of QAbstractFormBuilder QVariant domPropertyToVariant(QAbstractFormBuilder *afb,const QMetaObject *meta,const DomProperty *p) { @@ -75,17 +91,16 @@ QVariant domPropertyToVariant(QAbstractFormBuilder *afb,const QMetaObject *meta, const QMetaEnum e = meta->property(index).enumerator(); Q_ASSERT(e.isFlag() == true); - return QVariant(e.keysToValue(p->elementSet().toUtf8())); + return QVariant(e.keysToValue(fixFlags(p->elementSet()).toUtf8())); } case DomProperty::Enum: { const QByteArray pname = p->attributeName().toUtf8(); const int index = meta->indexOfProperty(pname); - QString enumValue = p->elementEnum(); + const QStringView enumValue = fixEnum(p->elementEnum()); // Triggers in case of objects in Designer like Spacer/Line for which properties // are serialized using language introspection. On preview, however, these objects are // emulated by hacks in the formbuilder (size policy/orientation) - fixEnum(enumValue); if (index == -1) { // ### special-casing for Line (QFrame) -- fix for 4.2. Jambi hack for enumerations if (!qstrcmp(meta->className(), "QFrame") |