From ada4ed2a986a637ea2007dc8560d7d6da92a2acb Mon Sep 17 00:00:00 2001 From: Oliver Eichler Date: Fri, 15 Sep 2023 10:43:37 +0200 Subject: [PATCH] [QMS-547] Fixed: QMS freezes on zoom when activating multi-layered online maps --- changelog.txt | 4 +++- src/qmapshack/map/CMapTMS.cpp | 23 ++++++++++++----------- src/qmapshack/map/CMapWMTS.cpp | 23 ++++++++++++----------- src/qmapshack/map/IMapOnline.h | 15 +++++++-------- 4 files changed, 34 insertions(+), 31 deletions(-) diff --git a/changelog.txt b/changelog.txt index 706a8e026..f8ba2f5c6 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,7 @@ +V1.XX.X +[QMS-547] Fixed: QMS freezes on zoom when activating multi-layered online maps [QMS-622] Update BRouter setup (install from github) -[QMS-623] remove use of QTimer in brouter startup error detection +[QMS-623] remove use of QTimer in BRouter startup error detection [QMS-630] BRouter on-the-fly routing cannot be canceled V1.17.0 diff --git a/src/qmapshack/map/CMapTMS.cpp b/src/qmapshack/map/CMapTMS.cpp index fbefbc470..78046e034 100644 --- a/src/qmapshack/map/CMapTMS.cpp +++ b/src/qmapshack/map/CMapTMS.cpp @@ -151,21 +151,22 @@ CMapTMS::CMapTMS(const QString& filename, CMapDraw* parent) : IMapOnline(parent) void CMapTMS::getLayers(QListWidget& list) /* override */ { - QMutexLocker lock(&mutex); - - list.clear(); - if (layers.size() < 2) { + if (!mutex.tryLock(100)) { return; } - int i = 0; - for (const layer_t& layer : qAsConst(layers)) { - QListWidgetItem* item = new QListWidgetItem(layer.title, &list); - item->setCheckState(layer.enabled ? Qt::Checked : Qt::Unchecked); - item->setData(Qt::UserRole, i++); - } + list.clear(); + if (layers.size() > 1) { + int i = 0; + for (const layer_t& layer : qAsConst(layers)) { + QListWidgetItem* item = new QListWidgetItem(layer.title, &list); + item->setCheckState(layer.enabled ? Qt::Checked : Qt::Unchecked); + item->setData(Qt::UserRole, i++); + } - connect(&list, &QListWidget::itemChanged, this, &CMapTMS::slotLayersChanged); + connect(&list, &QListWidget::itemChanged, this, &CMapTMS::slotLayersChanged); + } + mutex.unlock(); } void CMapTMS::saveConfig(QSettings& cfg) /* override */ diff --git a/src/qmapshack/map/CMapWMTS.cpp b/src/qmapshack/map/CMapWMTS.cpp index 718c58628..89e973ac4 100644 --- a/src/qmapshack/map/CMapWMTS.cpp +++ b/src/qmapshack/map/CMapWMTS.cpp @@ -251,21 +251,22 @@ CMapWMTS::CMapWMTS(const QString& filename, CMapDraw* parent) : IMapOnline(paren } void CMapWMTS::getLayers(QListWidget& list) { - QMutexLocker lock(&mutex); - - list.clear(); - if (layers.size() < 2) { + if (!mutex.tryLock(100)) { return; } - int i = 0; - for (const layer_t& layer : qAsConst(layers)) { - QListWidgetItem* item = new QListWidgetItem(layer.title, &list); - item->setCheckState(layer.enabled ? Qt::Checked : Qt::Unchecked); - item->setData(Qt::UserRole, i++); - } + list.clear(); + if (layers.size() > 1) { + int i = 0; + for (const layer_t& layer : qAsConst(layers)) { + QListWidgetItem* item = new QListWidgetItem(layer.title, &list); + item->setCheckState(layer.enabled ? Qt::Checked : Qt::Unchecked); + item->setData(Qt::UserRole, i++); + } - connect(&list, &QListWidget::itemChanged, this, &CMapWMTS::slotLayersChanged); + connect(&list, &QListWidget::itemChanged, this, &CMapWMTS::slotLayersChanged); + } + mutex.unlock(); } void CMapWMTS::saveConfig(QSettings& cfg) /* override */ diff --git a/src/qmapshack/map/IMapOnline.h b/src/qmapshack/map/IMapOnline.h index dbd36e4e7..c05e94bbc 100644 --- a/src/qmapshack/map/IMapOnline.h +++ b/src/qmapshack/map/IMapOnline.h @@ -31,7 +31,14 @@ class QNetworkReply; class IMapOnline : public IMap { Q_OBJECT + public: + IMapOnline(CMapDraw* parent); + virtual ~IMapOnline() {} + + signals: + void sigQueueChanged(); + protected: struct rawHeaderItem_t { QString name; QString value; @@ -39,10 +46,6 @@ class IMapOnline : public IMap { QList rawHeaderItems; - signals: - void sigQueueChanged(); - - protected: /// Mutex to control access to url queue QRecursiveMutex mutex; /// a queue with all tile urls to request @@ -68,12 +71,8 @@ class IMapOnline : public IMap { void configureCache() override; - public: void slotQueueChanged(); void slotRequestFinished(QNetworkReply* reply); - - IMapOnline(CMapDraw* parent); - virtual ~IMapOnline() {} }; #endif // IMAPONLINE_H