diff --git a/src/lib/marble/MarbleMap.h b/src/lib/marble/MarbleMap.h --- a/src/lib/marble/MarbleMap.h +++ b/src/lib/marble/MarbleMap.h @@ -54,6 +54,7 @@ class TextureLayer; class TileCoordsPyramid; class GeoSceneTextureTileDataset; +class StyleBuilder; /** * @short A class that can paint a view of the earth. @@ -420,6 +421,8 @@ RenderState renderState() const; + const StyleBuilder* styleBuilder() const; + public Q_SLOTS: /** diff --git a/src/lib/marble/MarbleMap.cpp b/src/lib/marble/MarbleMap.cpp --- a/src/lib/marble/MarbleMap.cpp +++ b/src/lib/marble/MarbleMap.cpp @@ -1382,6 +1382,11 @@ return &d->m_textureLayer; } +const StyleBuilder* MarbleMap::styleBuilder() const +{ + return &d->m_styleBuilder; +} + } #include "moc_MarbleMap.cpp" diff --git a/src/lib/marble/MarbleWidget.h b/src/lib/marble/MarbleWidget.h --- a/src/lib/marble/MarbleWidget.h +++ b/src/lib/marble/MarbleWidget.h @@ -55,6 +55,7 @@ class TileCreator; class ViewportParams; class PopupLayer; +class StyleBuilder; /** * @short A widget class that displays a view of the earth. @@ -247,6 +248,8 @@ PopupLayer* popupLayer(); + const StyleBuilder* styleBuilder() const; + /** * @brief Get the Projection used for the map * @return @c Spherical a Globe diff --git a/src/lib/marble/MarbleWidget.cpp b/src/lib/marble/MarbleWidget.cpp --- a/src/lib/marble/MarbleWidget.cpp +++ b/src/lib/marble/MarbleWidget.cpp @@ -44,6 +44,7 @@ #include "ViewportParams.h" #include "routing/RoutingLayer.h" #include "MarbleAbstractPresenter.h" +#include "StyleBuilder.h" namespace Marble { @@ -1189,6 +1190,11 @@ return d->m_mapInfoDialog; } +const StyleBuilder* MarbleWidget::styleBuilder() const +{ + return d->m_map.styleBuilder(); +} + } #include "moc_MarbleWidget.cpp" diff --git a/src/lib/marble/MarbleWidgetPopupMenu.cpp b/src/lib/marble/MarbleWidgetPopupMenu.cpp --- a/src/lib/marble/MarbleWidgetPopupMenu.cpp +++ b/src/lib/marble/MarbleWidgetPopupMenu.cpp @@ -26,6 +26,7 @@ #include "GeoDataPlacemark.h" #include "GeoDataSnippet.h" #include "GeoDataStyle.h" +#include "GeoDataIconStyle.h" #include "GeoDataTypes.h" #include "GeoDataPhotoOverlay.h" #include "GeoSceneDocument.h" @@ -41,6 +42,8 @@ #include "BookmarkManager.h" #include "ReverseGeocodingRunnerManager.h" #include "TemplateDocument.h" +#include "OsmPlacemarkData.h" +#include "StyleBuilder.h" // Qt #include @@ -57,8 +60,8 @@ class Q_DECL_HIDDEN MarbleWidgetPopupMenu::Private { public: - const MarbleModel *const m_model; - MarbleWidget *const m_widget; + const MarbleModel *const m_model; + MarbleWidget *const m_widget; QVector m_featurelist; QList m_itemList; @@ -70,9 +73,9 @@ QAction *m_directionsFromHereAction; QAction *m_directionsToHereAction; - QAction *const m_copyCoordinateAction; + QAction *const m_copyCoordinateAction; - QAction *m_rmbExtensionPoint; + QAction *m_rmbExtensionPoint; ReverseGeocodingRunnerManager m_runnerManager; @@ -90,6 +93,7 @@ GeoDataCoordinates mouseCoordinates( QAction* dataContainer ) const; static QString filterEmptyShortDescription( const QString &description ); + void setupDialogOsm( PopupLayer *popup, const GeoDataPlacemark* placemark ); void setupDialogSatellite( const GeoDataPlacemark *placemark ); static void setupDialogCity( PopupLayer *popup, const GeoDataPlacemark *placemark ); static void setupDialogNation( PopupLayer *popup, const GeoDataPlacemark *placemark ); @@ -174,6 +178,135 @@ return description; } +void MarbleWidgetPopupMenu::Private::setupDialogOsm( PopupLayer *popup, const GeoDataPlacemark *placemark ) +{ + const GeoDataCoordinates location = placemark->coordinate(); + popup->setCoordinates(location, Qt::AlignRight | Qt::AlignVCenter); + + QFile descriptionFile(":/marble/webpopup/osm.html"); + if (!descriptionFile.open(QIODevice::ReadOnly)) { + return; + } + + QString description = descriptionFile.readAll(); + OsmPlacemarkData data = placemark->osmData(); + if (!data.containsTagKey("addr:street") && !data.containsTagKey("addr:housenumber")){ + description = description.replace("
%postcode%", "%postcode%"); + } + TemplateDocument doc(description); + + if (data.containsTagKey("name")){ + doc["name"] = data.tagValue("name"); + } else { + doc["name"] = ""; + } + + if (data.containsTagKey("shop")){ + QString shop = data.tagValue("shop"); + shop[0] = shop[0].toUpper(); + doc["amenity"] = "Shop - " + shop; + } else if (data.containsTagKey("amenity")){ + QString amenity = data.tagValue("amenity"); + amenity[0] = amenity[0].toUpper(); + doc["amenity"] = amenity; + } else { + doc["amenityVisibility"] = "none"; + } + + if (data.containsTagKey("cuisine")){ + QString cuisine = data.tagValue("cuisine"); + cuisine[0] = cuisine[0].toUpper(); + doc["cuisine"] = cuisine; + } else { + doc["cuisineVisibility"] = "none"; + } + + if (data.containsTagKey("opening_hours")){ + doc["openinghours"] = data.tagValue("opening_hours"); + } else { + doc["openinghoursVisibility"] = "none"; + } + + bool hasAddressData = false; + foreach(const QString &tag, QStringList() << "addr:street" << "addr:housenumber" << "addr:postcode" << "addr:city") { + if (data.containsTagKey(tag)){ + hasAddressData = true; + break; + } + } + + bool hasWebsiteData = false; + foreach(const QString &tag, QStringList() << "website" << "contact:website" << "facebook" << "contact:facebook" << "url") { + if (data.containsTagKey(tag)){ + hasWebsiteData = true; + break; + } + } + + bool hasPhoneData = data.containsTagKey("phone"); + + bool hasContactsData = hasAddressData || hasPhoneData || hasWebsiteData; + + if (hasContactsData){ + if (hasAddressData){ + foreach (const QString tag, QStringList() << "addr:street" << "addr:housenumber" << "addr:postcode" << "addr:city") { + if (data.containsTagKey(tag)){ + doc[tag.split("addr:")[1]] = data.tagValue(tag); + } else { + doc[tag.split("addr:")[1]] = ""; + } + } + } else { + doc["addressVisibility"] = "none"; + } + + if (hasPhoneData){ + doc["phone"] = data.tagValue("phone"); + } else { + doc["phoneVisibility"] = "none"; + } + + if (hasWebsiteData){ + foreach(const QString tag, QStringList() << "website" << "contact:website" << "facebook" << "contact:facebook" << "url") { + if (data.containsTagKey(tag)){ + doc["website"] = data.tagValue(tag); + break; + } + } + } else { + doc["websiteVisibility"] = "none"; + } + } else { + doc["contactVisibility"] = "none"; + } + + if (data.containsTagKey("wheelchair") || data.containsTagKey("internet_access") || data.containsTagKey("smoking")){ + if (data.containsTagKey("wheelchair")){ + doc["wheelchair"] = data.tagValue("wheelchair"); + } else { + doc["wheelchairVisibility"] = "none"; + } + + if (data.containsTagKey("internet_access")){ + doc["internetaccess"] = data.tagValue("internet_access"); + } else { + doc["internetVisibility"] = "none"; + } + + if (data.containsTagKey("smoking")){ + doc["smoking"] = data.tagValue("smoking"); + } else { + doc["smokingVisibility"] = "none"; + } + } else { + doc["facilitiesVisibility"] = "none"; + } + + const QString flagPath = m_widget->styleBuilder()->createStyle(StyleParameters(placemark))->iconStyle().iconPath(); + doc["flag"] = flagPath; + popup->setContent(doc.finalText()); +} + void MarbleWidgetPopupMenu::Private::setupDialogSatellite( const GeoDataPlacemark *placemark ) { PopupLayer *const popup = m_widget->popupLayer(); @@ -479,6 +612,24 @@ bool isCity = false; bool isNation = false; + OsmPlacemarkData data = placemark->osmData(); + + bool hasOsmData = false; + + QStringList recognizedTags; + recognizedTags << "name" << "amenity" << "cuisine" << "opening_hours"; + recognizedTags << "addr:street" << "addr:housenumber" << "addr:postcode"; + recognizedTags << "addr:city" << "phone" << "wheelchair" << "internet_access"; + recognizedTags << "smoking" << "website" << "contact:website" << "facebook"; + recognizedTags << "contact:facebook" << "url"; + + foreach(const QString &tag, recognizedTags) { + if (data.containsTagKey(tag)) { + hasOsmData = true; + break; + } + } + if ( placemark ) { isSatellite = (placemark->visualCategory() == GeoDataFeature::Satellite); isCity = (placemark->visualCategory() >= GeoDataFeature::SmallCity && @@ -494,7 +645,9 @@ popup->setSize(QSizeF(400, 400)); - if (isSatellite) { + if (hasOsmData){ + d->setupDialogOsm( popup, placemark ); + } else if (isSatellite) { d->setupDialogSatellite( placemark ); } else if (isCity) { Private::setupDialogCity( popup, placemark ); diff --git a/src/lib/marble/libmarble.qrc b/src/lib/marble/libmarble.qrc --- a/src/lib/marble/libmarble.qrc +++ b/src/lib/marble/libmarble.qrc @@ -98,6 +98,7 @@ webpopup/nation.html webpopup/skyplace.html webpopup/photooverlay.html + webpopup/osm.html htmlfeatures/bootstrap.min.css diff --git a/src/lib/marble/webpopup/osm.html b/src/lib/marble/webpopup/osm.html --- a/src/lib/marble/webpopup/osm.html +++ b/src/lib/marble/webpopup/osm.html @@ -6,11 +6,56 @@ + -

%name%

+

%name%

%amenity%

@@ -18,34 +63,34 @@

Opening Hours: %openinghours%

- +
- + - + - - + +
Contact
Address:%street% %housenumber%
%postcode% %city%
Phone:%phone%
Website:%website% m
Website:%website%

- +
- + - + - +
Popular Facilities
Wheelchair access%wheelchair%
Internet%internetaccess%
Smoking%smoking%