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