1 /**************************************************************************** 2 ** 3 ** Copyright (C) 2016 The Qt Company Ltd. 4 ** Contact: https://www.qt.io/licensing/ 5 ** 6 ** This file is part of the test suite of the Qt Toolkit. 7 ** 8 ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ 9 ** Commercial License Usage 10 ** Licensees holding valid commercial Qt licenses may use this file in 11 ** accordance with the commercial license agreement provided with the 12 ** Software or, alternatively, in accordance with the terms contained in 13 ** a written agreement between you and The Qt Company. For licensing terms 14 ** and conditions see https://www.qt.io/terms-conditions. For further 15 ** information use the contact form at https://www.qt.io/contact-us. 16 ** 17 ** GNU General Public License Usage 18 ** Alternatively, this file may be used under the terms of the GNU 19 ** General Public License version 3 as published by the Free Software 20 ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT 21 ** included in the packaging of this file. Please review the following 22 ** information to ensure the GNU General Public License requirements will 23 ** be met: https://www.gnu.org/licenses/gpl-3.0.html. 24 ** 25 ** $QT_END_LICENSE$ 26 ** 27 ****************************************************************************/ 28 29 #ifndef QGEOTILEFETCHER_TEST_H 30 #define QGEOTILEFETCHER_TEST_H 31 32 #include <QtLocation/private/qgeotiledmapreply_p.h> 33 #include <QtLocation/private/qgeotilefetcher_p.h> 34 #include <QtLocation/private/qgeotilespec_p.h> 35 #include <QtLocation/private/qgeomappingmanagerengine_p.h> 36 37 #include <QLocale> 38 #include <QPainter> 39 #include <QPixmap> 40 #include <QByteArray> 41 #include <QBuffer> 42 #include <QTimer> 43 #include <QDebug> 44 #include <QTimerEvent> 45 #include <QVariant> 46 47 QT_USE_NAMESPACE 48 49 class TiledMapReplyTest :public QGeoTiledMapReply 50 { 51 Q_OBJECT 52 public: QGeoTiledMapReply(spec,parent)53 TiledMapReplyTest(const QGeoTileSpec &spec, QObject *parent=0): QGeoTiledMapReply (spec, parent) {} callSetError(Error error,const QString & errorString)54 void callSetError ( Error error, const QString & errorString ) {setError(error, errorString);} callSetFinished(bool finished)55 void callSetFinished ( bool finished ) { setFinished(finished);} callSetCached(bool cached)56 void callSetCached(bool cached) { setFinished(cached);} callSetMapImageData(const QByteArray & data)57 void callSetMapImageData(const QByteArray &data) { setMapImageData(data); } callSetMapImageFormat(const QString & format)58 void callSetMapImageFormat(const QString &format) { setMapImageFormat(format); } abort()59 void abort() { emit aborted(); } 60 61 Q_SIGNALS: 62 void aborted(); 63 }; 64 65 class QGeoTileFetcherTest: public QGeoTileFetcher 66 { 67 Q_OBJECT 68 public: QGeoTileFetcherTest(QGeoMappingManagerEngine * parent)69 QGeoTileFetcherTest(QGeoMappingManagerEngine *parent) 70 : QGeoTileFetcher(parent), finishRequestImmediately_(false), errorCode_(QGeoTiledMapReply::NoError) 71 { 72 } 73 init()74 bool init() 75 { 76 return true; 77 } 78 getTileImage(const QGeoTileSpec & spec)79 QGeoTiledMapReply* getTileImage(const QGeoTileSpec &spec) 80 { 81 TiledMapReplyTest* mappingReply = new TiledMapReplyTest(spec, this); 82 83 QImage im(256, 256, QImage::Format_RGB888); 84 im.fill(QColor("lightgray")); 85 QRectF rect; 86 QString text("X: " + QString::number(spec.x()) + "\nY: " + QString::number(spec.y()) + "\nZ: " + QString::number(spec.zoom())); 87 rect.setWidth(250); 88 rect.setHeight(250); 89 rect.setLeft(3); 90 rect.setTop(3); 91 QPainter painter; 92 QPen pen(QColor("firebrick")); 93 painter.begin(&im); 94 painter.setPen(pen); 95 painter.setFont( QFont("Times", 35, 10, false)); 96 painter.drawText(rect, text); 97 // different border color for vertically and horizontally adjacent frames 98 if ((spec.x() + spec.y()) % 2 == 0) 99 pen.setColor(QColor("yellow")); 100 pen.setWidth(5); 101 painter.setPen(pen); 102 painter.drawRect(0,0,255,255); 103 painter.end(); 104 QPixmap pm = QPixmap::fromImage(im); 105 QByteArray bytes; 106 QBuffer buffer(&bytes); 107 buffer.open(QIODevice::WriteOnly); 108 pm.save(&buffer, "PNG"); 109 110 mappingReply->callSetMapImageData(bytes); 111 mappingReply->callSetMapImageFormat("png"); 112 113 if (finishRequestImmediately_) { 114 updateRequest(mappingReply); 115 return mappingReply; 116 } else { 117 if (m_queue.isEmpty()) 118 timer_.start(500, this); 119 m_queue.append(mappingReply); 120 } 121 122 return mappingReply; 123 } 124 setFinishRequestImmediately(bool enabled)125 void setFinishRequestImmediately(bool enabled) 126 { 127 finishRequestImmediately_ = enabled; 128 } 129 setTileSize(QSize tileSize)130 void setTileSize(QSize tileSize) 131 { 132 tileSize_ = tileSize; 133 } 134 135 public Q_SLOTS: requestAborted()136 void requestAborted() 137 { 138 timer_.stop(); 139 errorString_.clear(); 140 errorCode_ = QGeoTiledMapReply::NoError; 141 } 142 Q_SIGNALS: 143 void tileFetched(const QGeoTileSpec&); 144 145 protected: updateRequest(TiledMapReplyTest * mappingReply)146 void updateRequest(TiledMapReplyTest* mappingReply) 147 { 148 if (errorCode_) { 149 mappingReply->callSetError(errorCode_, errorString_); 150 emit tileError(mappingReply->tileSpec(), errorString_); 151 } else { 152 mappingReply->callSetError(QGeoTiledMapReply::NoError, "no error"); 153 mappingReply->callSetFinished(true); 154 emit tileFetched(mappingReply->tileSpec()); 155 } 156 } 157 timerEvent(QTimerEvent * event)158 void timerEvent(QTimerEvent *event) 159 { 160 if (event->timerId() != timer_.timerId()) { 161 QGeoTileFetcher::timerEvent(event); 162 return; 163 } 164 updateRequest(m_queue.takeFirst()); 165 if (m_queue.isEmpty()) { 166 timer_.stop(); 167 } 168 } 169 170 private: 171 bool finishRequestImmediately_; 172 QBasicTimer timer_; 173 QGeoTiledMapReply::Error errorCode_; 174 QString errorString_; 175 QSize tileSize_; 176 QList<TiledMapReplyTest*> m_queue; 177 }; 178 179 #endif 180