diff --git a/data/maps/earth/srtm/srtm.dgml b/data/maps/earth/srtm/srtm.dgml --- a/data/maps/earth/srtm/srtm.dgml +++ b/data/maps/earth/srtm/srtm.dgml @@ -63,12 +63,10 @@ naturalearth/ne_50m_lakes.pn2 - naturalearth/ne_50m_glaciated_areas.pn2 - diff --git a/src/lib/marble/FileLoader.h b/src/lib/marble/FileLoader.h --- a/src/lib/marble/FileLoader.h +++ b/src/lib/marble/FileLoader.h @@ -26,8 +26,8 @@ { Q_OBJECT public: - FileLoader(QObject* parent, const PluginManager *pluginManager, bool recenter, - const QString& file, const QString& property, const GeoDataStyle::Ptr &style, DocumentRole role ); + FileLoader(QObject* parent, const PluginManager *pluginManager, bool recenter, const QString& file, + const QString& property, const GeoDataStyle::Ptr &style, DocumentRole role, int renderOrder ); FileLoader( QObject* parent, const PluginManager *pluginManager, const QString& contents, const QString& name, DocumentRole role ); virtual ~FileLoader(); diff --git a/src/lib/marble/FileLoader.cpp b/src/lib/marble/FileLoader.cpp --- a/src/lib/marble/FileLoader.cpp +++ b/src/lib/marble/FileLoader.cpp @@ -25,6 +25,7 @@ #include "GeoDataStyleMap.h" #include "GeoDataPolyStyle.h" #include "GeoDataLineStyle.h" +#include "GeoDataPolygon.h" #include "GeoDataStyle.h" #include "GeoDataTypes.h" #include "MarbleDirs.h" @@ -39,7 +40,7 @@ { public: FileLoaderPrivate( FileLoader* parent, const PluginManager *pluginManager, bool recenter, - const QString& file, const QString& property, const GeoDataStyle::Ptr &style, DocumentRole role ) + const QString& file, const QString& property, const GeoDataStyle::Ptr &style, DocumentRole role, int renderOrder ) : q( parent), m_runner( pluginManager ), m_recenter( recenter ), @@ -48,7 +49,8 @@ m_style( style ), m_documentRole ( role ), m_styleMap( new GeoDataStyleMap ), - m_document( 0 ) + m_document( 0 ), + m_renderOrder( renderOrder ) { if( m_style ) { m_styleMap->setId("default-map"); @@ -92,12 +94,13 @@ GeoDataStyleMap* m_styleMap; GeoDataDocument *m_document; QString m_error; + int m_renderOrder; }; -FileLoader::FileLoader( QObject* parent, const PluginManager *pluginManager, bool recenter, - const QString& file, const QString& property, const GeoDataStyle::Ptr &style, DocumentRole role ) +FileLoader::FileLoader( QObject* parent, const PluginManager *pluginManager, bool recenter, const QString& file, + const QString& property, const GeoDataStyle::Ptr &style, DocumentRole role, int renderOrder ) : QThread( parent ), - d( new FileLoaderPrivate( this, pluginManager, recenter, file, property, style, role ) ) + d( new FileLoaderPrivate( this, pluginManager, recenter, file, property, style, role, renderOrder ) ) { } @@ -220,6 +223,15 @@ doc->addStyle( m_style ); } + if (m_renderOrder != 0) { + foreach (GeoDataPlacemark* placemark, doc->placemarkList()) { + if (placemark->geometry() && placemark->geometry()->nodeType() == GeoDataTypes::GeoDataPolygonType) { + GeoDataPolygon *polygon = static_cast(placemark->geometry()); + polygon->setRenderOrder(m_renderOrder); + } + } + } + createFilterProperties( doc ); emit q->newGeoDataDocumentAdded( m_document ); } diff --git a/src/lib/marble/FileManager.h b/src/lib/marble/FileManager.h --- a/src/lib/marble/FileManager.h +++ b/src/lib/marble/FileManager.h @@ -54,7 +54,7 @@ /** * Loads a new file into the manager. */ - void addFile(const QString &fileName, const QString &property, const GeoDataStyle::Ptr &style, DocumentRole role, bool recenter = false ); + void addFile(const QString &fileName, const QString &property, const GeoDataStyle::Ptr &style, DocumentRole role, int renderOrder = 0, bool recenter = false ); /** diff --git a/src/lib/marble/FileManager.cpp b/src/lib/marble/FileManager.cpp --- a/src/lib/marble/FileManager.cpp +++ b/src/lib/marble/FileManager.cpp @@ -78,7 +78,7 @@ delete d; } -void FileManager::addFile( const QString& filepath, const QString& property, const GeoDataStyle::Ptr &style, DocumentRole role, bool recenter ) +void FileManager::addFile( const QString& filepath, const QString& property, const GeoDataStyle::Ptr &style, DocumentRole role, int renderOrder, bool recenter ) { if( d->m_fileItemHash.contains( filepath ) ) { return; // already loaded @@ -92,7 +92,7 @@ mDebug() << "adding container:" << filepath; mDebug() << "Starting placemark loading timer"; d->m_timer.start(); - FileLoader* loader = new FileLoader( this, d->m_pluginManager, recenter, filepath, property, style, role ); + FileLoader* loader = new FileLoader( this, d->m_pluginManager, recenter, filepath, property, style, role, renderOrder ); d->appendLoader( loader ); } diff --git a/src/lib/marble/MarbleModel.cpp b/src/lib/marble/MarbleModel.cpp --- a/src/lib/marble/MarbleModel.cpp +++ b/src/lib/marble/MarbleModel.cpp @@ -339,6 +339,7 @@ QStringList fileList; QStringList propertyList; QList styleList; + QList renderOrderList; bool skip = false; bool sourceFileMatch = false; @@ -379,6 +380,7 @@ QPen pen = data->pen(); QBrush brush = data->brush(); GeoDataStyle::Ptr style; + int renderOrder = data->renderOrder(); /** * data->colors() are the colorMap values from dgml file. If this is not @@ -418,6 +420,7 @@ fileList << filename; propertyList << property; styleList << style; + renderOrderList << renderOrder; } } } @@ -427,7 +430,7 @@ } // load new datasets for ( int i = 0 ; i < fileList.size(); ++i ) { - d->m_fileManager.addFile( fileList.at(i), propertyList.at(i), styleList.at(i), MapDocument ); + d->m_fileManager.addFile( fileList.at(i), propertyList.at(i), styleList.at(i), MapDocument, renderOrderList.at(i) ); } mDebug() << "THEME CHANGED: ***" << mapTheme->head()->mapThemeId(); diff --git a/src/lib/marble/geodata/CMakeLists.txt b/src/lib/marble/geodata/CMakeLists.txt --- a/src/lib/marble/geodata/CMakeLists.txt +++ b/src/lib/marble/geodata/CMakeLists.txt @@ -191,6 +191,8 @@ geodata/handlers/dgml/DgmlSettingsTagHandler.cpp geodata/handlers/dgml/DgmlAuxillaryDictionary.h geodata/handlers/dgml/DgmlLayerTagHandler.h + geodata/handlers/dgml/DgmlRenderOrderTagHandler.cpp + geodata/handlers/dgml/DgmlRenderOrderTagHandler.h ) SET ( geodata_writers_dgml_SRCS diff --git a/src/lib/marble/geodata/data/GeoDataDocument.h b/src/lib/marble/geodata/data/GeoDataDocument.h --- a/src/lib/marble/geodata/data/GeoDataDocument.h +++ b/src/lib/marble/geodata/data/GeoDataDocument.h @@ -164,7 +164,7 @@ GeoDataStyleMap styleMap( const QString& styleId ) const; /** - * @brief dump a Vector of all styles + * @brief dump a Vector of all stylemaps */ QList styleMaps() const; diff --git a/src/lib/marble/geodata/data/GeoDataPolygon.h b/src/lib/marble/geodata/data/GeoDataPolygon.h --- a/src/lib/marble/geodata/data/GeoDataPolygon.h +++ b/src/lib/marble/geodata/data/GeoDataPolygon.h @@ -6,7 +6,7 @@ // the source code. // // Copyright 2008-2009 Patrick Spendrin -// Copyright 2008 Inge Wallin +// Copyright 2008 Inge Wallin // @@ -217,6 +217,9 @@ */ virtual void unpack( QDataStream& stream ); + int renderOrder() const; + void setRenderOrder(int); + private: GeoDataPolygonPrivate *p(); const GeoDataPolygonPrivate *p() const; diff --git a/src/lib/marble/geodata/data/GeoDataPolygon.cpp b/src/lib/marble/geodata/data/GeoDataPolygon.cpp --- a/src/lib/marble/geodata/data/GeoDataPolygon.cpp +++ b/src/lib/marble/geodata/data/GeoDataPolygon.cpp @@ -158,6 +158,15 @@ p()->inner.append( boundary ); } +void GeoDataPolygon::setRenderOrder(int renderOrder){ + detach(); + p()->m_renderOrder = renderOrder; +} + +int GeoDataPolygon::renderOrder() const{ + return p()->m_renderOrder; +} + void GeoDataPolygon::pack( QDataStream& stream ) const { GeoDataObject::pack( stream ); diff --git a/src/lib/marble/geodata/data/GeoDataPolygon_p.h b/src/lib/marble/geodata/data/GeoDataPolygon_p.h --- a/src/lib/marble/geodata/data/GeoDataPolygon_p.h +++ b/src/lib/marble/geodata/data/GeoDataPolygon_p.h @@ -55,6 +55,7 @@ // GeoDataPoints since the LatLonAltBox has // been calculated. Saves performance. TessellationFlags m_tessellationFlags; + int m_renderOrder; }; } // namespace Marble diff --git a/src/lib/marble/geodata/handlers/dgml/DgmlElementDictionary.h b/src/lib/marble/geodata/handlers/dgml/DgmlElementDictionary.h --- a/src/lib/marble/geodata/handlers/dgml/DgmlElementDictionary.h +++ b/src/lib/marble/geodata/handlers/dgml/DgmlElementDictionary.h @@ -79,6 +79,7 @@ extern const char* dgmlTag_Vectortile; extern const char* dgmlTag_Visible; extern const char* dgmlTag_Zoom; + extern const char* dgmlTag_RenderOrder; } // Helper macro diff --git a/src/lib/marble/geodata/handlers/dgml/DgmlElementDictionary.cpp b/src/lib/marble/geodata/handlers/dgml/DgmlElementDictionary.cpp --- a/src/lib/marble/geodata/handlers/dgml/DgmlElementDictionary.cpp +++ b/src/lib/marble/geodata/handlers/dgml/DgmlElementDictionary.cpp @@ -76,5 +76,6 @@ const char* dgmlTag_Vectortile = "vectortile"; const char* dgmlTag_Visible = "visible"; const char* dgmlTag_Zoom = "zoom"; +const char* dgmlTag_RenderOrder = "renderOrder"; } } diff --git a/src/lib/marble/geodata/handlers/dgml/DgmlRenderOrderTagHandler.h b/src/lib/marble/geodata/handlers/dgml/DgmlRenderOrderTagHandler.h new file mode 100644 --- /dev/null +++ b/src/lib/marble/geodata/handlers/dgml/DgmlRenderOrderTagHandler.h @@ -0,0 +1,30 @@ +// +// This file is part of the Marble Virtual Globe. +// +// This program is free software licensed under the GNU LGPL. You can +// find a copy of this license in LICENSE.txt in the top directory of +// the source code. +// +// Copyright 2016 Sanjiban Bairagya +// + +#ifndef MARBLE_DGMLRENDERORDERTAGHANDLER_H +#define MARBLE_DGMLRENDERORDERTAGHANDLER_H + +#include "GeoTagHandler.h" + +namespace Marble +{ +namespace dgml +{ + +class DgmlRenderOrderTagHandler : public GeoTagHandler +{ +public: + virtual GeoNode* parse(GeoParser&) const; +}; + +} +} + +#endif diff --git a/src/lib/marble/geodata/handlers/dgml/DgmlRenderOrderTagHandler.cpp b/src/lib/marble/geodata/handlers/dgml/DgmlRenderOrderTagHandler.cpp new file mode 100644 --- /dev/null +++ b/src/lib/marble/geodata/handlers/dgml/DgmlRenderOrderTagHandler.cpp @@ -0,0 +1,42 @@ +// +// This file is part of the Marble Virtual Globe. +// +// This program is free software licensed under the GNU LGPL. You can +// find a copy of this license in LICENSE.txt in the top directory of +// the source code. +// +// Copyright 2016 Sanjiban Bairagya +// + +#include "DgmlRenderOrderTagHandler.h" + +#include "DgmlElementDictionary.h" +#include "DgmlAttributeDictionary.h" +#include "GeoParser.h" +#include "GeoSceneGeodata.h" + +namespace Marble +{ +namespace dgml +{ +DGML_DEFINE_TAG_HANDLER(RenderOrder) + +GeoNode* DgmlRenderOrderTagHandler::parse(GeoParser& parser) const +{ + // Check whether the tag is valid + Q_ASSERT(parser.isStartElement() && parser.isValidElement(dgmlTag_RenderOrder)); + + // Checking for parent item + GeoStackItem parentItem = parser.parentElement(); + if ( parentItem.represents( dgmlTag_Vector ) + || parentItem.represents( dgmlTag_Geodata ) ) { + GeoSceneGeodata *dataSource = 0; + dataSource = parentItem.nodeAs(); + dataSource->setRenderOrder( parser.readElementText().trimmed().toInt() ); + } + + return 0; +} + +} +} diff --git a/src/lib/marble/geodata/scene/GeoSceneGeodata.h b/src/lib/marble/geodata/scene/GeoSceneGeodata.h --- a/src/lib/marble/geodata/scene/GeoSceneGeodata.h +++ b/src/lib/marble/geodata/scene/GeoSceneGeodata.h @@ -48,6 +48,9 @@ QBrush brush() const; void setBrush( const QBrush& brush ); + int renderOrder() const; + void setRenderOrder( int renderOrder ); + QList colors() const; void setColors( const QList &colors ); @@ -58,6 +61,7 @@ qreal m_alpha; QPen m_pen; QBrush m_brush; + int m_renderOrder; QList m_colors; }; diff --git a/src/lib/marble/geodata/scene/GeoSceneGeodata.cpp b/src/lib/marble/geodata/scene/GeoSceneGeodata.cpp --- a/src/lib/marble/geodata/scene/GeoSceneGeodata.cpp +++ b/src/lib/marble/geodata/scene/GeoSceneGeodata.cpp @@ -20,7 +20,8 @@ m_sourceFile( QString() ), m_alpha( 1.0 ), m_pen( QPen( Qt::NoPen ) ), - m_brush( QBrush( Qt::transparent ) ) + m_brush( QBrush( Qt::transparent ) ), + m_renderOrder( 0 ) { } @@ -100,6 +101,16 @@ m_brush = brush; } +int GeoSceneGeodata::renderOrder() const +{ + return m_renderOrder; +} + +void GeoSceneGeodata::setRenderOrder( int renderOrder ) +{ + m_renderOrder = renderOrder; +} + QList GeoSceneGeodata::colors() const { return m_colors; diff --git a/src/lib/marble/layers/GeometryLayer.cpp b/src/lib/marble/layers/GeometryLayer.cpp --- a/src/lib/marble/layers/GeometryLayer.cpp +++ b/src/lib/marble/layers/GeometryLayer.cpp @@ -453,6 +453,7 @@ const GeoDataPolygon *poly = static_cast( object ); item = new GeoPolygonGraphicsItem( placemark, poly ); + item->setZValue(poly->renderOrder()); } else if ( object->nodeType() == GeoDataTypes::GeoDataMultiGeometryType ) {