From d99e14fad83f521b0970b3f27e5c452993d32a56 Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@digia.com>
Date: Thu, 4 Jul 2013 15:08:05 +0200
Subject: [PATCH] Persistent settings reader: Implement QRect-type for values.

Format in X11-resource syntax.

Change-Id: Ifc8cd76202d0e1e02ae18809ac8d276e94a27262
Reviewed-by: hjk <hjk121@nokiamail.com>
---
 src/libs/utils/persistentsettings.cpp | 33 ++++++++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

diff --git a/src/libs/utils/persistentsettings.cpp b/src/libs/utils/persistentsettings.cpp
index 7b841eed2cb..42b04169d76 100644
--- a/src/libs/utils/persistentsettings.cpp
+++ b/src/libs/utils/persistentsettings.cpp
@@ -36,9 +36,29 @@
 #include <QXmlStreamReader>
 #include <QXmlStreamWriter>
 #include <QDateTime>
+#include <QTextStream>
+#include <QRegExp>
+#include <QRect>
 
 #include <utils/qtcassert.h>
 
+// Read and write rectangle in X11 resource syntax "12x12+4+3"
+static QString rectangleToString(const QRect &r)
+{
+    QString result;
+    QTextStream(&result) << r.width() << 'x' << r.height() << forcesign << r.x() << r.y();
+    return result;
+}
+
+static QRect stringToRectangle(const QString &v)
+{
+    static QRegExp pattern(QLatin1String("(\\d+)x(\\d+)([-+]\\d+)([-+]\\d+)"));
+    Q_ASSERT(pattern.isValid());
+    return pattern.exactMatch(v) ?
+        QRect(QPoint(pattern.cap(3).toInt(), pattern.cap(4).toInt()),
+              QSize(pattern.cap(1).toInt(), pattern.cap(2).toInt())) :
+        QRect();
+}
 
 /*!
     \class Utils::PersistentSettingsReader
@@ -302,6 +322,10 @@ QVariant ParseContext::readSimpleValue(QXmlStreamReader &r, const QXmlStreamAttr
         QTC_ASSERT(text.size() == 1, return QVariant());
         return QVariant(QChar(text.at(0)));
     }
+    if (type == QLatin1String("QRect")) {
+        const QRect rectangle = stringToRectangle(text);
+        return rectangle.isValid() ? QVariant(rectangle) : QVariant();
+    }
     QVariant value;
     value.setValue(text);
     value.convert(QVariant::nameToType(type.toLatin1().data()));
@@ -381,7 +405,14 @@ static void writeVariantValue(QXmlStreamWriter &w, const Context &ctx,
         w.writeAttribute(ctx.typeAttribute, QLatin1String(variant.typeName()));
         if (!key.isEmpty())
             w.writeAttribute(ctx.keyAttribute, key);
-        w.writeCharacters(variant.toString());
+        switch (variant.type()) {
+        case QVariant::Rect:
+            w.writeCharacters(rectangleToString(variant.toRect()));
+            break;
+        default:
+            w.writeCharacters(variant.toString());
+            break;
+        }
         w.writeEndElement();
         break;
     }
-- 
GitLab