summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2023-10-18 13:49:34 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2023-11-02 08:58:46 +0000
commit091487d67f11ecba22e3f859c8e03e29f26b3eb8 (patch)
treeaf7bd22359781961437b1be382d0a5ea6e303abb
parent5735fd272caa3b317a6df6c7930eafdd3b07498a (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.h5
-rw-r--r--src/designer/src/lib/uilib/abstractformbuilder.cpp14
-rw-r--r--src/designer/src/lib/uilib/properties.cpp33
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")