diff options
Diffstat (limited to 'platform/qt')
-rw-r--r-- | platform/qt/config.cmake | 28 | ||||
-rw-r--r-- | platform/qt/include/qmapboxgl.hpp | 6 | ||||
-rw-r--r-- | platform/qt/qt.cmake | 75 | ||||
-rw-r--r-- | platform/qt/qt4.cmake | 25 | ||||
-rw-r--r-- | platform/qt/qt5.cmake | 28 | ||||
-rw-r--r-- | platform/qt/src/headless_backend_qt.cpp (renamed from platform/qt/test/headless_backend_qt.cpp) | 0 | ||||
-rw-r--r-- | platform/qt/src/http_request.cpp | 4 | ||||
-rw-r--r-- | platform/qt/src/qmapboxgl.cpp | 47 | ||||
-rw-r--r-- | platform/qt/src/qmapboxgl_p.hpp | 9 | ||||
-rw-r--r-- | platform/qt/src/run_loop.cpp | 16 | ||||
-rw-r--r-- | platform/qt/src/sqlite3.cpp | 1 | ||||
-rw-r--r-- | platform/qt/src/thread_local.cpp | 4 | ||||
-rw-r--r-- | platform/qt/test/qmapboxgl.cpp | 99 | ||||
-rw-r--r-- | platform/qt/test/qmapboxgl.test.cpp | 77 | ||||
-rw-r--r-- | platform/qt/test/qmapboxgl.test.hpp | 36 |
15 files changed, 258 insertions, 197 deletions
diff --git a/platform/qt/config.cmake b/platform/qt/config.cmake index 732fb1de28..a7fdbf3542 100644 --- a/platform/qt/config.cmake +++ b/platform/qt/config.cmake @@ -15,7 +15,7 @@ endif() macro(mbgl_platform_core) target_sources(mbgl-core - ${MBGL_QT_FILES} + ${MBGL_QT_CORE_FILES} ) target_include_directories(mbgl-core @@ -24,7 +24,7 @@ macro(mbgl_platform_core) ) target_link_libraries(mbgl-core - ${MBGL_QT_LIBRARIES} + ${MBGL_QT_CORE_LIBRARIES} ) if(NOT WITH_QT_DECODERS) @@ -50,17 +50,23 @@ macro(mbgl_platform_core) endmacro() + +macro(mbgl_filesource) + target_sources(mbgl-filesource + ${MBGL_QT_FILESOURCE_FILES} + ) + + target_link_libraries(mbgl-filesource + ${MBGL_QT_FILESOURCE_LIBRARIES} + ) +endmacro() + + macro(mbgl_platform_test) target_sources(mbgl-test - PRIVATE platform/default/mbgl/gl/headless_frontend.cpp - PRIVATE platform/default/mbgl/gl/headless_frontend.hpp - PRIVATE platform/default/mbgl/gl/headless_backend.cpp - PRIVATE platform/default/mbgl/gl/headless_backend.hpp - PRIVATE platform/default/mbgl/gl/headless_display.cpp - PRIVATE platform/default/mbgl/gl/headless_display.hpp - PRIVATE platform/qt/test/headless_backend_qt.cpp PRIVATE platform/qt/test/main.cpp - PRIVATE platform/qt/test/qmapboxgl.cpp + PRIVATE platform/qt/test/qmapboxgl.test.cpp + PRIVATE platform/qt/test/qmapboxgl.test.cpp ) set_source_files_properties( @@ -72,7 +78,7 @@ macro(mbgl_platform_test) target_link_libraries(mbgl-test PRIVATE qmapboxgl - ${MBGL_QT_TEST_LIBRARIES} + PRIVATE mbgl-filesource ) endmacro() diff --git a/platform/qt/include/qmapboxgl.hpp b/platform/qt/include/qmapboxgl.hpp index e2fb283989..ebbd949921 100644 --- a/platform/qt/include/qmapboxgl.hpp +++ b/platform/qt/include/qmapboxgl.hpp @@ -10,6 +10,8 @@ #include <QString> #include <QStringList> +#include <functional> + class QMapboxGLPrivate; // This header follows the Qt coding style: https://wiki.qt.io/Qt_Coding_Style @@ -59,6 +61,9 @@ public: QString apiBaseUrl() const; void setApiBaseUrl(const QString &); + std::function<std::string(const std::string &&)> resourceTransform() const; + void setResourceTransform(const std::function<std::string(const std::string &&)> &); + private: GLContextMode m_contextMode; ConstrainMode m_constrainMode; @@ -69,6 +74,7 @@ private: QString m_assetPath; QString m_accessToken; QString m_apiBaseUrl; + std::function<std::string(const std::string &&)> m_resourceTransform; }; struct Q_DECL_EXPORT QMapboxGLCameraOptions { diff --git a/platform/qt/qt.cmake b/platform/qt/qt.cmake index 489ae5ed08..2346d7d820 100644 --- a/platform/qt/qt.cmake +++ b/platform/qt/qt.cmake @@ -10,22 +10,16 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden -D__QT__") set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) -set(CMAKE_INCLUDE_CURRENT_DIR ON) -set(MBGL_QT_FILES - # File source - PRIVATE platform/default/asset_file_source.cpp - PRIVATE platform/default/default_file_source.cpp - PRIVATE platform/default/local_file_source.cpp - PRIVATE platform/default/online_file_source.cpp - - # Offline - PRIVATE platform/default/mbgl/storage/offline.cpp - PRIVATE platform/default/mbgl/storage/offline_database.cpp - PRIVATE platform/default/mbgl/storage/offline_database.hpp - PRIVATE platform/default/mbgl/storage/offline_download.cpp - PRIVATE platform/default/mbgl/storage/offline_download.hpp - PRIVATE platform/default/sqlite3.hpp +set(MBGL_QT_CORE_FILES + # Headless view + PRIVATE platform/default/mbgl/gl/headless_frontend.cpp + PRIVATE platform/default/mbgl/gl/headless_frontend.hpp + PRIVATE platform/default/mbgl/gl/headless_backend.cpp + PRIVATE platform/default/mbgl/gl/headless_backend.hpp + PRIVATE platform/default/mbgl/gl/headless_display.cpp + PRIVATE platform/default/mbgl/gl/headless_display.hpp + PRIVATE platform/qt/src/headless_backend_qt.cpp # Misc PRIVATE platform/default/logging_stderr.cpp @@ -42,22 +36,24 @@ set(MBGL_QT_FILES # Platform integration PRIVATE platform/qt/src/async_task.cpp PRIVATE platform/qt/src/async_task_impl.hpp - PRIVATE platform/qt/src/http_file_source.cpp - PRIVATE platform/qt/src/http_file_source.hpp - PRIVATE platform/qt/src/http_request.cpp - PRIVATE platform/qt/src/http_request.hpp PRIVATE platform/qt/src/qt_image.cpp PRIVATE platform/qt/src/run_loop.cpp PRIVATE platform/qt/src/run_loop_impl.hpp - PRIVATE platform/qt/src/sqlite3.cpp PRIVATE platform/qt/src/string_stdlib.cpp PRIVATE platform/qt/src/timer.cpp PRIVATE platform/qt/src/timer_impl.hpp PRIVATE platform/qt/src/utf.cpp ) -include_directories( - PRIVATE platform/qt/include +set(MBGL_QT_FILESOURCE_FILES + # File source + PRIVATE platform/qt/src/http_file_source.cpp + PRIVATE platform/qt/src/http_file_source.hpp + PRIVATE platform/qt/src/http_request.cpp + PRIVATE platform/qt/src/http_request.hpp + + # Database + PRIVATE platform/qt/src/sqlite3.cpp ) # Shared library @@ -72,6 +68,17 @@ add_library(qmapboxgl SHARED platform/default/mbgl/util/default_styles.hpp ) +target_include_directories(qmapboxgl + PUBLIC platform/qt/include +) + +target_link_libraries(qmapboxgl + PRIVATE mbgl-core + PRIVATE mbgl-filesource + ${MBGL_QT_CORE_LIBRARIES} + ${MBGL_QT_FILESOURCE_LIBRARIES} +) + # C++ app add_executable(mbgl-qt platform/qt/app/main.cpp @@ -80,6 +87,20 @@ add_executable(mbgl-qt platform/qt/resources/common.qrc ) +target_compile_options(qmapboxgl + PRIVATE -std=c++03 +) + +target_link_libraries(mbgl-qt + PRIVATE qmapboxgl +) + +if(WITH_QT_4) + include(platform/qt/qt4.cmake) +else() + include(platform/qt/qt5.cmake) +endif() + xcode_create_scheme(TARGET mbgl-qt) if(WITH_QT_4) @@ -90,22 +111,22 @@ endif() # OS specific configurations if (MASON_PLATFORM STREQUAL "osx" OR MASON_PLATFORM STREQUAL "ios") - list(APPEND MBGL_QT_FILES + list(APPEND MBGL_QT_CORE_FILES PRIVATE platform/darwin/src/nsthread.mm ) - list(APPEND MBGL_QT_LIBRARIES + list(APPEND MBGL_QT_CORE_LIBRARIES PRIVATE "-framework Foundation" PRIVATE "-framework OpenGL" ) elseif (CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux") - list(APPEND MBGL_QT_FILES + list(APPEND MBGL_QT_CORE_FILES PRIVATE platform/default/thread.cpp ) - list(APPEND MBGL_QT_LIBRARIES + list(APPEND MBGL_QT_CORE_LIBRARIES PRIVATE -lGL ) elseif (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") - list(APPEND MBGL_QT_FILES + list(APPEND MBGL_QT_CORE_FILES PRIVATE platform/qt/src/thread.cpp ) endif() diff --git a/platform/qt/qt4.cmake b/platform/qt/qt4.cmake index 66aed87c38..272009c541 100644 --- a/platform/qt/qt4.cmake +++ b/platform/qt/qt4.cmake @@ -1,31 +1,20 @@ find_package(Qt4 REQUIRED) -set(MBGL_QT_LIBRARIES - PRIVATE Qt4::QtCore - PRIVATE Qt4::QtGui - PRIVATE Qt4::QtNetwork - PRIVATE Qt4::QtOpenGL - PRIVATE Qt4::QtSql +set(MBGL_QT_CORE_LIBRARIES + PUBLIC Qt4::QtCore + PUBLIC Qt4::QtGui + PUBLIC Qt4::QtOpenGL ) -set(MBGL_QT_TEST_LIBRARIES - PRIVATE Qt4::QtCore - PRIVATE Qt4::QtOpenGL +set(MBGL_QT_FILESOURCE_LIBRARIES + PUBLIC Qt4::QtNetwork + PUBLIC Qt4::QtSql ) target_compile_options(qmapboxgl PRIVATE -Wno-inconsistent-missing-override ) -target_link_libraries(qmapboxgl - PRIVATE mbgl-core - PRIVATE Qt4::QtCore - PRIVATE Qt4::QtGui - PRIVATE Qt4::QtOpenGL -) - target_link_libraries(mbgl-qt - PRIVATE qmapboxgl - PRIVATE Qt4::QtGui PRIVATE Qt4::QtOpenGL ) diff --git a/platform/qt/qt5.cmake b/platform/qt/qt5.cmake index ed51051311..c4af774ba3 100644 --- a/platform/qt/qt5.cmake +++ b/platform/qt/qt5.cmake @@ -1,35 +1,21 @@ find_package(Qt5Core REQUIRED) find_package(Qt5Gui REQUIRED) -find_package(Qt5Location REQUIRED) find_package(Qt5Network REQUIRED) find_package(Qt5OpenGL REQUIRED) find_package(Qt5Widgets REQUIRED) find_package(Qt5Sql REQUIRED) -set(MBGL_QT_LIBRARIES - PRIVATE Qt5::Core - PRIVATE Qt5::Gui - PRIVATE Qt5::Network - PRIVATE Qt5::Sql +set(MBGL_QT_CORE_LIBRARIES + PUBLIC Qt5::Core + PUBLIC Qt5::Gui + PUBLIC Qt5::OpenGL ) -set(MBGL_QT_TEST_LIBRARIES - PRIVATE Qt5::Core - PRIVATE Qt5::Gui - PRIVATE Qt5::Widgets - PRIVATE Qt5::OpenGL -) - -target_link_libraries(qmapboxgl - PRIVATE mbgl-core - PRIVATE Qt5::Core - PRIVATE Qt5::Gui - PRIVATE Qt5::Location - PRIVATE Qt5::Sql +set(MBGL_QT_FILESOURCE_LIBRARIES + PUBLIC Qt5::Network + PUBLIC Qt5::Sql ) target_link_libraries(mbgl-qt - PRIVATE qmapboxgl - PRIVATE Qt5::OpenGL PRIVATE Qt5::Widgets ) diff --git a/platform/qt/test/headless_backend_qt.cpp b/platform/qt/src/headless_backend_qt.cpp index 5f95b2f96a..5f95b2f96a 100644 --- a/platform/qt/test/headless_backend_qt.cpp +++ b/platform/qt/src/headless_backend_qt.cpp diff --git a/platform/qt/src/http_request.cpp b/platform/qt/src/http_request.cpp index ef753c3e0e..386a2d9ef4 100644 --- a/platform/qt/src/http_request.cpp +++ b/platform/qt/src/http_request.cpp @@ -82,7 +82,9 @@ void HTTPRequest::handleNetworkReply(QNetworkReply *reply) } else if (header == "etag") { response.etag = std::string(line.second.constData(), line.second.size()); } else if (header == "cache-control") { - response.expires = http::CacheControl::parse(line.second.constData()).toTimePoint(); + const auto cc = http::CacheControl::parse(line.second.constData()); + response.expires = cc.toTimePoint(); + response.mustRevalidate = cc.mustRevalidate; } else if (header == "expires") { response.expires = util::parseTimestamp(line.second.constData()); } else if (header == "retry-after") { diff --git a/platform/qt/src/qmapboxgl.cpp b/platform/qt/src/qmapboxgl.cpp index eeb0bece12..074ef280aa 100644 --- a/platform/qt/src/qmapboxgl.cpp +++ b/platform/qt/src/qmapboxgl.cpp @@ -8,6 +8,7 @@ #include <mbgl/annotation/annotation.hpp> #include <mbgl/map/camera.hpp> #include <mbgl/map/map.hpp> +#include <mbgl/math/log2.hpp> #include <mbgl/math/minmax.hpp> #include <mbgl/style/style.hpp> #include <mbgl/style/conversion.hpp> @@ -28,6 +29,7 @@ #include <mbgl/util/run_loop.hpp> #include <mbgl/util/shared_thread_pool.hpp> #include <mbgl/util/traits.hpp> +#include <mbgl/actor/scheduler.hpp> #if QT_VERSION >= 0x050000 #include <QGuiApplication> @@ -361,6 +363,27 @@ void QMapboxGLSettings::setApiBaseUrl(const QString& url) } /*! + Returns resource transformation callback used to transform requested URLs. +*/ +std::function<std::string(const std::string &&)> QMapboxGLSettings::resourceTransform() const +{ + return m_resourceTransform; +} + +/*! + Sets the resource transformation callback. + + When given, resource transformation callback will be used to transform the + requested resource URLs before they are requested from internet. This can be + used add or remove custom parameters, or reroute certain requests to other + servers or endpoints. +*/ +void QMapboxGLSettings::setResourceTransform(const std::function<std::string(const std::string &&)> &transform) +{ + m_resourceTransform = transform; +} + +/*! \class QMapboxGL \brief The QMapboxGL class is a Qt wrapper for the Mapbox GL Native engine. @@ -583,7 +606,7 @@ double QMapboxGL::scale() const void QMapboxGL::setScale(double scale_, const QPointF ¢er) { - d_ptr->mapObj->setZoom(std::log2(scale_), mbgl::ScreenCoordinate { center.x(), center.y() }); + d_ptr->mapObj->setZoom(mbgl::util::log2(scale_), mbgl::ScreenCoordinate { center.x(), center.y() }); } /*! @@ -991,7 +1014,7 @@ void QMapboxGL::moveBy(const QPointF &offset) can be used for implementing a pinch gesture. */ void QMapboxGL::scaleBy(double scale_, const QPointF ¢er) { - d_ptr->mapObj->setZoom(d_ptr->mapObj->getZoom() + std::log2(scale_), mbgl::ScreenCoordinate { center.x(), center.y() }); + d_ptr->mapObj->setZoom(d_ptr->mapObj->getZoom() + mbgl::util::log2(scale_), mbgl::ScreenCoordinate { center.x(), center.y() }); } /*! @@ -1498,13 +1521,25 @@ QMapboxGLPrivate::QMapboxGLPrivate(QMapboxGL *q, const QMapboxGLSettings &settin settings.cacheDatabaseMaximumSize())) , threadPool(mbgl::sharedThreadPool()) { + // Setup resource transform if needed + if (settings.resourceTransform()) { + m_resourceTransform = + std::make_unique< mbgl::Actor<mbgl::ResourceTransform> >( *mbgl::Scheduler::GetCurrent(), + [callback = settings.resourceTransform()] + (mbgl::Resource::Kind , const std::string&& url_) -> std::string { + return callback(std::move(url_)); + } + ); + fileSourceObj->setResourceTransform(m_resourceTransform->self()); + } + // Setup and connect the renderer frontend frontend = std::make_unique<QMapboxGLRendererFrontend>( std::make_unique<mbgl::Renderer>(*this, pixelRatio, *fileSourceObj, *threadPool, static_cast<mbgl::GLContextMode>(settings.contextMode())), *this); connect(frontend.get(), SIGNAL(updated()), this, SLOT(invalidate())); - + mapObj = std::make_unique<mbgl::Map>( *frontend, *this, sanitizedSize(size), @@ -1527,18 +1562,18 @@ QMapboxGLPrivate::~QMapboxGLPrivate() { } -mbgl::Size QMapboxGLPrivate::framebufferSize() const { +mbgl::Size QMapboxGLPrivate::getFramebufferSize() const { return sanitizedSize(fbSize); } void QMapboxGLPrivate::updateAssumedState() { assumeFramebufferBinding(fbObject); - assumeViewport(0, 0, framebufferSize()); + assumeViewport(0, 0, getFramebufferSize()); } void QMapboxGLPrivate::bind() { setFramebufferBinding(fbObject); - setViewport(0, 0, framebufferSize()); + setViewport(0, 0, getFramebufferSize()); } void QMapboxGLPrivate::invalidate() diff --git a/platform/qt/src/qmapboxgl_p.hpp b/platform/qt/src/qmapboxgl_p.hpp index 7b0dd8c192..5e12b44a20 100644 --- a/platform/qt/src/qmapboxgl_p.hpp +++ b/platform/qt/src/qmapboxgl_p.hpp @@ -3,15 +3,19 @@ #include "qmapboxgl.hpp" #include "qmapboxgl_renderer_frontend_p.hpp" +#include <mbgl/actor/actor.hpp> #include <mbgl/map/map.hpp> #include <mbgl/renderer/renderer_backend.hpp> #include <mbgl/util/default_thread_pool.hpp> #include <mbgl/storage/default_file_source.hpp> #include <mbgl/util/geo.hpp> +#include <mbgl/storage/resource_transform.hpp> #include <QObject> #include <QSize> +#include <memory> + class QMapboxGLPrivate : public QObject, public mbgl::RendererBackend, public mbgl::MapObserver { Q_OBJECT @@ -20,10 +24,10 @@ public: explicit QMapboxGLPrivate(QMapboxGL *, const QMapboxGLSettings &, const QSize &size, qreal pixelRatio); virtual ~QMapboxGLPrivate(); - mbgl::Size framebufferSize() const; // mbgl::RendererBackend implementation. void bind() final; + mbgl::Size getFramebufferSize() const final; void updateAssumedState() final; void activate() final {} void deactivate() final {} @@ -68,4 +72,7 @@ signals: void needsRendering(); void mapChanged(QMapboxGL::MapChange); void copyrightsChanged(const QString ©rightsHtml); + +private: + std::unique_ptr< mbgl::Actor<mbgl::ResourceTransform> > m_resourceTransform; }; diff --git a/platform/qt/src/run_loop.cpp b/platform/qt/src/run_loop.cpp index c44f284852..71ea19032a 100644 --- a/platform/qt/src/run_loop.cpp +++ b/platform/qt/src/run_loop.cpp @@ -1,6 +1,6 @@ #include "run_loop_impl.hpp" -#include <mbgl/util/thread_local.hpp> +#include <mbgl/actor/scheduler.hpp> #include <QCoreApplication> @@ -8,13 +8,6 @@ #include <functional> #include <utility> -namespace { - -using namespace mbgl::util; -static ThreadLocal<RunLoop>& current = *new ThreadLocal<RunLoop>; - -} - namespace mbgl { namespace util { @@ -27,7 +20,8 @@ void RunLoop::Impl::onWriteEvent(int fd) { } RunLoop* RunLoop::Get() { - return current.get(); + assert(static_cast<RunLoop*>(Scheduler::GetCurrent())); + return static_cast<RunLoop*>(Scheduler::GetCurrent()); } RunLoop::RunLoop(Type type) : impl(std::make_unique<Impl>()) { @@ -42,14 +36,14 @@ RunLoop::RunLoop(Type type) : impl(std::make_unique<Impl>()) { impl->type = type; - current.set(this); + Scheduler::SetCurrent(this); impl->async = std::make_unique<AsyncTask>(std::bind(&RunLoop::process, this)); } RunLoop::~RunLoop() { MBGL_VERIFY_THREAD(tid); - current.set(nullptr); + Scheduler::SetCurrent(nullptr); } LOOP_HANDLE RunLoop::getLoopHandle() { diff --git a/platform/qt/src/sqlite3.cpp b/platform/qt/src/sqlite3.cpp index 0cd78d85ce..7d47ae552b 100644 --- a/platform/qt/src/sqlite3.cpp +++ b/platform/qt/src/sqlite3.cpp @@ -312,6 +312,7 @@ bool Statement::run() { return impl->query.next(); } +template bool Statement::get(int); template int Statement::get(int); template int64_t Statement::get(int); template double Statement::get(int); diff --git a/platform/qt/src/thread_local.cpp b/platform/qt/src/thread_local.cpp index bf2103c98f..467bfb0d05 100644 --- a/platform/qt/src/thread_local.cpp +++ b/platform/qt/src/thread_local.cpp @@ -1,6 +1,6 @@ #include <mbgl/util/thread_local.hpp> -#include <mbgl/util/run_loop.hpp> +#include <mbgl/actor/scheduler.hpp> #include <mbgl/renderer/backend_scope.hpp> #include <array> @@ -41,7 +41,7 @@ void ThreadLocal<T>::set(T* ptr) { impl->local.localData()[0] = ptr; } -template class ThreadLocal<RunLoop>; +template class ThreadLocal<Scheduler>; template class ThreadLocal<BackendScope>; template class ThreadLocal<int>; // For unit tests diff --git a/platform/qt/test/qmapboxgl.cpp b/platform/qt/test/qmapboxgl.cpp deleted file mode 100644 index 747f8796fa..0000000000 --- a/platform/qt/test/qmapboxgl.cpp +++ /dev/null @@ -1,99 +0,0 @@ -#include <mbgl/test/util.hpp> -#include <mbgl/util/io.hpp> - -#include <QApplication> -#include <QMapbox> -#include <QMapboxGL> - -// We're using QGLFramebufferObject, which is only available in Qt 5 and up. -#if QT_VERSION >= 0x050000 - -#include <QGLWidget> -#include <QGLFramebufferObject> - -class QMapboxGLTest : public QObject, public ::testing::Test { - Q_OBJECT - -public: - QMapboxGLTest() : size(512, 512), fbo((assert(widget.context()->isValid()), widget.makeCurrent(), size)), map(nullptr, settings, size) { - connect(&map, SIGNAL(mapChanged(QMapboxGL::MapChange)), - this, SLOT(onMapChanged(QMapboxGL::MapChange))); - connect(&map, SIGNAL(needsRendering()), - this, SLOT(onNeedsRendering())); - map.resize(fbo.size(), fbo.size()); - map.setFramebufferObject(fbo.handle()); - map.setCoordinateZoom(QMapbox::Coordinate(60.170448, 24.942046), 14); - } - - void runUntil(QMapboxGL::MapChange status) { - changeCallback = [&](QMapboxGL::MapChange change) { - if (change == status) { - qApp->exit(); - changeCallback = nullptr; - } - }; - - qApp->exec(); - } - -private: - QGLWidget widget; - const QSize size; - QGLFramebufferObject fbo; - -protected: - QMapboxGLSettings settings; - QMapboxGL map; - - std::function<void(QMapboxGL::MapChange)> changeCallback; - -private slots: - void onMapChanged(QMapboxGL::MapChange change) { - if (changeCallback) { - changeCallback(change); - } - }; - - void onNeedsRendering() { - widget.makeCurrent(); - fbo.bind(); - glViewport(0, 0, fbo.width(), fbo.height()); - map.render(); - }; -}; - -TEST_F(QMapboxGLTest, TEST_DISABLED_ON_CI(styleJson)) { - QString json = QString::fromStdString( - mbgl::util::read_file("test/fixtures/resources/style_vector.json")); - - map.setStyleJson(json); - ASSERT_EQ(map.styleJson(), json); - runUntil(QMapboxGL::MapChangeDidFinishLoadingMap); - - map.setStyleJson("invalid json"); - runUntil(QMapboxGL::MapChangeDidFailLoadingMap); - - map.setStyleJson("\"\""); - runUntil(QMapboxGL::MapChangeDidFailLoadingMap); - - map.setStyleJson(QString()); - runUntil(QMapboxGL::MapChangeDidFailLoadingMap); -} - -TEST_F(QMapboxGLTest, TEST_DISABLED_ON_CI(styleUrl)) { - QString url(QMapbox::defaultStyles()[0].first); - - map.setStyleUrl(url); - ASSERT_EQ(map.styleUrl(), url); - runUntil(QMapboxGL::MapChangeDidFinishLoadingMap); - - map.setStyleUrl("invalid://url"); - runUntil(QMapboxGL::MapChangeDidFailLoadingMap); - - map.setStyleUrl(QString()); - runUntil(QMapboxGL::MapChangeDidFailLoadingMap); -} - -#include "qmapboxgl.moc" - -#endif diff --git a/platform/qt/test/qmapboxgl.test.cpp b/platform/qt/test/qmapboxgl.test.cpp new file mode 100644 index 0000000000..c6ae3ed403 --- /dev/null +++ b/platform/qt/test/qmapboxgl.test.cpp @@ -0,0 +1,77 @@ +#include "qmapboxgl.test.hpp" + +#include <mbgl/util/io.hpp> + +#include <QMapbox> + +// We're using QGLFramebufferObject, which is only available in Qt 5 and up. +#if QT_VERSION >= 0x050000 + +QMapboxGLTest::QMapboxGLTest() : size(512, 512), fbo((assert(widget.context()->isValid()), widget.makeCurrent(), size)), map(nullptr, settings, size) { + connect(&map, SIGNAL(mapChanged(QMapboxGL::MapChange)), + this, SLOT(onMapChanged(QMapboxGL::MapChange))); + connect(&map, SIGNAL(needsRendering()), + this, SLOT(onNeedsRendering())); + map.resize(fbo.size(), fbo.size()); + map.setFramebufferObject(fbo.handle()); + map.setCoordinateZoom(QMapbox::Coordinate(60.170448, 24.942046), 14); +} + +void QMapboxGLTest::runUntil(QMapboxGL::MapChange status) { + changeCallback = [&](QMapboxGL::MapChange change) { + if (change == status) { + qApp->exit(); + changeCallback = nullptr; + } + }; + + qApp->exec(); +} + +void QMapboxGLTest::onMapChanged(QMapboxGL::MapChange change) { + if (changeCallback) { + changeCallback(change); + } +} + +void QMapboxGLTest::onNeedsRendering() { + widget.makeCurrent(); + fbo.bind(); + glViewport(0, 0, fbo.width(), fbo.height()); + map.render(); +} + + +TEST_F(QMapboxGLTest, TEST_DISABLED_ON_CI(styleJson)) { + QString json = QString::fromStdString( + mbgl::util::read_file("test/fixtures/resources/style_vector.json")); + + map.setStyleJson(json); + ASSERT_EQ(map.styleJson(), json); + runUntil(QMapboxGL::MapChangeDidFinishLoadingMap); + + map.setStyleJson("invalid json"); + runUntil(QMapboxGL::MapChangeDidFailLoadingMap); + + map.setStyleJson("\"\""); + runUntil(QMapboxGL::MapChangeDidFailLoadingMap); + + map.setStyleJson(QString()); + runUntil(QMapboxGL::MapChangeDidFailLoadingMap); +} + +TEST_F(QMapboxGLTest, TEST_DISABLED_ON_CI(styleUrl)) { + QString url(QMapbox::defaultStyles()[0].first); + + map.setStyleUrl(url); + ASSERT_EQ(map.styleUrl(), url); + runUntil(QMapboxGL::MapChangeDidFinishLoadingMap); + + map.setStyleUrl("invalid://url"); + runUntil(QMapboxGL::MapChangeDidFailLoadingMap); + + map.setStyleUrl(QString()); + runUntil(QMapboxGL::MapChangeDidFailLoadingMap); +} + +#endif diff --git a/platform/qt/test/qmapboxgl.test.hpp b/platform/qt/test/qmapboxgl.test.hpp new file mode 100644 index 0000000000..04d63610ca --- /dev/null +++ b/platform/qt/test/qmapboxgl.test.hpp @@ -0,0 +1,36 @@ +#include <mbgl/test/util.hpp> + +#include <QApplication> +#include <QMapboxGL> + +// We're using QGLFramebufferObject, which is only available in Qt 5 and up. +#if QT_VERSION >= 0x050000 + +#include <QGLWidget> +#include <QGLFramebufferObject> + +class QMapboxGLTest : public QObject, public ::testing::Test { + Q_OBJECT + +public: + QMapboxGLTest(); + + void runUntil(QMapboxGL::MapChange); + +private: + QGLWidget widget; + const QSize size; + QGLFramebufferObject fbo; + +protected: + QMapboxGLSettings settings; + QMapboxGL map; + + std::function<void(QMapboxGL::MapChange)> changeCallback; + +private slots: + void onMapChanged(QMapboxGL::MapChange); + void onNeedsRendering(); +}; + +#endif |