@@ -795,6 +795,24 @@ QVariant ossia_to_qvariant::operator()(QMetaType::Type type, const value& ossia_
795795 }
796796 return QVariant::fromValue (std::move (vars));
797797 }
798+ case QMetaType::QVariantMap: {
799+ auto val = convert<ossia::value_map_type>(ossia_val);
800+ QVariantMap vars;
801+ for (auto & [k, v] : val)
802+ {
803+ vars.insert (QString::fromStdString (k), v.apply (ossia_to_qvariant{}));
804+ }
805+ return QVariant::fromValue (std::move (vars));
806+ }
807+ case QMetaType::QVariantHash: {
808+ auto val = convert<ossia::value_map_type>(ossia_val);
809+ QVariantHash vars;
810+ for (auto & [k, v] : val)
811+ {
812+ vars.insert (QString::fromStdString (k), v.apply (ossia_to_qvariant{}));
813+ }
814+ return QVariant::fromValue (std::move (vars));
815+ }
798816 case QMetaType::QDate:
799817 // TODO double ?
800818 default : {
@@ -922,6 +940,316 @@ value qt_to_ossia::operator()(const QVariant& v)
922940 }
923941 }
924942}
943+
944+ void registerQVariantConverters ()
945+ {
946+ // ossia -> qvariant
947+ QMetaType::registerConverter<ossia::value, bool >([](const ossia::value& ossia_val) -> bool {
948+ return ossia::convert<bool >(ossia_val);
949+ });
950+ QMetaType::registerConverter<ossia::value, QTime>([](const ossia::value& ossia_val) -> QTime {
951+ return QTime ().addMSecs (convert<int >(ossia_val));
952+ });
953+ QMetaType::registerConverter<ossia::value, int >([](const ossia::value& ossia_val) -> int {
954+ return ossia::convert<int >(ossia_val);
955+ });
956+ QMetaType::registerConverter<ossia::value, qint16>([](const ossia::value& ossia_val) -> qint16 {
957+ return (qint16)ossia::convert<int >(ossia_val);
958+ });
959+ QMetaType::registerConverter<ossia::value, quint16>([](const ossia::value& ossia_val) -> quint16 {
960+ return (quint16)ossia::convert<int >(ossia_val);
961+ });
962+ QMetaType::registerConverter<ossia::value, quint32>([](const ossia::value& ossia_val) -> quint32 {
963+ return (quint32)ossia::convert<int >(ossia_val);
964+ });
965+ QMetaType::registerConverter<ossia::value, qlonglong>([](const ossia::value& ossia_val) -> qlonglong {
966+ return (qlonglong)ossia::convert<int >(ossia_val);
967+ });
968+ QMetaType::registerConverter<ossia::value, qulonglong>([](const ossia::value& ossia_val) -> qulonglong {
969+ return (qulonglong)ossia::convert<int >(ossia_val);
970+ });
971+ QMetaType::registerConverter<ossia::value, QChar>([](const ossia::value& ossia_val) -> QChar {
972+ return QChar::fromLatin1 (ossia::convert<int >(ossia_val));
973+ });
974+ QMetaType::registerConverter<ossia::value, char >([](const ossia::value& ossia_val) -> char {
975+ return char (ossia::convert<int >(ossia_val));
976+ });
977+ QMetaType::registerConverter<ossia::value, unsigned char >([](const ossia::value& ossia_val) -> unsigned char {
978+ return (unsigned char )ossia::convert<int >(ossia_val);
979+ });
980+ QMetaType::registerConverter<ossia::value, signed char >([](const ossia::value& ossia_val) -> signed char {
981+ return (signed char )ossia::convert<int >(ossia_val);
982+ });
983+ QMetaType::registerConverter<ossia::value, QString>([](const ossia::value& ossia_val) -> QString {
984+ return QString::fromStdString (ossia::convert<std::string>(ossia_val));
985+ });
986+ QMetaType::registerConverter<ossia::value, QUrl>([](const ossia::value& ossia_val) -> QUrl {
987+ return QUrl{QString::fromStdString (ossia::convert<std::string>(ossia_val))};
988+ });
989+ QMetaType::registerConverter<ossia::value, QByteArray>([](const ossia::value& ossia_val) -> QByteArray {
990+ return QByteArray::fromStdString (ossia::convert<std::string>(ossia_val));
991+ });
992+ QMetaType::registerConverter<ossia::value, float >([](const ossia::value& ossia_val) -> float {
993+ return ossia::convert<float >(ossia_val);
994+ });
995+ QMetaType::registerConverter<ossia::value, double >([](const ossia::value& ossia_val) -> double {
996+ return ossia::convert<double >(ossia_val);
997+ });
998+ QMetaType::registerConverter<ossia::value, QColor>([](const ossia::value& ossia_val) -> QColor {
999+ auto val = ossia::convert<ossia::vec4f>(ossia_val);
1000+ return QColor::fromRgbF (val[1 ], val[2 ], val[3 ], val[0 ]);
1001+ });
1002+ QMetaType::registerConverter<ossia::value, QPoint>([](const ossia::value& ossia_val) -> QPoint {
1003+ auto val = ossia::convert<ossia::vec2f>(ossia_val);
1004+ return QPoint (val[0 ], val[1 ]);
1005+ });
1006+ QMetaType::registerConverter<ossia::value, QPointF>([](const ossia::value& ossia_val) -> QPointF {
1007+ auto val = ossia::convert<ossia::vec2f>(ossia_val);
1008+ return QPointF (val[0 ], val[1 ]);
1009+ });
1010+ QMetaType::registerConverter<ossia::value, QVector2D>([](const ossia::value& ossia_val) -> QVector2D {
1011+ auto val = ossia::convert<ossia::vec2f>(ossia_val);
1012+ return QVector2D (val[0 ], val[1 ]);
1013+ });
1014+ QMetaType::registerConverter<ossia::value, QVector3D>([](const ossia::value& ossia_val) -> QVector3D {
1015+ auto val = ossia::convert<ossia::vec3f>(ossia_val);
1016+ return QVector3D (val[0 ], val[1 ], val[2 ]);
1017+ });
1018+ QMetaType::registerConverter<ossia::value, QVector4D>([](const ossia::value& ossia_val) -> QVector4D {
1019+ auto val = ossia::convert<ossia::vec4f>(ossia_val);
1020+ return QVector4D (val[0 ], val[1 ], val[2 ], val[3 ]);
1021+ });
1022+ QMetaType::registerConverter<ossia::value, QQuaternion>([](const ossia::value& ossia_val) -> QQuaternion {
1023+ auto val = ossia::convert<ossia::vec4f>(ossia_val);
1024+ return QQuaternion (val[0 ], val[1 ], val[2 ], val[3 ]);
1025+ });
1026+ QMetaType::registerConverter<ossia::value, QLine>([](const ossia::value& ossia_val) -> QLine {
1027+ auto val = ossia::convert<ossia::vec4f>(ossia_val);
1028+ return QLine (val[0 ], val[1 ], val[2 ], val[3 ]);
1029+ });
1030+ QMetaType::registerConverter<ossia::value, QLineF>([](const ossia::value& ossia_val) -> QLineF {
1031+ auto val = ossia::convert<ossia::vec4f>(ossia_val);
1032+ return QLineF (val[0 ], val[1 ], val[2 ], val[3 ]);
1033+ });
1034+ QMetaType::registerConverter<ossia::value, QRect>([](const ossia::value& ossia_val) -> QRect {
1035+ auto val = ossia::convert<ossia::vec4f>(ossia_val);
1036+ return QRect (val[0 ], val[1 ], val[2 ], val[3 ]);
1037+ });
1038+ QMetaType::registerConverter<ossia::value, QRectF>([](const ossia::value& ossia_val) -> QRectF {
1039+ auto val = ossia::convert<ossia::vec4f>(ossia_val);
1040+ return QRectF (val[0 ], val[1 ], val[2 ], val[3 ]);
1041+ });
1042+ QMetaType::registerConverter<ossia::value, QSize>([](const ossia::value& ossia_val) -> QSize {
1043+ auto val = ossia::convert<ossia::vec2f>(ossia_val);
1044+ return QSize (val[0 ], val[1 ]);
1045+ });
1046+ QMetaType::registerConverter<ossia::value, QSizeF>([](const ossia::value& ossia_val) -> QSizeF {
1047+ auto val = ossia::convert<ossia::vec2f>(ossia_val);
1048+ return QSizeF (val[0 ], val[1 ]);
1049+ });
1050+ QMetaType::registerConverter<ossia::value, QVariantList>([](const ossia::value& ossia_val) -> QVariantList {
1051+ auto val = ossia::convert<std::vector<ossia::value>>(ossia_val);
1052+ QVariantList vars;
1053+ vars.reserve (val.size ());
1054+ for (auto & v : val)
1055+ {
1056+ vars.push_back (v.apply (ossia_to_qvariant{}));
1057+ }
1058+ return vars;
1059+ });
1060+ QMetaType::registerConverter<ossia::value, QStringList>([](const ossia::value& ossia_val) -> QStringList {
1061+ auto val = ossia::convert<std::vector<ossia::value>>(ossia_val);
1062+ QStringList vars;
1063+ vars.reserve (val.size ());
1064+ for (auto & v : val)
1065+ {
1066+ vars.push_back (QString::fromStdString (ossia::convert<std::string>(v)));
1067+ }
1068+ return vars;
1069+ });
1070+ QMetaType::registerConverter<ossia::value, QByteArrayList>([](const ossia::value& ossia_val) -> QByteArrayList {
1071+ auto val = ossia::convert<std::vector<ossia::value>>(ossia_val);
1072+ QByteArrayList vars;
1073+ vars.reserve (val.size ());
1074+ for (auto & v : val)
1075+ {
1076+ vars.push_back (QByteArray::fromStdString (ossia::convert<std::string>(v)));
1077+ }
1078+ return vars;
1079+ });
1080+ QMetaType::registerConverter<ossia::value, QVariantMap>([](const ossia::value& ossia_val) -> QVariantMap {
1081+ auto val = ossia::convert<ossia::value_map_type>(ossia_val);
1082+ QVariantMap vars;
1083+ for (auto & [k, v] : val)
1084+ {
1085+ vars.insert (QString::fromStdString (k), v.apply (ossia_to_qvariant{}));
1086+ }
1087+ return vars;
1088+ });
1089+ QMetaType::registerConverter<ossia::value, QVariantHash>([](const ossia::value& ossia_val) -> QVariantHash {
1090+ auto val = ossia::convert<ossia::value_map_type>(ossia_val);
1091+ QVariantHash vars;
1092+ for (auto & [k, v] : val)
1093+ {
1094+ vars.insert (QString::fromStdString (k), v.apply (ossia_to_qvariant{}));
1095+ }
1096+ return vars;
1097+ });
1098+
1099+
1100+ // Qt -> ossia
1101+ // qvariant -> ossia
1102+ QMetaType::registerConverter<QTime, ossia::value>([](const QTime& v) -> ossia::value {
1103+ return qt_to_ossia{}(v);
1104+ });
1105+ QMetaType::registerConverter<bool , ossia::value>([](const bool & v) -> ossia::value {
1106+ return qt_to_ossia{}(v);
1107+ });
1108+ QMetaType::registerConverter<int , ossia::value>([](const int & v) -> ossia::value {
1109+ return qt_to_ossia{}(v);
1110+ });
1111+ QMetaType::registerConverter<uint, ossia::value>([](const uint& v) -> ossia::value {
1112+ return qt_to_ossia{}(v);
1113+ });
1114+ QMetaType::registerConverter<qlonglong, ossia::value>([](const qlonglong& v) -> ossia::value {
1115+ return qt_to_ossia{}(v);
1116+ });
1117+ QMetaType::registerConverter<qulonglong, ossia::value>([](const qulonglong& v) -> ossia::value {
1118+ return qt_to_ossia{}(v);
1119+ });
1120+ QMetaType::registerConverter<double , ossia::value>([](const double & v) -> ossia::value {
1121+ return qt_to_ossia{}(v);
1122+ });
1123+ QMetaType::registerConverter<long , ossia::value>([](const long & v) -> ossia::value {
1124+ return qt_to_ossia{}((qlonglong)v);
1125+ });
1126+ QMetaType::registerConverter<short , ossia::value>([](const short & v) -> ossia::value {
1127+ return qt_to_ossia{}((int )v);
1128+ });
1129+ QMetaType::registerConverter<ulong, ossia::value>([](const ulong& v) -> ossia::value {
1130+ return qt_to_ossia{}((qlonglong)v);
1131+ });
1132+ QMetaType::registerConverter<ushort, ossia::value>([](const ushort& v) -> ossia::value {
1133+ return qt_to_ossia{}((int )v);
1134+ });
1135+ QMetaType::registerConverter<char , ossia::value>([](const char & v) -> ossia::value {
1136+ return qt_to_ossia{}(v);
1137+ });
1138+ QMetaType::registerConverter<uchar, ossia::value>([](const uchar& v) -> ossia::value {
1139+ return qt_to_ossia{}((char )v);
1140+ });
1141+ QMetaType::registerConverter<signed char , ossia::value>([](const signed char & v) -> ossia::value {
1142+ return qt_to_ossia{}((char )v);
1143+ });
1144+ QMetaType::registerConverter<std::nullptr_t , ossia::value>([](const std::nullptr_t &) -> ossia::value {
1145+ return ossia::value{};
1146+ });
1147+ QMetaType::registerConverter<QChar, ossia::value>([](const QChar& v) -> ossia::value {
1148+ return qt_to_ossia{}(v);
1149+ });
1150+ QMetaType::registerConverter<QUrl, ossia::value>([](const QUrl& v) -> ossia::value {
1151+ return qt_to_ossia{}(v.toString ());
1152+ });
1153+ QMetaType::registerConverter<QString, ossia::value>([](const QString& v) -> ossia::value {
1154+ return qt_to_ossia{}(v);
1155+ });
1156+ QMetaType::registerConverter<QByteArray, ossia::value>([](const QByteArray& v) -> ossia::value {
1157+ return qt_to_ossia{}(v);
1158+ });
1159+ QMetaType::registerConverter<float , ossia::value>([](const float & v) -> ossia::value {
1160+ return qt_to_ossia{}(v);
1161+ });
1162+ QMetaType::registerConverter<QColor, ossia::value>([](const QColor& v) -> ossia::value {
1163+ return qt_to_ossia{}(v);
1164+ });
1165+ QMetaType::registerConverter<QPoint, ossia::value>([](const QPoint& v) -> ossia::value {
1166+ return qt_to_ossia{}(v);
1167+ });
1168+ QMetaType::registerConverter<QPointF, ossia::value>([](const QPointF& v) -> ossia::value {
1169+ return qt_to_ossia{}(v);
1170+ });
1171+ QMetaType::registerConverter<QVector2D, ossia::value>([](const QVector2D& v) -> ossia::value {
1172+ return qt_to_ossia{}(v);
1173+ });
1174+ QMetaType::registerConverter<QSize, ossia::value>([](const QSize& v) -> ossia::value {
1175+ return qt_to_ossia{}(v);
1176+ });
1177+ QMetaType::registerConverter<QSizeF, ossia::value>([](const QSizeF& v) -> ossia::value {
1178+ return qt_to_ossia{}(v);
1179+ });
1180+ QMetaType::registerConverter<QVector3D, ossia::value>([](const QVector3D& v) -> ossia::value {
1181+ return qt_to_ossia{}(v);
1182+ });
1183+ QMetaType::registerConverter<QVector4D, ossia::value>([](const QVector4D& v) -> ossia::value {
1184+ return qt_to_ossia{}(v);
1185+ });
1186+ QMetaType::registerConverter<QQuaternion, ossia::value>([](const QQuaternion& v) -> ossia::value {
1187+ return qt_to_ossia{}(v);
1188+ });
1189+ QMetaType::registerConverter<QLine, ossia::value>([](const QLine& v) -> ossia::value {
1190+ return qt_to_ossia{}(v);
1191+ });
1192+ QMetaType::registerConverter<QLineF, ossia::value>([](const QLineF& v) -> ossia::value {
1193+ return qt_to_ossia{}(v);
1194+ });
1195+ QMetaType::registerConverter<QRect, ossia::value>([](const QRect& v) -> ossia::value {
1196+ return qt_to_ossia{}(v);
1197+ });
1198+ QMetaType::registerConverter<QRectF, ossia::value>([](const QRectF& v) -> ossia::value {
1199+ return qt_to_ossia{}(v);
1200+ });
1201+ QMetaType::registerConverter<QVariantList, ossia::value>([](const QVariantList& v) -> ossia::value {
1202+ return qt_to_ossia{}(v);
1203+ });
1204+ QMetaType::registerConverter<QVariantMap, ossia::value>([](const QVariantMap& v) -> ossia::value {
1205+ return qt_to_ossia{}(v);
1206+ });
1207+ QMetaType::registerConverter<QVariantHash, ossia::value>([](const QVariantHash& v) -> ossia::value {
1208+ return qt_to_ossia{}(v);
1209+ });
1210+ QMetaType::registerConverter<QJsonArray, ossia::value>([](const QJsonArray& v) -> ossia::value {
1211+ return qt_to_ossia{}(v.toVariantList ());
1212+ });
1213+ QMetaType::registerConverter<QJsonObject, ossia::value>([](const QJsonObject& v) -> ossia::value {
1214+ return qt_to_ossia{}(v.toVariantMap ());
1215+ });
1216+ QMetaType::registerConverter<QJsonValue, ossia::value>([](const QJsonValue& v) -> ossia::value {
1217+ return qt_to_ossia{}(v.toVariant ());
1218+ });
1219+ QMetaType::registerConverter<QStringList, ossia::value>([](const QStringList& v) -> ossia::value {
1220+ return qt_to_ossia{}(v);
1221+ });
1222+ QMetaType::registerConverter<QByteArrayList, ossia::value>([](const QByteArrayList& v) -> ossia::value {
1223+ return qt_to_ossia{}(v);
1224+ });
1225+ QMetaType::registerConverter<QDate, ossia::value>([](const QDate& v) -> ossia::value {
1226+ return qt_to_ossia{}(v);
1227+ });
1228+
1229+ #if __has_include(<QJSValue>)
1230+ QMetaType::registerConverter<QJSValue, ossia::value>([](const QJSValue& v) -> ossia::value {
1231+ return value_from_js (v);
1232+ });
1233+ QMetaType::registerConverter<QJSValueList, ossia::value>([](const QJSValueList& in_values) -> ossia::value {
1234+ std::vector<ossia::value> out_values;
1235+ out_values.reserve (in_values.size ());
1236+ for (const auto & in_val : in_values)
1237+ out_values.push_back (value_from_js (in_val));
1238+ return out_values;
1239+ });
1240+ #endif
1241+
1242+
1243+ // Generic cases
1244+ QMetaType::registerConverter<ossia::value, QVariant>([](const ossia::value& ossia_val) -> QVariant {
1245+ return ossia_val.apply (ossia_to_qvariant{});
1246+ });
1247+ QMetaType::registerConverter<QVariant, ossia::value>([](const QVariant& qval) -> ossia::value {
1248+ return qt_to_ossia{}(qval);
1249+ });
1250+
1251+ }
1252+
9251253}
9261254#endif
9271255
0 commit comments