Force properties to be applied in the order in which they are specified.
authorRobin Burchell <robin+qt@viroteck.net>
Mon, 5 Mar 2012 14:05:16 +0000 (15:05 +0100)
committerQt by Nokia <qt-info@nokia.com>
Mon, 12 Mar 2012 00:50:20 +0000 (01:50 +0100)
Previously, property setting was randomized in order, which means that things
like: qproperty-foo: 4; qproperty-bar: 5; where foo may affect bar worked by
chance - or not at all - depending on the hash function.

Change-Id: Ifb9813ee72842cefb278cbedb644f24b91113f3f
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
src/widgets/styles/qstylesheetstyle.cpp

index 5c0ee25..7a0cc09 100644 (file)
@@ -2498,7 +2498,13 @@ void QStyleSheetStyle::setGeometry(QWidget *w)
 
 void QStyleSheetStyle::setProperties(QWidget *w)
 {
+    // we have two data structures here: a hash of property -> value for lookup,
+    // and a vector giving properties in the order they are specified.
+    //
+    // this means we only set a property once (thanks to the hash) but we set
+    // properties in the order they are specified.
     QHash<QString, QVariant> propertyHash;
+    QVector<QString> properties;
     QVector<Declaration> decls = declarations(styleRules(w), QString());
 
     // run through the declarations in order
@@ -2535,10 +2541,17 @@ void QStyleSheetStyle::setProperties(QWidget *w)
 #endif
         default: v = decl.d->values.at(0).variant; break;
         }
+
+        if (propertyHash.contains(property)) {
+            // we're ignoring the original appearance of this property
+            properties.remove(properties.indexOf(property));
+        }
+
         propertyHash[property] = v;
+        properties.append(property);
     }
-    // apply the values
-    const QList<QString> properties = propertyHash.keys();
+
+    // apply the values from left to right order
     for (int i = 0; i < properties.count(); i++) {
         const QString &property = properties.at(i);
         w->setProperty(property.toLatin1(), propertyHash[property]);