7 #include <MarbleQuickItem.h>
8 #include <QQuickWindow>
11 #include <QPaintDevice>
13 #include <QQmlContext>
19 #include <GeoPainter.h>
20 #include <GeoDataLookAt.h>
22 #include <MarbleAbstractPresenter.h>
23 #include <AbstractFloatItem.h>
24 #include <MarbleInputHandler.h>
25 #include <PositionTracking.h>
26 #include <PositionProviderPlugin.h>
27 #include <PluginManager.h>
28 #include <RenderPlugin.h>
29 #include <MarbleMath.h>
30 #include <StyleBuilder.h>
31 #include <GeoDataLatLonAltBox.h>
32 #include <GeoDataCoordinates.h>
33 #include <ReverseGeocodingRunnerManager.h>
34 #include <routing/RoutingManager.h>
35 #include <routing/RoutingModel.h>
36 #include <routing/Route.h>
37 #include <BookmarkManager.h>
38 #include "GeoDataRelation.h"
39 #include "osm/OsmPlacemarkData.h"
40 #include "GeoDataDocument.h"
41 #include <geodata/parser/GeoSceneTypes.h>
42 #include <geodata/scene/GeoSceneDocument.h>
43 #include <geodata/scene/GeoSceneMap.h>
44 #include <geodata/scene/GeoSceneLayer.h>
45 #include <geodata/scene/GeoSceneTextureTileDataset.h>
50 class QuickItemSelectionRubber :
public AbstractSelectionRubber
53 QuickItemSelectionRubber();
54 void show()
override { m_visible =
true; }
55 void hide()
override { m_visible =
false; }
56 bool isVisible()
const override {
return m_visible; }
57 const QRect &geometry()
const override {
return m_geometry; }
58 void setGeometry(
const QRect &)
override {}
65 class MarbleQuickInputHandler :
public MarbleDefaultInputHandler
68 MarbleQuickInputHandler(MarbleAbstractPresenter *marblePresenter, MarbleQuickItem *marbleQuick)
69 : MarbleDefaultInputHandler(marblePresenter)
70 ,m_marbleQuick(marbleQuick)
72 setInertialEarthRotationEnabled(
false);
75 bool acceptMouse()
override
82 (void)handlePinch(center, scale, state);
85 void handleMouseButtonPressAndHold(
const QPoint &position)
override
87 m_marbleQuick->reverseGeocoding(position);
91 void showLmbMenu(
int x,
int y)
override
93 m_marbleQuick->selectPlacemarkAt(x, y);
94 emit m_marbleQuick->lmbMenuRequested(
QPoint(x,y));
97 void showRmbMenu(
int x,
int y)
override {
98 emit m_marbleQuick->rmbMenuRequested(
QPoint(x,y));
100 void openItemToolTip()
override {}
101 void setCursor(
const QCursor &cursor)
override
103 m_marbleQuick->setCursor(cursor);
107 void installPluginEventFilter(RenderPlugin *)
override {}
112 return m_marbleQuick->layersEventFilter(o, e);
120 if (
event->touchPoints().count() > 1)
125 if (
event->touchPoints().count() == 1)
132 handleMouseEvent(&press);
138 handleMouseEvent(&move);
150 AbstractSelectionRubber *selectionRubber()
override
152 return &m_selectionRubber;
155 MarbleQuickItem *m_marbleQuick;
156 QuickItemSelectionRubber m_selectionRubber;
160 class MarbleQuickItemPrivate
163 explicit MarbleQuickItemPrivate(MarbleQuickItem *marble) :
168 m_positionVisible(false),
169 m_currentPosition(marble),
170 m_inputHandler(&m_presenter, marble),
171 m_placemarkDelegate(nullptr),
172 m_placemarkItem(nullptr),
173 m_placemark(nullptr),
174 m_reverseGeocoding(&m_model),
175 m_showScaleBar(false),
176 m_enabledRelationTypes(GeoDataRelation::RouteFerry |
177 GeoDataRelation::RouteTrain |
178 GeoDataRelation::RouteSubway |
179 GeoDataRelation::RouteTram |
180 GeoDataRelation::RouteBus |
181 GeoDataRelation::RouteTrolleyBus |
182 GeoDataRelation::RouteHiking),
183 m_showPublicTransport(false),
184 m_showOutdoorActivities(false),
186 m_hoverEnabled(false),
187 m_invertColorEnabled(false)
189 m_currentPosition.setName(
QObject::tr(
"Current Location"));
190 m_relationTypeConverter[
"road"] = GeoDataRelation::RouteRoad;
191 m_relationTypeConverter[
"detour"] = GeoDataRelation::RouteDetour;
192 m_relationTypeConverter[
"ferry"] = GeoDataRelation::RouteFerry;
193 m_relationTypeConverter[
"train"] = GeoDataRelation::RouteTrain;
194 m_relationTypeConverter[
"subway"] = GeoDataRelation::RouteSubway;
195 m_relationTypeConverter[
"tram"] = GeoDataRelation::RouteTram;
196 m_relationTypeConverter[
"bus"] = GeoDataRelation::RouteBus;
197 m_relationTypeConverter[
"trolley-bus"] = GeoDataRelation::RouteTrolleyBus;
198 m_relationTypeConverter[
"bicycle"] = GeoDataRelation::RouteBicycle;
199 m_relationTypeConverter[
"mountainbike"] = GeoDataRelation::RouteMountainbike;
200 m_relationTypeConverter[
"foot"] = GeoDataRelation::RouteFoot;
201 m_relationTypeConverter[
"hiking"] = GeoDataRelation::RouteHiking;
202 m_relationTypeConverter[
"horse"] = GeoDataRelation::RouteHorse;
203 m_relationTypeConverter[
"inline-skates"] = GeoDataRelation::RouteInlineSkates;
204 m_relationTypeConverter[
"downhill"] = GeoDataRelation::RouteSkiDownhill;
205 m_relationTypeConverter[
"ski-nordic"] = GeoDataRelation::RouteSkiNordic;
206 m_relationTypeConverter[
"skitour"] = GeoDataRelation::RouteSkitour;
207 m_relationTypeConverter[
"sled"] = GeoDataRelation::RouteSled;
210 void updateVisibleRoutes();
211 void changeBlending(
bool enabled,
const QString &blendingName);
212 void changeStyleBuilder(
bool invert);
215 MarbleQuickItem *m_marble;
216 friend class MarbleQuickItem;
219 Marble::MapTheme m_mapTheme;
220 MarbleAbstractPresenter m_presenter;
221 bool m_positionVisible;
222 Placemark m_currentPosition;
224 MarbleQuickInputHandler m_inputHandler;
227 Placemark* m_placemark;
228 ReverseGeocodingRunnerManager m_reverseGeocoding;
232 GeoDataRelation::RelationTypes m_enabledRelationTypes;
233 bool m_showPublicTransport;
234 bool m_showOutdoorActivities;
237 bool m_invertColorEnabled;
241 ,d(new MarbleQuickItemPrivate(this))
244 setOpaquePainting(
true);
245 qRegisterMetaType<Placemark*>(
"Placemark*");
248 for (AbstractFloatItem *item: d->m_map.floatItems()) {
250 item->setPosition(
QPointF(5.0, -10.0));
256 d->m_model.positionTracking()->setTrackVisible(
false);
257 d->m_mapTheme.setMap(
this);
260 connect(
this, &MarbleQuickItem::widthChanged,
this, &MarbleQuickItem::resizeMap);
261 connect(
this, &MarbleQuickItem::heightChanged,
this, &MarbleQuickItem::resizeMap);
263 connect(&d->m_map, &MarbleMap::radiusChanged,
this, &MarbleQuickItem::radiusChanged);
264 connect(&d->m_map, &MarbleMap::radiusChanged,
this, &MarbleQuickItem::zoomChanged);
265 connect(&d->m_reverseGeocoding, SIGNAL(reverseGeocodingFinished(GeoDataCoordinates,GeoDataPlacemark)),
266 this, SLOT(handleReverseGeocoding(GeoDataCoordinates,GeoDataPlacemark)));
268 connect(d->m_map.model(), &MarbleModel::workOfflineChanged,
this, &MarbleQuickItem::workOfflineChanged);
274 void MarbleQuickItem::resizeMap()
277 d->m_map.setSize(qMax(100,
int(width())), qMax(100,
int(height())));
279 updatePositionVisibility();
282 void MarbleQuickItem::positionDataStatusChanged(PositionProviderStatus
status)
284 bool const positionAvailable =
status == PositionProviderStatusAvailable;
285 emit positionAvailableChanged(positionAvailable);
286 updatePositionVisibility();
289 void MarbleQuickItem::positionChanged(
const GeoDataCoordinates &, GeoDataAccuracy)
291 updatePositionVisibility();
294 void MarbleQuickItem::updatePositionVisibility()
297 bool isVisible =
false;
298 if ( positionAvailable() ) {
300 bool globeHidesPoint;
301 bool const valid = d->m_map.viewport()->screenCoordinates(d->m_model.positionTracking()->currentLocation(), x, y, globeHidesPoint);
302 isVisible = valid && !globeHidesPoint;
305 if ( isVisible != d->m_positionVisible ) {
306 d->m_positionVisible = isVisible;
307 emit positionVisibleChanged( isVisible );
311 void MarbleQuickItem::updateCurrentPosition(
const GeoDataCoordinates &coordinates)
313 d->m_currentPosition.placemark().setCoordinate(coordinates);
314 emit currentPositionChanged(&d->m_currentPosition);
317 void MarbleQuickItem::updatePlacemarks()
319 if (!d->m_placemarkDelegate || !d->m_placemark) {
323 if (!d->m_placemarkItem) {
325 QObject * component = d->m_placemarkDelegate->create(context);
326 d->m_placemarkItem = qobject_cast<QQuickItem*>( component );
327 if (d->m_placemarkItem) {
328 d->m_placemarkItem->setParentItem(
this );
338 const bool visible = d->m_map.viewport()->screenCoordinates(d->m_placemark->placemark().coordinate(), x, y);
339 d->m_placemarkItem->setVisible(visible);
342 d->m_placemarkItem->setProperty(
"yPos",
QVariant(y));
346 void MarbleQuickItem::handleReverseGeocoding(
const GeoDataCoordinates &coordinates,
const GeoDataPlacemark &placemark)
348 if (d->m_placemark && d->m_placemark->placemark().coordinate() == coordinates) {
349 d->m_placemark->setGeoDataPlacemark(placemark);
354 void MarbleQuickItem::handleVisibleLatLonAltBoxChanged(
const GeoDataLatLonAltBox &latLonAltBox)
356 Q_UNUSED(latLonAltBox)
358 if (d->m_heading != d->m_map.heading()) {
359 d->m_heading = d->m_map.heading();
360 emit headingChanged(d->m_heading);
362 emit visibleLatLonAltBoxChanged();
363 emit geoItemUpdateRequested();
366 void MarbleQuickItem::paint(
QPainter *painter)
369 QRect rect = contentsBoundingRect().toRect();
373 GeoPainter geoPainter(paintDevice, d->m_map.viewport(), d->m_map.mapQuality());
382 geoPainter.scale(scale, scale);
386 d->m_map.paint(geoPainter, rect);
388 painter->
begin(paintDevice);
391 void MarbleQuickItem::classBegin()
395 void MarbleQuickItem::componentComplete()
399 void Marble::MarbleQuickItem::MarbleQuickItem::hoverMoveEvent(
QHoverEvent *event) {
400 if (d->m_hoverEnabled) {
401 emit hoverPositionChanged(
event->pos());
406 int MarbleQuickItem::mapWidth()
const
408 return d->m_map.width();
411 int MarbleQuickItem::mapHeight()
const
413 return d->m_map.height();
416 bool MarbleQuickItem::showFrameRate()
const
418 return d->m_map.showFrameRate();
421 MarbleQuickItem::Projection MarbleQuickItem::projection()
const
426 QString MarbleQuickItem::mapThemeId()
const
428 return d->m_map.mapThemeId();
431 Marble::MapTheme *MarbleQuickItem::mapTheme()
const
433 return &d->m_mapTheme;
436 bool MarbleQuickItem::showAtmosphere()
const
438 return d->m_map.showAtmosphere();
441 bool MarbleQuickItem::showCompass()
const
443 return d->m_map.showCompass();
446 bool MarbleQuickItem::showClouds()
const
448 return d->m_map.showClouds();
451 bool MarbleQuickItem::showCrosshairs()
const
453 return d->m_map.showCrosshairs();
456 bool MarbleQuickItem::showGrid()
const
458 return d->m_map.showGrid();
461 bool MarbleQuickItem::showOverviewMap()
const
463 return d->m_map.showOverviewMap();
466 bool MarbleQuickItem::showOtherPlaces()
const
468 return d->m_map.showOtherPlaces();
471 bool MarbleQuickItem::showScaleBar()
const
473 return d->m_showScaleBar;
476 bool MarbleQuickItem::showBackground()
const
478 return d->m_map.showBackground();
481 bool MarbleQuickItem::showPositionMarker()
const
484 for (
const RenderPlugin * plugin: plugins) {
486 return plugin->visible();
492 bool MarbleQuickItem::showPublicTransport()
const
494 return d->m_showPublicTransport;
497 bool MarbleQuickItem::showOutdoorActivities()
const
499 return d->m_showOutdoorActivities;
502 QString MarbleQuickItem::positionProvider()
const
504 if ( d->m_model.positionTracking()->positionProviderPlugin() ) {
505 return d->m_model.positionTracking()->positionProviderPlugin()->nameId();
511 MarbleModel* MarbleQuickItem::model()
516 const MarbleModel* MarbleQuickItem::model()
const
521 MarbleMap* MarbleQuickItem::map()
526 const MarbleMap* MarbleQuickItem::map()
const
531 bool MarbleQuickItem::inertialGlobeRotation()
const
533 return d->m_inputHandler.inertialEarthRotationEnabled();
536 bool MarbleQuickItem::animationViewContext()
const
538 return d->m_map.viewContext() ==
Animation;
541 bool MarbleQuickItem::animationsEnabled()
const
543 return d->m_presenter.animationsEnabled();
548 return d->m_placemarkDelegate;
551 void MarbleQuickItem::reverseGeocoding(
const QPoint &point)
554 d->m_map.viewport()->geoCoordinates(point.
x(), point.
y(), lon, lat);
555 auto const coordinates = GeoDataCoordinates(lon, lat, 0.0, GeoDataCoordinates::Degree);
556 delete d->m_placemarkItem;
557 d->m_placemarkItem =
nullptr;
558 delete d->m_placemark;
559 d->m_placemark =
new Placemark(
this);
560 d->m_placemark->placemark().setCoordinate(coordinates);
561 d->m_reverseGeocoding.reverseGeocoding(coordinates);
564 bool MarbleQuickItem::hoverEnabled()
const
566 return d->m_hoverEnabled;
569 void MarbleQuickItem::moveUp()
574 void MarbleQuickItem::moveDown()
579 void MarbleQuickItem::moveLeft()
584 void MarbleQuickItem::moveRight()
589 qreal MarbleQuickItem::speed()
const
591 return d->m_model.positionTracking()->speed();
594 qreal MarbleQuickItem::angle()
const
596 bool routeExists = d->m_model.routingManager()->routingModel()->route().distance() != 0.0;
597 bool onRoute = !d->m_model.routingManager()->routingModel()->deviatedFromRoute();
598 if ( routeExists && onRoute) {
599 GeoDataCoordinates curPoint = d->m_model.positionTracking()->positionProviderPlugin()->position();
600 return d->m_model.routingManager()->routingModel()->route().currentSegment().projectedDirection(curPoint);
602 return d->m_model.positionTracking()->direction();
606 bool MarbleQuickItem::positionAvailable()
const
608 return d->m_model.positionTracking()->status() == PositionProviderStatusAvailable;
611 bool MarbleQuickItem::positionVisible()
const
613 return d->m_positionVisible;
616 qreal MarbleQuickItem::distanceFromPointToCurrentLocation(
const QPoint & position)
const
618 if ( positionAvailable() ) {
621 d->m_map.viewport()->geoCoordinates(position.
x(), position.
y(), lon1, lat1, GeoDataCoordinates::Radian );
623 GeoDataCoordinates currentCoordinates = d->m_model.positionTracking()->currentLocation();
624 qreal lon2 = currentCoordinates.longitude();
625 qreal lat2 = currentCoordinates.latitude();
627 return distanceSphere(lon1, lat1, lon2, lat2) * d->m_model.planetRadius();
632 qreal MarbleQuickItem::angleFromPointToCurrentLocation(
const QPoint & position )
const
634 if ( positionAvailable() ) {
636 PositionTracking
const * positionTracking = d->m_model.positionTracking();
637 map()->viewport()->screenCoordinates( positionTracking->currentLocation(), x, y );
638 return atan2( y-position.
y(), x-position.
x() ) * RAD2DEG;
643 Placemark * MarbleQuickItem::currentPosition()
const
645 return &d->m_currentPosition;
648 QPointF MarbleQuickItem::screenCoordinatesFromCoordinate(
Coordinate * coordinate)
const
651 bool globeHidesPoint;
652 bool const valid = d->m_map.viewport()->screenCoordinates(coordinate->
coordinates(), x, y, globeHidesPoint);
653 bool isVisible = valid && !globeHidesPoint;
657 QPointF MarbleQuickItem::screenCoordinatesFromGeoDataCoordinates(
const GeoDataCoordinates & coordinates)
const
660 bool globeHidesPoint;
661 d->m_map.viewport()->screenCoordinates(coordinates, x, y, globeHidesPoint);
665 bool MarbleQuickItem::screenCoordinatesFromGeoDataLineString(
const GeoDataLineString &lineString,
QVector<QPolygonF *> &polygons)
const
667 return d->m_map.viewport()->screenCoordinates(lineString, polygons);
670 bool MarbleQuickItem::screenCoordinatesToCoordinate(
const QPoint & point,
Coordinate * coordinate)
672 GeoDataCoordinates geoDataCoordinates;
673 bool success = screenCoordinatesToGeoDataCoordinates(point, geoDataCoordinates);
674 if (!qobject_cast<Coordinate*>(coordinate)){
676 coordinate =
new Coordinate(geoDataCoordinates.longitude(), geoDataCoordinates.latitude(), 0,
nullptr);
681 coordinate->
setLongitude(geoDataCoordinates.longitude());
682 coordinate->
setLatitude(geoDataCoordinates.latitude());
688 bool MarbleQuickItem::screenCoordinatesToGeoDataCoordinates(
const QPoint & point, GeoDataCoordinates & coordinates)
690 qreal lon = 0.0 , lat = 0.0;
691 bool const valid = d->m_map.viewport()->geoCoordinates(point.
x(), point.
y(), lon, lat);
692 coordinates.setLongitude(lon);
693 coordinates.setLatitude(lat);
697 void MarbleQuickItem::setRadius(
int radius)
699 d->m_map.setRadius(radius);
702 void MarbleQuickItem::setHeading(qreal heading)
704 if (qFuzzyCompare(d->m_heading, heading))
707 d->m_map.setHeading(heading);
708 d->m_heading = heading;
710 emit headingChanged(d->m_heading);
713 void MarbleQuickItem::setHoverEnabled(
bool hoverEnabled)
715 if (d->m_hoverEnabled == hoverEnabled)
718 d->m_hoverEnabled = hoverEnabled;
720 setAcceptHoverEvents(hoverEnabled);
721 setFlag(ItemAcceptsInputMethod, hoverEnabled);
723 emit hoverEnabledChanged(d->m_hoverEnabled);
726 void MarbleQuickItem::setZoom(
int newZoom,
FlyToMode mode)
728 d->m_presenter.setZoom(newZoom, mode);
731 void MarbleQuickItem::setZoomToMaximumLevel()
733 d->m_presenter.setZoom(d->m_map.maximumZoom());
736 void MarbleQuickItem::centerOn(
const GeoDataPlacemark& placemark,
bool animated)
738 d->m_presenter.centerOn(placemark, animated);
741 void MarbleQuickItem::centerOn(
const GeoDataLatLonBox& box,
bool animated)
743 d->m_presenter.centerOn(box, animated);
746 void MarbleQuickItem::centerOn(
const GeoDataCoordinates &coordinate)
748 GeoDataLookAt target = d->m_presenter.lookAt();
749 target.setCoordinates(coordinate);
753 void MarbleQuickItem::centerOn(qreal longitude, qreal latitude)
755 d->m_presenter.centerOn(longitude, latitude);
758 void MarbleQuickItem::centerOnCoordinates(qreal longitude, qreal latitude) {
759 centerOn(longitude, latitude);
762 void MarbleQuickItem::centerOnCurrentPosition()
764 GeoDataCoordinates coordinates = d->m_model.positionTracking()->currentLocation();
765 if ( coordinates == GeoDataCoordinates() ) {
769 d->m_presenter.centerOn(coordinates,
true);
770 if (d->m_presenter.zoom() < 3000) {
771 d->m_presenter.setZoom(3500);
775 void MarbleQuickItem::selectPlacemarkAt(
int x,
int y)
779 for(
auto feature: features) {
780 if (
const auto placemark = geodata_cast<GeoDataPlacemark>(feature)) {
781 placemarks << placemark;
785 for(
auto placemark: placemarks) {
786 if (d->m_placemark && placemark->coordinate() == d->m_placemark->placemark().coordinate()) {
787 d->m_placemark->deleteLater();
788 d->m_placemark =
nullptr;
790 if (d->m_placemark) {
791 d->m_placemark->deleteLater();
793 d->m_placemark =
new Placemark(
this);
794 d->m_placemark->setGeoDataPlacemark(*placemark);
796 delete d->m_placemarkItem;
797 d->m_placemarkItem =
nullptr;
802 if (d->m_placemark) {
803 d->m_placemark->deleteLater();
804 d->m_placemark =
nullptr;
805 delete d->m_placemarkItem;
806 d->m_placemarkItem =
nullptr;
811 void MarbleQuickItem::goHome()
813 d->m_presenter.goHome();
816 void MarbleQuickItem::zoomIn(
FlyToMode mode)
818 d->m_presenter.zoomIn(mode);
821 void MarbleQuickItem::zoomOut(
FlyToMode mode)
823 d->m_presenter.zoomOut(mode);
826 void MarbleQuickItem::handlePinchStarted(
const QPointF &point)
831 void MarbleQuickItem::handlePinchFinished(
const QPointF &point)
836 void MarbleQuickItem::handlePinchUpdated(
const QPointF &point, qreal scale)
838 scale = sqrt(sqrt(scale));
839 scale = qBound(
static_cast<qreal
>(0.5), scale,
static_cast<qreal
>(2.0));
843 void MarbleQuickItem::setMapWidth(
int mapWidth)
845 if (d->m_map.width() == mapWidth) {
849 d->m_map.setSize(mapWidth, mapHeight());
850 emit mapWidthChanged(mapWidth);
853 void MarbleQuickItem::setMapHeight(
int mapHeight)
855 if (this->mapHeight() == mapHeight) {
859 d->m_map.setSize(mapWidth(), mapHeight);
860 emit mapHeightChanged(mapHeight);
863 void MarbleQuickItem::setShowFrameRate(
bool showFrameRate)
865 if (this->showFrameRate() == showFrameRate) {
869 d->m_map.setShowFrameRate(showFrameRate);
870 emit showFrameRateChanged(showFrameRate);
875 if (this->projection() == projection) {
880 emit projectionChanged(projection);
883 void MarbleQuickItem::setMapThemeId(
const QString& mapThemeId)
885 if (this->mapThemeId() == mapThemeId) {
889 bool invertColor = invertColorEnabled();
891 bool const showCompass = d->m_map.showCompass();
892 bool const showOverviewMap = d->m_map.showOverviewMap();
893 bool const showOtherPlaces = d->m_map.showOtherPlaces();
894 bool const showGrid = d->m_map.showGrid();
896 d->m_map.setMapThemeId(mapThemeId);
899 d->m_map.setShowCompass(showCompass);
900 d->m_map.setShowOverviewMap(showOverviewMap);
901 d->m_map.setShowOtherPlaces(showOtherPlaces);
902 d->m_map.setShowGrid(showGrid);
903 d->m_map.setShowScaleBar(d->m_showScaleBar);
905 emit mapThemeIdChanged(mapThemeId);
907 setInvertColorEnabled(invertColor);
910 void MarbleQuickItem::setShowAtmosphere(
bool showAtmosphere)
912 if (this->showAtmosphere() == showAtmosphere) {
916 d->m_map.setShowAtmosphere(showAtmosphere);
917 emit showAtmosphereChanged(showAtmosphere);
920 void MarbleQuickItem::setShowCompass(
bool showCompass)
922 if (this->showCompass() == showCompass) {
926 d->m_map.setShowCompass(showCompass);
927 emit showCompassChanged(showCompass);
930 void MarbleQuickItem::setShowClouds(
bool showClouds)
932 if (this->showClouds() == showClouds) {
936 d->m_map.setShowClouds(showClouds);
937 emit showCloudsChanged(showClouds);
940 void MarbleQuickItem::setShowCrosshairs(
bool showCrosshairs)
942 if (this->showCrosshairs() == showCrosshairs) {
946 d->m_map.setShowCrosshairs(showCrosshairs);
947 emit showCrosshairsChanged(showCrosshairs);
950 void MarbleQuickItem::setShowGrid(
bool showGrid)
952 if (this->showGrid() == showGrid) {
956 d->m_map.setShowGrid(showGrid);
957 emit showGridChanged(showGrid);
960 void MarbleQuickItem::setShowOverviewMap(
bool showOverviewMap)
962 if (this->showOverviewMap() == showOverviewMap) {
966 d->m_map.setShowOverviewMap(showOverviewMap);
967 emit showOverviewMapChanged(showOverviewMap);
970 void MarbleQuickItem::setShowOtherPlaces(
bool showOtherPlaces)
972 if (this->showOtherPlaces() == showOtherPlaces) {
976 d->m_map.setShowOtherPlaces(showOtherPlaces);
977 emit showOtherPlacesChanged(showOtherPlaces);
980 void MarbleQuickItem::setShowScaleBar(
bool showScaleBar)
982 if (d->m_showScaleBar == showScaleBar) {
986 d->m_showScaleBar = showScaleBar;
987 d->m_map.setShowScaleBar(d->m_showScaleBar);
988 emit showScaleBarChanged(showScaleBar);
991 void MarbleQuickItem::setShowBackground(
bool showBackground)
993 if (this->showBackground() == showBackground) {
997 d->m_map.setShowBackground(showBackground);
998 emit showBackgroundChanged(showBackground);
1001 void MarbleQuickItem::setShowPositionMarker(
bool showPositionMarker)
1003 if (this->showPositionMarker() == showPositionMarker) {
1008 for ( RenderPlugin * plugin: plugins ) {
1010 plugin->setVisible(showPositionMarker);
1015 emit showPositionMarkerChanged(showPositionMarker);
1018 void MarbleQuickItem::setShowPublicTransport(
bool enabled)
1020 if (d->m_showPublicTransport != enabled) {
1021 d->m_showPublicTransport = enabled;
1022 d->updateVisibleRoutes();
1023 emit showPublicTransportChanged(enabled);
1027 void MarbleQuickItem::setShowOutdoorActivities(
bool showOutdoorActivities)
1029 if (d->m_showOutdoorActivities != showOutdoorActivities) {
1030 d->m_showOutdoorActivities = showOutdoorActivities;
1031 d->updateVisibleRoutes();
1032 emit showOutdoorActivitiesChanged(showOutdoorActivities);
1036 void MarbleQuickItem::setPositionProvider(
const QString &positionProvider)
1039 if ( d->m_model.positionTracking()->positionProviderPlugin() ) {
1040 name = d->m_model.positionTracking()->positionProviderPlugin()->nameId();
1041 if ( name == positionProvider ) {
1046 if ( positionProvider.
isEmpty() ) {
1047 d->m_model.positionTracking()->setPositionProviderPlugin(
nullptr );
1052 for (
const PositionProviderPlugin* plugin: plugins) {
1053 if ( plugin->nameId() == positionProvider) {
1054 PositionProviderPlugin * newPlugin = plugin->newInstance();
1055 d->m_model.positionTracking()->setPositionProviderPlugin(newPlugin);
1056 connect(newPlugin, SIGNAL(statusChanged(PositionProviderStatus)),
this, SLOT(positionDataStatusChanged(PositionProviderStatus)));
1057 connect(newPlugin, SIGNAL(positionChanged(GeoDataCoordinates,GeoDataAccuracy)),
this, SLOT(updateCurrentPosition(GeoDataCoordinates)));
1058 connect(newPlugin, SIGNAL(positionChanged(GeoDataCoordinates,GeoDataAccuracy)),
this, SIGNAL(speedChanged()));
1059 connect(newPlugin, SIGNAL(positionChanged(GeoDataCoordinates,GeoDataAccuracy)),
this, SIGNAL(angleChanged()));
1060 emit positionProviderChanged(positionProvider);
1066 void MarbleQuickItem::setInertialGlobeRotation(
bool inertialGlobeRotation)
1068 if (inertialGlobeRotation == d->m_inputHandler.inertialEarthRotationEnabled()) {
1072 d->m_inputHandler.setInertialEarthRotationEnabled(inertialGlobeRotation);
1073 emit inertialGlobeRotationChanged(inertialGlobeRotation);
1076 void MarbleQuickItem::setAnimationViewContext(
bool animationViewContext)
1078 d->m_map.setViewContext(animationViewContext ?
Animation :
Still );
1080 emit inertialGlobeRotationChanged(animationViewContext);
1083 void MarbleQuickItem::setAnimationsEnabled(
bool animationsEnabled)
1085 if (d->m_presenter.animationsEnabled() == animationsEnabled)
1088 d->m_presenter.setAnimationsEnabled(animationsEnabled);
1089 emit animationsEnabledChanged(d->m_presenter.animationsEnabled());
1092 void MarbleQuickItem::setPluginSetting(
const QString &pluginId,
const QString &key,
const QString &value)
1094 for (RenderPlugin* plugin: d->m_map.renderPlugins()) {
1095 if (plugin->nameId() == pluginId) {
1096 plugin->setSetting(key, value);
1101 void MarbleQuickItem::setPropertyEnabled(
const QString &property,
bool enabled)
1103 d->m_map.setPropertyValue(property, enabled);
1106 bool MarbleQuickItem::isPropertyEnabled(
const QString &property)
const
1108 return d->m_map.propertyValue(property);
1111 void MarbleQuickItem::setWorkOffline(
bool enabled)
1113 if (d->m_map.model()->workOffline() == enabled)
1117 d->m_map.model()->setWorkOffline(enabled);
1121 void MarbleQuickItem::setInvertColorEnabled(
bool enabled,
const QString &blendingName)
1123 d->changeBlending(enabled, blendingName);
1125 d->changeStyleBuilder(enabled);
1127 if (d->m_invertColorEnabled == enabled)
1130 d->m_invertColorEnabled = enabled;
1132 emit invertColorEnabledChanged(d->m_invertColorEnabled);
1135 bool MarbleQuickItem::invertColorEnabled()
1137 return d->m_invertColorEnabled;
1140 bool MarbleQuickItem::workOffline()
1142 return d->m_map.model()->workOffline();
1145 void MarbleQuickItem::setShowRuntimeTrace(
bool showRuntimeTrace)
1147 d->m_map.setShowRuntimeTrace(showRuntimeTrace);
1151 void MarbleQuickItem::setShowDebugPolygons(
bool showDebugPolygons)
1153 d->m_map.setShowDebugPolygons(showDebugPolygons);
1157 void MarbleQuickItem::setShowDebugPlacemarks(
bool showDebugPlacemarks)
1159 d->m_map.setShowDebugPlacemarks(showDebugPlacemarks);
1163 void MarbleQuickItem::setShowDebugBatches(
bool showDebugBatches)
1165 d->m_map.setShowDebugBatchRender(showDebugBatches);
1169 void MarbleQuickItem::setPlacemarkDelegate(
QQmlComponent *placemarkDelegate)
1171 if (d->m_placemarkDelegate == placemarkDelegate) {
1175 delete d->m_placemarkItem;
1176 d->m_placemarkItem =
nullptr;
1177 d->m_placemarkDelegate = placemarkDelegate;
1178 emit placemarkDelegateChanged(placemarkDelegate);
1181 void MarbleQuickItem::loadSettings()
1184 settings.
beginGroup(QStringLiteral(
"MarbleQuickItem"));
1187 if (lat == 0.0 && lon == 0.0) {
1188 centerOnCurrentPosition();
1196 auto const defaultRelationTypes =
QStringList() <<
"ferry" <<
"train" <<
"subway" <<
"tram" <<
"bus" <<
"trolley-bus" <<
"hiking";
1197 auto const visibleRelationTypes = settings.
value(QStringLiteral(
"visibleRelationTypes"), defaultRelationTypes).
toStringList();
1198 d->m_enabledRelationTypes = GeoDataRelation::UnknownType;
1199 for (
auto const &route: visibleRelationTypes) {
1200 d->m_enabledRelationTypes |= d->m_relationTypeConverter.
value(route, GeoDataRelation::UnknownType);
1202 setShowPublicTransport(settings.
value(QStringLiteral(
"showPublicTransport"),
false).toBool());
1203 setShowOutdoorActivities(settings.
value(QStringLiteral(
"showOutdoorActivities"),
false).toBool());
1205 d->m_model.routingManager()->readSettings();
1206 d->m_model.bookmarkManager()->loadFile(QStringLiteral(
"bookmarks/bookmarks.kml"));
1207 d->m_model.bookmarkManager()->setShowBookmarks(
true);
1208 d->updateVisibleRoutes();
1211 void MarbleQuickItem::writeSettings()
1214 settings.
beginGroup(QStringLiteral(
"MarbleQuickItem"));
1215 settings.
setValue(QStringLiteral(
"centerLon"),
QVariant(d->m_map.centerLongitude()));
1216 settings.
setValue(QStringLiteral(
"centerLat"),
QVariant(d->m_map.centerLatitude()));
1220 for (
auto iter = d->m_relationTypeConverter.cbegin(), end = d->m_relationTypeConverter.cend(); iter != end; ++iter) {
1221 relationConverter[iter.value()] = iter.
key();
1223 for (
auto iter = relationConverter.
cbegin(), end = relationConverter.
cend(); iter != end; ++iter) {
1224 if (d->m_enabledRelationTypes & iter.key()) {
1225 enabledRoutes << iter.
value();
1228 settings.
setValue(QStringLiteral(
"visibleRelationTypes"), enabledRoutes);
1229 settings.
setValue(QStringLiteral(
"showPublicTransport"), d->m_showPublicTransport);
1230 settings.
setValue(QStringLiteral(
"showOutdoorActivities"), d->m_showOutdoorActivities);
1233 d->m_model.routingManager()->writeSettings();
1236 void MarbleQuickItem::reloadTiles()
1241 void MarbleQuickItem::highlightRouteRelation(qint64 osmId,
bool enabled)
1243 d->m_map.highlightRouteRelation(osmId, enabled);
1246 void MarbleQuickItem::setRelationTypeVisible(
const QString &relationType,
bool visible)
1248 auto const relation = d->m_relationTypeConverter.value(relationType, GeoDataRelation::UnknownType);
1250 d->m_enabledRelationTypes |= relation;
1252 d->m_enabledRelationTypes &= ~relation;
1254 d->updateVisibleRoutes();
1257 bool MarbleQuickItem::isRelationTypeVisible(
const QString &relationType)
const
1259 auto const relation = d->m_relationTypeConverter.value(relationType, GeoDataRelation::UnknownType);
1260 return d->m_enabledRelationTypes & relation;
1263 QObject *MarbleQuickItem::getEventFilter()
const
1265 return &d->m_inputHandler;
1270 d->m_inputHandler.pinch(center, scale, state);
1273 MarbleInputHandler *MarbleQuickItem::inputHandler()
1275 return &d->m_inputHandler;
1278 int MarbleQuickItem::radius()
const
1280 return d->m_map.radius();
1283 qreal MarbleQuickItem::heading()
const
1285 return d->m_map.heading();
1289 int MarbleQuickItem::zoom()
const
1291 return d->m_presenter.logzoom();
1294 int MarbleQuickItem::minimumZoom()
const
1296 return d->m_presenter.minimumZoom();
1299 int MarbleQuickItem::maximumZoom()
const
1301 return d->m_presenter.maximumZoom();
1304 bool MarbleQuickItem::layersEventFilter(
QObject *,
QEvent *)
1309 QuickItemSelectionRubber::QuickItemSelectionRubber() :
1315 void MarbleQuickItemPrivate::updateVisibleRoutes()
1317 GeoDataRelation::RelationTypes relationTypes = m_enabledRelationTypes;
1318 if (!m_showPublicTransport) {
1319 relationTypes &= ~GeoDataRelation::RouteTrain;
1320 relationTypes &= ~GeoDataRelation::RouteSubway;
1321 relationTypes &= ~GeoDataRelation::RouteTram;
1322 relationTypes &= ~GeoDataRelation::RouteBus;
1323 relationTypes &= ~GeoDataRelation::RouteTrolleyBus;
1325 if (!m_showOutdoorActivities) {
1326 relationTypes &= ~GeoDataRelation::RouteBicycle;
1327 relationTypes &= ~GeoDataRelation::RouteMountainbike;
1328 relationTypes &= ~GeoDataRelation::RouteFoot;
1329 relationTypes &= ~GeoDataRelation::RouteHiking;
1330 relationTypes &= ~GeoDataRelation::RouteHorse;
1331 relationTypes &= ~GeoDataRelation::RouteInlineSkates;
1332 relationTypes &= ~GeoDataRelation::RouteSkiDownhill;
1333 relationTypes &= ~GeoDataRelation::RouteSkiNordic;
1334 relationTypes &= ~GeoDataRelation::RouteSkitour;
1335 relationTypes &= ~GeoDataRelation::RouteSled;
1337 m_map.setVisibleRelationTypes(relationTypes);
1340 void MarbleQuickItemPrivate::changeBlending(
bool enabled,
const QString &blendingName)
1342 GeoSceneDocument * mapTheme = m_map.model()->mapTheme();
1343 if (mapTheme ==
nullptr)
return;
1345 GeoSceneMap *
map = mapTheme->map();
1346 if (map ==
nullptr)
return;
1348 GeoSceneTextureTileDataset * textureDataset =
nullptr;
1349 if (
map->hasTextureLayers()) {
1350 for (
auto layer :
map->layers()) {
1351 for (
auto dataset : layer->datasets()) {
1352 if (dataset->nodeType() == GeoSceneTypes::GeoSceneTextureTileType) {
1353 textureDataset =
dynamic_cast<GeoSceneTextureTileDataset*
>(dataset);
1358 if (textureDataset ==
nullptr)
return;
1359 if (enabled && textureDataset->blending().isEmpty()) {
1360 textureDataset->setBlending(blendingName);
1361 m_map.clearVolatileTileCache();
1363 else if (!enabled && textureDataset->blending() == blendingName) {
1364 textureDataset->setBlending(
"");
1365 m_map.clearVolatileTileCache();
1370 void MarbleQuickItemPrivate::changeStyleBuilder(
bool invert)
1372 GeoSceneDocument * mapTheme = m_map.model()->mapTheme();
1373 if (mapTheme ==
nullptr)
return;
1375 GeoSceneMap *
map = mapTheme->map();
1376 if (map ==
nullptr)
return;
1378 if (
map->hasVectorLayers()) {
1379 StyleBuilder * styleBuilder =
const_cast<StyleBuilder*
>(m_map.styleBuilder());
1382 styleBuilder->setStyleEffect(InvertedEffect);
1385 styleBuilder->setStyleEffect(NoEffect);
1387 styleBuilder->reset();
1389 emit m_map.model()->themeChanged(
QString());