QByteArray ViewJson::render(Context *c) const { Q_D(const ViewJson); QByteArray ret; QJsonObject obj; const QVariantHash stash = c->stash(); switch (d->exposeMode) { case All: obj = QJsonObject::fromVariantHash(stash); break; case String: { auto it = stash.constFind(d->exposeKey); if (it != stash.constEnd()) { obj.insert(d->exposeKey, QJsonValue::fromVariant(it.value())); } break; } case StringList: { QVariantHash exposedStash; auto it = stash.constBegin(); while (it != stash.constEnd()) { const QString key = it.key(); if (d->exposeKeys.contains(key)) { exposedStash.insertMulti(it.key(), it.value()); } ++it; } obj = QJsonObject::fromVariantHash(exposedStash); break; } case RegularExpression: { QVariantHash exposedStash; QRegularExpression re = d->exposeRE; // thread safety auto it = stash.constBegin(); while (it != stash.constEnd()) { const QString key = it.key(); if (re.match(key).hasMatch()) { exposedStash.insertMulti(key, it.value()); } ++it; } obj = QJsonObject::fromVariantHash(exposedStash); break; } } c->response()->setContentType(QStringLiteral("application/json")); ret = QJsonDocument(obj).toJson(d->format); return ret; }
QByteArray FSTReader::writeMapping(const QVariantHash& mapping) { static const QStringList PREFERED_ORDER = QStringList() << NAME_FIELD << TYPE_FIELD << SCALE_FIELD << FILENAME_FIELD << TEXDIR_FIELD << JOINT_FIELD << FREE_JOINT_FIELD << BLENDSHAPE_FIELD << JOINT_INDEX_FIELD; QBuffer buffer; buffer.open(QIODevice::WriteOnly); for (auto key : PREFERED_ORDER) { auto it = mapping.find(key); if (it != mapping.constEnd()) { if (key == FREE_JOINT_FIELD) { // writeVariant does not handle strings added using insertMulti. for (auto multi : mapping.values(key)) { buffer.write(key.toUtf8()); buffer.write(" = "); buffer.write(multi.toByteArray()); buffer.write("\n"); } } else { writeVariant(buffer, it); } } } for (auto it = mapping.constBegin(); it != mapping.constEnd(); it++) { if (!PREFERED_ORDER.contains(it.key())) { writeVariant(buffer, it); } } return buffer.data(); }
static QString variantHashToString( const QVariantHash& variantHash ) { QStringList result; for ( auto it = variantHash.constBegin(); it != variantHash.constEnd(); ++it ) result.append( it.key() + '=' + variantToString( it.value() ) ); return '<' + result.join(',') + '>'; }
/*! Converts the variant hash \a hash to a QJsonObject. \since 5.5 The keys in \a hash will be used as the keys in the JSON object, and the QVariant values will be converted to JSON values. \sa fromVariantMap(), toVariantHash(), QJsonValue::fromVariant() */ QJsonObject QJsonObject::fromVariantHash(const QVariantHash &hash) { // ### this is implemented the trivial way, not the most efficient way QJsonObject object; for (QVariantHash::const_iterator it = hash.constBegin(); it != hash.constEnd(); ++it) object.insert(it.key(), QJsonValue::fromVariant(it.value())); return object; }
void ClearSilverPrivate::serializeHash(HDF *hdf, const QVariantHash &hash, const QString &prefix) const { QString _prefix; if (!prefix.isEmpty()) { _prefix = prefix + QLatin1Char('.'); } auto it = hash.constBegin(); while (it != hash.constEnd()) { serializeVariant(hdf, it.value(), _prefix + it.key()); ++it; } }
QByteArray FSTReader::writeMapping(const QVariantHash& mapping) { static const QStringList PREFERED_ORDER = QStringList() << NAME_FIELD << TYPE_FIELD << SCALE_FIELD << FILENAME_FIELD << TEXDIR_FIELD << JOINT_FIELD << FREE_JOINT_FIELD << BLENDSHAPE_FIELD << JOINT_INDEX_FIELD; QBuffer buffer; buffer.open(QIODevice::WriteOnly); for (auto key : PREFERED_ORDER) { auto it = mapping.find(key); if (it != mapping.constEnd()) { writeVariant(buffer, it); } } for (auto it = mapping.constBegin(); it != mapping.constEnd(); it++) { if (!PREFERED_ORDER.contains(it.key())) { writeVariant(buffer, it); } } return buffer.data(); }
void FSTReader::writeVariant(QBuffer& buffer, QVariantHash::const_iterator& it) { QByteArray key = it.key().toUtf8() + " = "; QVariantHash hashValue = it.value().toHash(); if (hashValue.isEmpty()) { buffer.write(key + it.value().toByteArray() + "\n"); return; } for (QVariantHash::const_iterator second = hashValue.constBegin(); second != hashValue.constEnd(); second++) { QByteArray extendedKey = key + second.key().toUtf8(); QVariantList listValue = second.value().toList(); if (listValue.isEmpty()) { buffer.write(extendedKey + " = " + second.value().toByteArray() + "\n"); continue; } buffer.write(extendedKey); for (QVariantList::const_iterator third = listValue.constBegin(); third != listValue.constEnd(); third++) { buffer.write(" = " + third->toByteArray()); } buffer.write("\n"); } }
bool ModelPackager::zipModel() { QTemporaryDir dir; dir.setAutoRemove(true); QDir tempDir(dir.path()); QByteArray nameField = _mapping.value(NAME_FIELD).toByteArray(); tempDir.mkpath(nameField + "/textures"); tempDir.mkpath(nameField + "/scripts"); QDir fbxDir(tempDir.path() + "/" + nameField); QDir texDir(fbxDir.path() + "/textures"); QDir scriptDir(fbxDir.path() + "/scripts"); // Copy textures listTextures(); if (!_textures.empty()) { QByteArray texdirField = _mapping.value(TEXDIR_FIELD).toByteArray(); _texDir = _modelFile.path() + "/" + texdirField; copyTextures(_texDir, texDir); } // Copy scripts QByteArray scriptField = _mapping.value(SCRIPT_FIELD).toByteArray(); _mapping.remove(SCRIPT_FIELD); if (scriptField.size() > 1) { tempDir.mkpath(nameField + "/scripts"); _scriptDir = _modelFile.path() + "/" + scriptField; QDir wdir = QDir(_scriptDir); _mapping.remove(SCRIPT_FIELD); wdir.setSorting(QDir::Name | QDir::Reversed); auto list = wdir.entryList(QDir::NoDotAndDotDot | QDir::AllEntries); for (auto script : list) { auto sc = tempDir.relativeFilePath(scriptDir.path()) + "/" + QUrl(script).fileName(); _mapping.insertMulti(SCRIPT_FIELD, sc); } copyDirectoryContent(wdir, scriptDir); } // Copy LODs QVariantHash lodField = _mapping.value(LOD_FIELD).toHash(); if (!lodField.empty()) { for (auto it = lodField.constBegin(); it != lodField.constEnd(); ++it) { QString oldPath = _modelFile.path() + "/" + it.key(); QFile lod(oldPath); QString newPath = fbxDir.path() + "/" + QFileInfo(lod).fileName(); if (lod.exists()) { lod.copy(newPath); } } } // Copy FBX QFile fbx(_fbxInfo.filePath()); QByteArray filenameField = _mapping.value(FILENAME_FIELD).toByteArray(); QString newPath = fbxDir.path() + "/" + QFileInfo(filenameField).fileName(); fbx.copy(newPath); // Correct FST _mapping[FILENAME_FIELD] = tempDir.relativeFilePath(newPath); _mapping[TEXDIR_FIELD] = tempDir.relativeFilePath(texDir.path()); for (auto multi : _mapping.values(SCRIPT_FIELD)) { multi.fromValue(tempDir.relativeFilePath(scriptDir.path()) + multi.toString()); } // Copy FST QFile fst(tempDir.path() + "/" + nameField + ".fst"); if (fst.open(QIODevice::WriteOnly)) { fst.write(FSTReader::writeMapping(_mapping)); fst.close(); } else { qCDebug(interfaceapp) << "Couldn't write FST file" << fst.fileName(); return false; } QString saveDirPath = QFileDialog::getExistingDirectory(nullptr, "Save Model", "", QFileDialog::ShowDirsOnly); if (saveDirPath.isEmpty()) { qCDebug(interfaceapp) << "Invalid directory" << saveDirPath; return false; } QDir saveDir(saveDirPath); copyDirectoryContent(tempDir, saveDir); return true; }
void WelcomeMode::onThemeChanged() { const QVariantHash creatorTheme = Utils::creatorTheme()->values(); for (auto it = creatorTheme.constBegin(); it != creatorTheme.constEnd(); ++it) m_themeProperties.insert(it.key(), it.value()); }
bool ModelPackager::zipModel() { QTemporaryDir dir; dir.setAutoRemove(true); QDir tempDir(dir.path()); QByteArray nameField = _mapping.value(NAME_FIELD).toByteArray(); tempDir.mkpath(nameField + "/textures"); QDir fbxDir(tempDir.path() + "/" + nameField); QDir texDir(fbxDir.path() + "/textures"); // Copy textures listTextures(); if (!_textures.empty()) { QByteArray texdirField = _mapping.value(TEXDIR_FIELD).toByteArray(); _texDir = _modelFile.path() + "/" + texdirField; copyTextures(_texDir, texDir); } // Copy LODs QVariantHash lodField = _mapping.value(LOD_FIELD).toHash(); if (!lodField.empty()) { for (auto it = lodField.constBegin(); it != lodField.constEnd(); ++it) { QString oldPath = _modelFile.path() + "/" + it.key(); QFile lod(oldPath); QString newPath = fbxDir.path() + "/" + QFileInfo(lod).fileName(); if (lod.exists()) { lod.copy(newPath); } } } // Copy FBX QFile fbx(_fbxInfo.filePath()); QByteArray filenameField = _mapping.value(FILENAME_FIELD).toByteArray(); QString newPath = fbxDir.path() + "/" + QFileInfo(filenameField).fileName(); fbx.copy(newPath); // Correct FST _mapping[FILENAME_FIELD] = tempDir.relativeFilePath(newPath); _mapping[TEXDIR_FIELD] = tempDir.relativeFilePath(texDir.path()); // Copy FST QFile fst(tempDir.path() + "/" + nameField + ".fst"); if (fst.open(QIODevice::WriteOnly)) { fst.write(FSTReader::writeMapping(_mapping)); fst.close(); } else { qCDebug(interfaceapp) << "Couldn't write FST file" << fst.fileName(); return false; } QString saveDirPath = QFileDialog::getExistingDirectory(nullptr, "Save Model", "", QFileDialog::ShowDirsOnly); if (saveDirPath.isEmpty()) { qCDebug(interfaceapp) << "Invalid directory" << saveDirPath; return false; } QDir saveDir(saveDirPath); copyDirectoryContent(tempDir, saveDir); return true; }
// Convert a C++ object at an arbitary address to Python. PyObject *Chimera::toPyObject(void *cpp) const { if (_metatype == PyQt_PyObject::metatype) { if (_type) { // SIP knows the type (therefore it isn't really wrapped in a // PyQt_PyObject) but it's not registered with Qt. if (_name.endsWith('*')) cpp = *reinterpret_cast<void **>(cpp); return sipConvertFromType(cpp, _type, 0); } else { // Otherwise unwrap the Python object. PyQt_PyObject *pyobj_wrapper = reinterpret_cast<PyQt_PyObject *>(cpp); if (!pyobj_wrapper->pyobject) { PyErr_SetString(PyExc_TypeError, "unable to convert a QVariant back to a Python object"); return 0; } Py_INCREF(pyobj_wrapper->pyobject); return pyobj_wrapper->pyobject; } } PyObject *py = 0; switch (_metatype) { case QMetaType::Bool: py = PyBool_FromLong(*reinterpret_cast<bool *>(cpp)); break; case QMetaType::Int: if (isFlag()) { py = sipConvertFromType(cpp, _type, 0); } else if (isEnum()) { py = sipConvertFromEnum(*reinterpret_cast<int *>(cpp), _type); } else { py = SIPLong_FromLong(*reinterpret_cast<int *>(cpp)); } break; case QMetaType::UInt: { long ui = *reinterpret_cast<unsigned int *>(cpp); if (ui < 0) py = PyLong_FromUnsignedLong((unsigned long)ui); else py = SIPLong_FromLong(ui); break; } case QMetaType::Double: py = PyFloat_FromDouble(*reinterpret_cast<double *>(cpp)); break; case QMetaType::VoidStar: py = sipConvertFromVoidPtr(*reinterpret_cast<void **>(cpp)); break; case QMetaType::Long: py = SIPLong_FromLong(*reinterpret_cast<long *>(cpp)); break; case QMetaType::LongLong: py = PyLong_FromLongLong(*reinterpret_cast<qlonglong *>(cpp)); break; case QMetaType::Short: py = SIPLong_FromLong(*reinterpret_cast<short *>(cpp)); break; case QMetaType::Char: case QMetaType::UChar: py = SIPBytes_FromStringAndSize(reinterpret_cast<char *>(cpp), 1); break; case QMetaType::ULong: py = PyLong_FromUnsignedLong(*reinterpret_cast<unsigned long *>(cpp)); break; case QMetaType::ULongLong: py = PyLong_FromUnsignedLongLong(*reinterpret_cast<qulonglong *>(cpp)); break; case QMetaType::UShort: py = SIPLong_FromLong(*reinterpret_cast<unsigned short *>(cpp)); break; case QMetaType::Float: py = PyFloat_FromDouble(*reinterpret_cast<float *>(cpp)); break; case QMetaType::QObjectStar: py = sipConvertFromType(*reinterpret_cast<void **>(cpp), sipType_QObject, 0); break; case QMetaType::QWidgetStar: if (sipType_QWidget) py = sipConvertFromType(*reinterpret_cast<void **>(cpp), sipType_QWidget, 0); break; case QMetaType::QVariantList: { QVariantList *ql = reinterpret_cast<QVariantList *>(cpp); py = PyList_New(ql->size()); if (py) { for (int i = 0; i < ql->size(); ++i) { PyObject *val_obj = toAnyPyObject(ql->at(i)); if (!val_obj) { Py_DECREF(py); py = 0; break; } PyList_SET_ITEM(py, i, val_obj); } } break; } case QMetaType::QVariantMap: { py = PyDict_New(); if (py) { QVariantMap *qm = reinterpret_cast<QVariantMap *>(cpp); for (QVariantMap::const_iterator it = qm->constBegin(); it != qm->constEnd(); ++it) if (!add_variant_to_dict(py, it.key(), it.value())) { Py_DECREF(py); py = 0; break; } } break; } #if QT_VERSION >= 0x040500 case QMetaType::QVariantHash: { py = PyDict_New(); if (py) { QVariantHash *qh = reinterpret_cast<QVariantHash *>(cpp); for (QVariantHash::const_iterator it = qh->constBegin(); it != qh->constEnd(); ++it) if (!add_variant_to_dict(py, it.key(), it.value())) { Py_DECREF(py); py = 0; break; } } break; } #endif case -1: { char *s = *reinterpret_cast<char **>(cpp); if (s) { py = SIPBytes_FromString(s); } else { Py_INCREF(Py_None); py = Py_None; } break; } default: if (_type) { if (_name.endsWith('*')) { py = sipConvertFromType(*reinterpret_cast<void **>(cpp), _type, 0); } else { // Make a copy as it is a value type. void *copy = QMetaType::construct(_metatype, cpp); py = sipConvertFromNewType(copy, _type, 0); if (!py) QMetaType::destroy(_metatype, copy); } } } if (!py) PyErr_Format(PyExc_TypeError, "unable to convert a C++ '%s' instance to a Python object", _name.constData()); return py; }