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 )
{