QAD::Map:
* add MapViewTileProviderBase - base class for tile server provider * migrate OSM to new class * add MapTiler provider * add offlineMode for MapView
This commit is contained in:
90
libs/map/mapview_tile_downloader.cpp
Normal file
90
libs/map/mapview_tile_downloader.cpp
Normal file
@@ -0,0 +1,90 @@
|
||||
#include "mapview.h"
|
||||
#include "mapview_tile_cache_p.h"
|
||||
#include "mapview_tile_downloader_p.h"
|
||||
|
||||
|
||||
MapViewTileDownloader::MapViewTileDownloader(MapView * p): QThread() {
|
||||
qRegisterMetaType<OSM::TileIndex>();
|
||||
parent = p;
|
||||
start();
|
||||
}
|
||||
|
||||
|
||||
MapViewTileDownloader::~MapViewTileDownloader() {
|
||||
requestInterruption();
|
||||
cond.wakeAll();
|
||||
wait();
|
||||
if (provider) provider->deleteLater();
|
||||
}
|
||||
|
||||
|
||||
bool MapViewTileDownloader::queueTile(OSM::TileIndex index, bool force) {
|
||||
// auto hash = tile.hash();
|
||||
bool ret = false;
|
||||
cond_mutex.lock();
|
||||
if ((!queue.contains(index) && !in_progress.contains(index.hash())) || force) {
|
||||
queue.enqueue(index);
|
||||
cond.wakeOne();
|
||||
ret = true;
|
||||
}
|
||||
cond_mutex.unlock();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void MapViewTileDownloader::queueTiles(QList<OSM::TileIndex> indeces) {
|
||||
cond_mutex.lock();
|
||||
queue << indeces;
|
||||
cond.wakeOne();
|
||||
cond_mutex.unlock();
|
||||
}
|
||||
|
||||
|
||||
void MapViewTileDownloader::clearQueue() {
|
||||
cond_mutex.lock();
|
||||
queue.clear();
|
||||
cond_mutex.unlock();
|
||||
}
|
||||
|
||||
|
||||
void MapViewTileDownloader::setTileProvider(MapViewTileProviderBase * p) {
|
||||
if (provider) {
|
||||
disconnect(provider, &MapViewTileProviderBase::tileReady, this, &MapViewTileDownloader::tileReady);
|
||||
provider->deleteLater();
|
||||
}
|
||||
provider = p;
|
||||
if (provider) {
|
||||
connect(provider, &MapViewTileProviderBase::tileReady, this, &MapViewTileDownloader::tileReady);
|
||||
}
|
||||
parent->cache->tileProviderChanged();
|
||||
}
|
||||
|
||||
|
||||
void MapViewTileDownloader::requestTile(OSM::TileIndex index) {
|
||||
if (!provider) return;
|
||||
provider->requestTile(index);
|
||||
}
|
||||
|
||||
|
||||
void MapViewTileDownloader::tileReady(OSM::TileIndex index, QPixmap pm) {
|
||||
if (!pm.isNull()) parent->cache->tileDownloaded(index, pm);
|
||||
cond_mutex.lock();
|
||||
in_progress.remove(index.hash());
|
||||
cond_mutex.unlock();
|
||||
emit tileDone();
|
||||
}
|
||||
|
||||
|
||||
void MapViewTileDownloader::run() {
|
||||
while (!isInterruptionRequested()) {
|
||||
cond_mutex.lock();
|
||||
if (queue.isEmpty())
|
||||
cond.wait(&cond_mutex);
|
||||
else {
|
||||
auto t = queue.dequeue();
|
||||
in_progress.insert(t.hash());
|
||||
QMetaObject::invokeMethod(parent, [this, t]() { requestTile(t); }, Qt::QueuedConnection);
|
||||
}
|
||||
cond_mutex.unlock();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user