File indexing completed on 2024-06-02 03:51:02

0001 // SPDX-License-Identifier: LGPL-2.1-or-later
0002 //
0003 // SPDX-FileCopyrightText: 2013 Sanjiban Bairagya <sanjiban22393@gmail.com>
0004 //
0005 
0006 
0007 #include "KmlGxAltitudeModeTagHandler.h"
0008 #include "KmlAltitudeModeTagHandler.h"
0009 
0010 #include "MarbleDebug.h"
0011 
0012 #include "KmlElementDictionary.h"
0013 
0014 #include "GeoDataGeometry.h"
0015 #include "GeoDataLatLonAltBox.h"
0016 #include "GeoDataGroundOverlay.h"
0017 #include "GeoDataPoint.h"
0018 #include "GeoDataPlacemark.h"
0019 #include "GeoDataTrack.h"
0020 #include "GeoDataAbstractView.h"
0021 #include "GeoDataModel.h"
0022 
0023 #include "GeoParser.h"
0024 
0025 namespace Marble
0026 {
0027 namespace kml
0028 {
0029 namespace gx
0030 {
0031 KML_DEFINE_TAG_HANDLER_GX22( altitudeMode )
0032 
0033 GeoNode* KmlaltitudeModeTagHandler::parse( GeoParser& parser ) const
0034 {
0035     Q_ASSERT(parser.isStartElement() && parser.isValidElement(QLatin1String(kmlTag_altitudeMode)));
0036 
0037     QString content = parser.readElementText().trimmed();
0038 
0039     AltitudeMode mode;
0040     if (content == QLatin1String("relativeToGround")) {
0041         mode = RelativeToGround;
0042     } else if (content == QLatin1String("absolute")) {
0043         mode = Absolute;
0044     } else if (content == QLatin1String("relativeToSeaFloor")) {
0045         mode = RelativeToSeaFloor;
0046     } else if (content == QLatin1String("clampToSeaFloor")) {
0047         mode = ClampToSeaFloor;
0048     } else if (content == QLatin1String("clampToGround")) {
0049         mode = ClampToGround;
0050     } else {
0051         mDebug() << "Unknown altitude mode " << content << ", falling back to 'clampToGround'";
0052         mode = ClampToGround;
0053     }
0054 
0055     GeoStackItem parentItem = parser.parentElement();
0056 
0057     if ( parentItem.is<GeoDataPlacemark>() ) {
0058          parentItem.nodeAs<GeoDataPlacemark>()->geometry()->setAltitudeMode( mode );
0059     } else if ( parentItem.is<GeoDataPoint>() ) {
0060         parentItem.nodeAs<GeoDataPoint>()->setAltitudeMode( mode );
0061     } else if ( parentItem.is<GeoDataLatLonAltBox>() ) {
0062         parentItem.nodeAs<GeoDataLatLonAltBox>()->setAltitudeMode( mode );
0063     } else if ( parentItem.is<GeoDataTrack>() ) {
0064         parentItem.nodeAs<GeoDataTrack>()->setAltitudeMode( mode );
0065     } else if ( parentItem.is<GeoDataGroundOverlay>() ) {
0066         parentItem.nodeAs<GeoDataGroundOverlay>()->setAltitudeMode( mode );
0067     } else if ( parentItem.is<GeoDataAbstractView>() ) {
0068         parentItem.nodeAs<GeoDataAbstractView>()->setAltitudeMode( mode );
0069     } else if ( parentItem.is<GeoDataModel>() ) {
0070         parentItem.nodeAs<GeoDataModel>()->setAltitudeMode( mode );
0071     }
0072 
0073     return nullptr;
0074 }
0075 
0076 }
0077 }
0078 }