diff --git a/platform/qt/src/qmapboxgl.cpp b/platform/qt/src/qmapboxgl.cpp index e370343df..204aa0571 100644 --- a/platform/qt/src/qmapboxgl.cpp +++ b/platform/qt/src/qmapboxgl.cpp @@ -1,5 +1,7 @@ #include "qmapboxgl_p.hpp" +#include "qt_conversion.hpp" + #include #include #include diff --git a/platform/qt/src/qt_conversion.hpp b/platform/qt/src/qt_conversion.hpp new file mode 100644 index 000000000..ebcbdbdc0 --- /dev/null +++ b/platform/qt/src/qt_conversion.hpp @@ -0,0 +1,106 @@ +#pragma once + +#include +#include +#include + +#include +#include + +namespace mbgl { +namespace style { +namespace conversion { + +inline bool isUndefined(const QVariant& value) { + return value.isNull() || !value.isValid(); +} + +inline bool isArray(const QVariant& value) { + return value.canConvert(QVariant::List); +} + +inline std::size_t arrayLength(const QVariant& value) { + return value.toList().size(); +} + +inline QVariant arrayMember(const QVariant& value, std::size_t i) { + return value.toList()[i]; +} + +inline bool isObject(const QVariant& value) { + return value.canConvert(QVariant::Map); +} + +inline optional objectMember(const QVariant& value, const char* key) { + auto map = value.toMap(); + auto iter = map.constFind(key); + + if (iter != map.constEnd()) { + return iter.value(); + } else { + return {}; + } +} + +template +optional eachMember(const QVariant& value, Fn&& fn) { + auto map = value.toMap(); + auto iter = map.constBegin(); + + while (iter != map.constEnd()) { + optional result = fn(iter.key().toStdString(), iter.value()); + if (result) { + return result; + } + + ++iter; + } + + return {}; +} + +inline optional toBool(const QVariant& value) { + if (value.type() == QVariant::Bool) { + return value.toBool(); + } else { + return {}; + } +} + +inline optional toNumber(const QVariant& value) { + if (value.type() == QVariant::Double) { + return value.toFloat(); + } else { + return {}; + } +} + +inline optional toString(const QVariant& value) { + if (value.type() == QVariant::String) { + return value.toString().toStdString(); + } else if (value.type() == QVariant::Color) { + return value.value().name().toStdString(); + } else { + return {}; + } +} + +inline optional toValue(const QVariant& value) { + if (value.type() == QVariant::Bool) { + return { value.toBool() }; + } else if (value.type() == QVariant::String) { + return { value.toString().toStdString() }; + } else if (value.type() == QVariant::Color) { + return { value.value().name().toStdString() }; + } else if (value.type() == QVariant::Int) { + return { value.toInt() }; + } else if (value.canConvert(QVariant::Double)) { + return { value.toFloat() }; + } else { + return {}; + } +} + +} // namespace conversion +} // namespace style +} // namespace mbgl