QUiLoader: Provide operators for streaming QUiTranslatableStringValue.
authorFriedemann Kleint <Friedemann.Kleint@digia.com>
Fri, 15 Nov 2013 12:51:00 +0000 (13:51 +0100)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Tue, 26 Nov 2013 18:27:23 +0000 (19:27 +0100)
When trying to encode mime data in startDrag(), the code
hits the internal item data storing the untranslated text
attached by QUiLoader and triggers an assert as they cannot be
serialized to QDataStream. Add the missing operators.

Task-number: QTBUG-34859
Change-Id: I87a0f59fb42772bf08039915bc7418940ca5a80f
Reviewed-by: hjk <hjk121@nokiamail.com>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
src/designer/src/uitools/quiloader.cpp
src/designer/src/uitools/quiloader_p.h

index 84695d6..4542439 100644 (file)
@@ -50,6 +50,7 @@
 #include <ui4_p.h>
 
 #include <QtCore/qdebug.h>
+#include <QtCore/QDataStream>
 #include <QtWidgets/QAction>
 #include <QtWidgets/QActionGroup>
 #include <QtWidgets/QApplication>
@@ -74,6 +75,22 @@ Q_GLOBAL_STATIC(widget_map, g_widgets)
 class QUiLoader;
 class QUiLoaderPrivate;
 
+#ifndef QT_NO_DATASTREAM
+// QUiTranslatableStringValue must be streamable since they become part of the QVariant-based
+// mime data when dragging items in views with QAbstractItemView::InternalMove.
+QDataStream &operator<<(QDataStream &out, const QUiTranslatableStringValue &s)
+{
+    out << s.comment() << s.value();
+    return out;
+}
+
+QDataStream &operator>>(QDataStream &in, QUiTranslatableStringValue &s)
+{
+    in >> s.m_comment >> s.m_value;
+    return in;
+}
+#endif // QT_NO_DATASTREAM
+
 #ifdef QFORMINTERNAL_NAMESPACE
 namespace QFormInternal
 {
@@ -620,6 +637,13 @@ QUiLoader::QUiLoader(QObject *parent)
 {
     Q_D(QUiLoader);
 
+#ifndef QT_NO_DATASTREAM
+    static int metaTypeId = 0;
+    if (!metaTypeId) {
+        metaTypeId = qRegisterMetaType<QUiTranslatableStringValue>("QUiTranslatableStringValue");
+        qRegisterMetaTypeStreamOperators<QUiTranslatableStringValue>("QUiTranslatableStringValue");
+    }
+#endif // QT_NO_DATASTREAM
     d->builder.loader = this;
 
     QStringList paths;
index e7cbfb6..c8df5dc 100644 (file)
@@ -56,6 +56,8 @@
 #include <QtCore/QByteArray>
 #include <QtCore/QMetaType>
 
+QT_FORWARD_DECLARE_CLASS(QDataStream)
+
 // This file is here for use by the form preview in Linguist. If you change anything
 // here or in the code which uses it, remember to adapt Linguist accordingly.
 
@@ -77,6 +79,8 @@ public:
     void setComment(const QByteArray &comment) { m_comment = comment; }
 
 private:
+    friend QDataStream &operator>>(QDataStream &in, QUiTranslatableStringValue &s);
+
     QByteArray m_value;
     QByteArray m_comment;
 };