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:
2025-03-18 12:16:10 +03:00
parent bf11ca21c0
commit 347104d512
14 changed files with 494 additions and 150 deletions

View 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();
}
}