7#include <MarbleQuickItem.h>
11#include <QPaintDevice>
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
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
107 void installPluginEventFilter(RenderPlugin *)
override {}
112 return m_marbleQuick->layersEventFilter(
o, e);
120 if (
event->touchPoints().count() > 1)
125 if (
event->touchPoints().count() == 1)
127 QTouchEvent::TouchPoint p =
event->touchPoints().at(0);
132 handleMouseEvent(&press);
138 handleMouseEvent(&move);
144 handleMouseEvent(&release);
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*");
246 d->m_map.setMapQualityForViewContext(NormalQuality, Animation);
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);
262 connect(&d->m_map, &MarbleMap::visibleLatLonAltBoxChanged,
this, &MarbleQuickItem::updatePositionVisibility);
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)));
267 connect(&d->m_map, &MarbleMap::visibleLatLonAltBoxChanged,
this, &MarbleQuickItem::handleVisibleLatLonAltBoxChanged);
268 connect(d->m_map.model(), &MarbleModel::workOfflineChanged,
this, &MarbleQuickItem::workOfflineChanged);
271 installEventFilter(&d->m_inputHandler);
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);
341 d->m_placemarkItem->setProperty(
"xPos",
QVariant(x));
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
423 return Projection(d->m_map.projection());
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);
750 d->m_presenter.flyTo(target, Automatic);
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)
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);
873 void MarbleQuickItem::setProjection(Projection projection)
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());
1394#include "moc_MarbleQuickItem.cpp"
This file contains the headers for MarbleMap.
This file contains the headers for MarbleModel.
This file contains the headers for ViewportParams.
Represents a coordinate with the properties of a name and coordinates.
void setLatitude(qreal lat)
Change the latitude of the coordinate.
void setLongitude(qreal lon)
Change the longitude of the coordinate.
Marble::GeoDataCoordinates coordinates() const
Change the altitude of the coordinate.
Q_SCRIPTABLE CaptureState status()
AKONADI_CALENDAR_EXPORT KCalendarCore::Event::Ptr event(const Akonadi::Item &item)
void update(Part *part, const QByteArray &data, qint64 dataSize)
KIOCORE_EXPORT CopyJob * move(const QList< QUrl > &src, const QUrl &dest, JobFlags flags=DefaultFlags)
VehicleSection::Features features(QStringView coachNumber, QStringView coachClassification)
QAction * zoom(const QObject *recvr, const char *slot, QObject *parent)
const QList< QKeySequence > & end()
QString name(StandardShortcut id)
Binds a QML item to a specific geodetic location in screen coordinates.
@ Linear
Linear interpolation of lon, lat and distance to ground.
@ Animation
animated view (e.g. while rotating the globe)
Projection
This enum is used to choose the projection shown in the view.
qreal distanceSphere(qreal lon1, qreal lat1, qreal lon2, qreal lat2)
This method calculates the shortest distance between two points on a sphere.
void setObjectOwnership(QObject *object, ObjectOwnership ownership)
T value(qsizetype i) const const
const_iterator cbegin() const const
const_iterator cend() const const
Key key(const T &value, const Key &defaultKey) const const
virtual bool event(QEvent *e)
T qobject_cast(QObject *object)
QString tr(const char *sourceText, const char *disambiguation, int n)
bool begin(QPaintDevice *device)
QPaintDevice * device() const const
virtual void hoverMoveEvent(QHoverEvent *event)
void setCursor(const QCursor &cursor)
void beginGroup(QAnyStringView prefix)
void setValue(QAnyStringView key, const QVariant &value)
QVariant value(QAnyStringView key) const const
bool isEmpty() const const
QFuture< void > map(Iterator begin, Iterator end, MapFunctor &&function)
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
QVariant fromValue(T &&value)
double toDouble(bool *ok) const const
int toInt(bool *ok) const const
QStringList toStringList() const const