[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [marble] src: Revert "have polygon and linear ring icons rendered by PlacemarkLayer"
From:       Bernhard Beschow <bbeschow () cs ! tu-berlin ! de>
Date:       2016-10-23 12:21:29
Message-ID: E1byHmL-0004Hu-Od () code ! kde ! org
[Download RAW message or body]

Git commit 91d07d77a3726c7ece10c9d7770fdd7ed0f01797 by Bernhard Beschow.
Committed on 23/10/2016 at 12:08.
Pushed by beschow into branch 'master'.

Revert "have polygon and linear ring icons rendered by PlacemarkLayer"

This reverts commit b1a507ba5d9e2386bc2dd4b2432569910a5e030e.

M  +3    -7    src/lib/marble/geodata/data/GeoDataPlacemark.cpp
M  +44   -1    src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.cpp
M  +2    -0    src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.h
M  +0    -6    src/plugins/runner/osm/OsmWay.cpp

http://commits.kde.org/marble/91d07d77a3726c7ece10c9d7770fdd7ed0f01797

diff --git a/src/lib/marble/geodata/data/GeoDataPlacemark.cpp \
b/src/lib/marble/geodata/data/GeoDataPlacemark.cpp index ad7cbe4..5ccca5e 100644
--- a/src/lib/marble/geodata/data/GeoDataPlacemark.cpp
+++ b/src/lib/marble/geodata/data/GeoDataPlacemark.cpp
@@ -275,20 +275,16 @@ GeoDataCoordinates GeoDataPlacemark::coordinate( const QDateTime \
&dateTime, bool  
     if (d->m_geometry) {
         // Beware: comparison between pointers, not strings.
-        if (d->m_geometry->nodeType() == GeoDataTypes::GeoDataPointType
-                || d->m_geometry->nodeType() == GeoDataTypes::GeoDataPolygonType
-                || d->m_geometry->nodeType() == GeoDataTypes::GeoDataLinearRingType) {
+        if (d->m_geometry->nodeType() == GeoDataTypes::GeoDataPointType) {
             hasIcon = true;
-            coord = d->m_geometry->latLonAltBox().center();
+            coord = static_cast<const GeoDataPoint *>(d->m_geometry)->coordinates();
         } else if (d->m_geometry->nodeType() == GeoDataTypes::GeoDataMultiGeometryType) {
             const GeoDataMultiGeometry *multiGeometry = static_cast<const GeoDataMultiGeometry \
*>(d->m_geometry);  
             QVector<GeoDataGeometry*>::ConstIterator it = multiGeometry->constBegin();
             QVector<GeoDataGeometry*>::ConstIterator end = multiGeometry->constEnd();
             for ( ; it != end; ++it ) {
-                if ((*it)->nodeType() == GeoDataTypes::GeoDataPointType
-                        || (*it)->nodeType() == GeoDataTypes::GeoDataPolygonType
-                        || (*it)->nodeType() == GeoDataTypes::GeoDataLinearRingType) {
+                if ( (*it)->nodeType() == GeoDataTypes::GeoDataPointType ) {
                     hasIcon = true;
                     break;
                 }
diff --git a/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.cpp \
b/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.cpp index a44fa2a..e9f73d3 \
                100644
--- a/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.cpp
+++ b/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.cpp
@@ -29,6 +29,7 @@ BuildingGeoPolygonGraphicsItem::BuildingGeoPolygonGraphicsItem(const \
                GeoDataPlac
                                                                const GeoDataPolygon *polygon)
     : AbstractGeoPolygonGraphicsItem(placemark, polygon)
     , m_buildingHeight(polygon->latLonAltBox().maxAltitude() - \
polygon->latLonAltBox().minAltitude()) +    , m_buildingLabel(extractBuildingLabel(*placemark))
     , m_entries(extractNamedEntries(*placemark))
 {
     setZValue(this->zValue() + m_buildingHeight);
@@ -44,6 +45,7 @@ BuildingGeoPolygonGraphicsItem::BuildingGeoPolygonGraphicsItem(const \
                GeoDataPlac
                                                                const GeoDataLinearRing* ring)
     : AbstractGeoPolygonGraphicsItem(placemark, ring)
     , m_buildingHeight(ring->latLonAltBox().maxAltitude() - \
ring->latLonAltBox().minAltitude()) +    , m_buildingLabel(extractBuildingLabel(*placemark))
     , m_entries(extractNamedEntries(*placemark))
 {
     setZValue(this->zValue() + m_buildingHeight);
@@ -133,6 +135,27 @@ QPointF BuildingGeoPolygonGraphicsItem::buildingOffset(const QPointF \
&point, con  return QPointF(shiftX, shiftY);
 }
 
+QString BuildingGeoPolygonGraphicsItem::extractBuildingLabel(const GeoDataPlacemark \
&placemark) +{
+    if (!placemark.name().isEmpty()) {
+        return placemark.name();
+    }
+
+    const OsmPlacemarkData &osmData = placemark.osmData();
+
+    auto tagIter = osmData.findTag(QStringLiteral("addr:housename"));
+    if (tagIter != osmData.tagsEnd()) {
+        return tagIter.value();
+    }
+
+    tagIter = osmData.findTag(QStringLiteral("addr:housenumber"));
+    if (tagIter != osmData.tagsEnd()) {
+        return tagIter.value();
+    }
+
+    return QString();
+}
+
 QVector<BuildingGeoPolygonGraphicsItem::NamedEntry> \
BuildingGeoPolygonGraphicsItem::extractNamedEntries(const GeoDataPlacemark &placemark)  {
     QVector<NamedEntry> entries;
@@ -177,6 +200,7 @@ void BuildingGeoPolygonGraphicsItem::paintRoof(GeoPainter* painter, const \
Viewpo  painter->save();
     QPen const currentPen = configurePainter(painter, viewport);
 
+    bool const hasIcon = !style()->iconStyle().iconPath().isEmpty();
     qreal maxSize(0.0);
     QPointF roofCenter;
 
@@ -190,7 +214,7 @@ void BuildingGeoPolygonGraphicsItem::paintRoof(GeoPainter* painter, const \
Viewpo  foreach(QPolygonF* outlinePolygon, outlinePolygons) {
         QRectF const boundingRect = outlinePolygon->boundingRect();
         QPolygonF buildingRoof;
-        if (!m_entries.isEmpty()) {
+        if (hasIcon || !m_buildingLabel.isEmpty() || !m_entries.isEmpty()) {
             QSizeF const polygonSize = boundingRect.size();
             qreal size = polygonSize.width() * polygonSize.height();
             if (size > maxSize) {
@@ -234,6 +258,25 @@ void BuildingGeoPolygonGraphicsItem::paintRoof(GeoPainter* painter, const \
Viewpo  painter->drawPolygon(*outlinePolygon);
             painter->translate(-offset);
         }
+
+        if (hasIcon && !roofCenter.isNull()) {
+            QImage const icon = style()->iconStyle().scaledIcon();
+            QPointF const iconCenter(icon.size().width()/2.0, icon.size().height()/2.0);
+            painter->drawImage(roofCenter-iconCenter, icon);
+        } else if (drawAccurate3D && !m_buildingLabel.isEmpty() && !roofCenter.isNull()) {
+            double const w2 = 0.5 * painter->fontMetrics().width(m_buildingLabel);
+            double const ascent = painter->fontMetrics().ascent();
+            double const descent = painter->fontMetrics().descent();
+            double const a2 = 0.5 * painter->fontMetrics().ascent();
+            QPointF const textPosition = roofCenter - QPointF(w2, -a2);
+            if (buildingRoof.containsPoint(textPosition + QPointF(-2, -ascent), \
Qt::OddEvenFill) +                    && buildingRoof.containsPoint(textPosition + QPointF(-2, \
descent), Qt::OddEvenFill) +                    && buildingRoof.containsPoint(textPosition + \
QPointF(2+2*w2, descent), Qt::OddEvenFill) +                    && \
buildingRoof.containsPoint(textPosition + QPointF(2+2*w2, -ascent), Qt::OddEvenFill) +          \
) { +                painter->drawText(textPosition, m_buildingLabel);
+            }
+        }
     }
 
     // Render additional housenumbers at building entries
diff --git a/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.h \
b/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.h index 64f7d6e..bb7a662 \
                100644
--- a/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.h
+++ b/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.h
@@ -46,10 +46,12 @@ private:
     static QPointF centroid(const QPolygonF &polygon, double &area);
     static void screenPolygons(const ViewportParams *viewport, const GeoDataPolygon* polygon,
                                QVector<QPolygonF*> &polygons,  QVector<QPolygonF*> &outlines);
+    static QString extractBuildingLabel(const GeoDataPlacemark &placemark);
     static QVector<NamedEntry> extractNamedEntries(const GeoDataPlacemark &placemark);
 
 private:
     const double m_buildingHeight;
+    const QString m_buildingLabel;
     const QVector<NamedEntry> m_entries;
 };
 
diff --git a/src/plugins/runner/osm/OsmWay.cpp b/src/plugins/runner/osm/OsmWay.cpp
index f369790..1b2a02b 100644
--- a/src/plugins/runner/osm/OsmWay.cpp
+++ b/src/plugins/runner/osm/OsmWay.cpp
@@ -88,12 +88,6 @@ void OsmWay::create(GeoDataDocument *document, const OsmNodes &nodes, \
QSet<qint6  if (placemark->name().isEmpty()) {
         placemark->setName(m_osmData.tagValue(QStringLiteral("ref")));
     }
-    if (placemark->name().isEmpty()) {
-        placemark->setName(m_osmData.tagValue(QStringLiteral("addr:housename")));
-    }
-    if (placemark->name().isEmpty()) {
-        placemark->setName(m_osmData.tagValue(QStringLiteral("addr:housenumber")));
-    }
     placemark->setOsmData(osmData);
     placemark->setVisible(placemark->visualCategory() != GeoDataPlacemark::None);
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic