File indexing completed on 2024-05-12 04:43:21
0001 /* 0002 * Copyright (C) 2015 Radosław Wicik <radoslaw@wicik.pl> 0003 * 0004 * This library is free software; you can redistribute it and/or 0005 * modify it under the terms of the GNU Lesser General Public 0006 * License as published by the Free Software Foundation; either 0007 * version 2.1 of the License, or (at your option) any later version. 0008 * 0009 * This library is distributed in the hope that it will be useful, 0010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 0011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0012 * Lesser General Public License for more details. 0013 * 0014 * You should have received a copy of the GNU Lesser General Public 0015 * License along with this library; if not, write to the Free Software 0016 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 0017 */ 0018 0019 #include "KReportMapRenderer.h" 0020 #include "KReportItemMaps.h" 0021 #include <KReportRenderObjects.h> 0022 0023 #include <marble/MarbleWidget.h> 0024 #include <marble/MarbleGlobal.h> 0025 #include <marble/MarbleModel.h> 0026 #include <marble/HttpDownloadManager.h> 0027 #include <marble/AbstractFloatItem.h> 0028 #include <marble/GeoPainter.h> 0029 0030 #include "kreportplugin_debug.h" 0031 0032 KReportMapRenderer::KReportMapRenderer(QObject* parent) 0033 : QObject(parent) 0034 , m_currentJob(nullptr) 0035 { 0036 m_marble.setMapThemeId(QLatin1String("earth/openstreetmap/openstreetmap.dgml")); 0037 m_marble.setShowOverviewMap(false); 0038 m_marble.setMapQualityForViewContext(Marble::PrintQuality, Marble::Still); 0039 m_marble.setShowCrosshairs(true); 0040 0041 foreach(Marble::AbstractFloatItem* floatItem, m_marble.floatItems()){ 0042 if(floatItem->nameId() == QString(QLatin1String("navigation"))){ 0043 floatItem->setVisible(false); 0044 } 0045 } 0046 0047 connect(m_marble.model()->downloadManager(), &Marble::HttpDownloadManager::progressChanged, this, &KReportMapRenderer::downloadProgres); 0048 connect(&m_marble, &Marble::MarbleMap::renderStatusChanged, this, &KReportMapRenderer::onRenderStatusChange); 0049 connect(&m_retryTimer, &QTimer::timeout, this, &KReportMapRenderer::retryRender); 0050 } 0051 0052 KReportMapRenderer::~KReportMapRenderer() 0053 { 0054 0055 } 0056 0057 void KReportMapRenderer::renderJob(KReportItemMaps* reportItemMaps) 0058 { 0059 m_currentJob = reportItemMaps; 0060 int zoom = m_currentJob->zoom(); 0061 //kreportpluginDebug() << "Map Renderer rendering" << m_currentJob->longtitude() << m_currentJob->latitude(); 0062 0063 m_marble.setMapThemeId(m_currentJob->themeId()); 0064 //some themes enable overview map, and this must be disabled after theme switch. 0065 m_marble.setShowOverviewMap(false); 0066 m_marble.setSize(KReportItemBase::sceneSize(m_currentJob->size()).toSize()); 0067 m_marble.centerOn(m_currentJob->longtitude(), m_currentJob->latitude()); 0068 m_marble.setRadius(pow(M_E, (zoom / 200.0))); 0069 0070 // Create a painter that will do the painting. 0071 Marble::GeoPainter geoPainter( m_currentJob->oroImage()->picture(), m_marble.viewport(), m_marble.mapQuality() ); 0072 m_marble.paint( geoPainter, QRect() ); 0073 0074 if (m_marble.renderStatus() == Marble::Complete) { 0075 m_currentJob->renderFinished(); 0076 } else { 0077 m_retryTimer.start(1000); 0078 } 0079 0080 } 0081 0082 void KReportMapRenderer::onRenderStatusChange(Marble::RenderStatus renderStatus) 0083 { 0084 //kreportpluginDebug() << m_marble.renderStatus() << "|" << renderStatus; 0085 0086 if(m_currentJob){ 0087 /*kreportpluginDebug() 0088 << this 0089 << m_currentJob 0090 << m_currentJob->longtitude() 0091 << m_currentJob->latitude() 0092 << m_currentJob->zoom() 0093 << " | status: " << renderStatus;*/ 0094 0095 if(renderStatus == Marble::Complete){ 0096 m_currentJob->renderFinished(); 0097 } 0098 } 0099 } 0100 0101 void KReportMapRenderer::downloadProgres(int active, int queued) 0102 { 0103 Q_UNUSED(active) 0104 Q_UNUSED(queued) 0105 //if(m_currentJob){ 0106 // kreportpluginDebug() << "job:" << m_currentJob 0107 // << "(" << m_currentJob->latitude() << "," << m_currentJob->longtitude() << ")" 0108 // << "active/queued:" << active << "/" << queued; 0109 //} 0110 } 0111 0112 void KReportMapRenderer::retryRender() 0113 { 0114 //kreportpluginDebug() << "Retrying map render"; 0115 0116 // Create a painter that will do the painting. 0117 Marble::GeoPainter geoPainter( m_currentJob->oroImage()->picture(), m_marble.viewport(), m_marble.mapQuality() ); 0118 m_marble.paint( geoPainter, QRect() ); 0119 0120 if (m_marble.renderStatus() == Marble::Complete) { 0121 m_retryTimer.stop(); 0122 m_currentJob->renderFinished(); 0123 } 0124 } 0125