Marble

KmlIconStyleTagWriter.cpp
1 // SPDX-License-Identifier: LGPL-2.1-or-later
2 //
3 // SPDX-FileCopyrightText: 2010 Dennis Nienhüser <[email protected]>
4 //
5 
6 #include "KmlIconStyleTagWriter.h"
7 
8 #include "GeoDataIconStyle.h"
9 #include "GeoDataTypes.h"
10 #include "GeoWriter.h"
11 #include "KmlElementDictionary.h"
12 
13 namespace Marble
14 {
15 
16 static GeoTagWriterRegistrar s_writerIconStyle(
17  GeoTagWriter::QualifiedName( GeoDataTypes::GeoDataIconStyleType,
18  kml::kmlTag_nameSpaceOgc22 ),
19  new KmlIconStyleTagWriter );
20 
21 KmlIconStyleTagWriter::KmlIconStyleTagWriter() : KmlColorStyleTagWriter( kml::kmlTag_IconStyle )
22 {
23  // nothing to do
24 }
25 
26 bool KmlIconStyleTagWriter::writeMid( const GeoNode *node, GeoWriter& writer ) const
27 {
28  const GeoDataIconStyle *style = static_cast<const GeoDataIconStyle*>( node );
29 
30  if ( style->scale() != 1.0 ) {
31  writer.writeElement( kml::kmlTag_scale, QString::number( style->scale(), 'f' ) );
32  }
33 
34  if (!style->size().isEmpty()) {
35  writer.writeNamespace(kml::kmlTag_nameSpaceMx, QStringLiteral("mx"));
36  writer.writeStartElement(kml::kmlTag_nameSpaceMx, kml::kmlTag_size);
37  writer.writeAttribute(kml::kmlTag_width, QString::number(style->size().width()));
38  writer.writeAttribute(kml::kmlTag_height, QString::number(style->size().height()));
39  writer.writeEndElement();
40  }
41 
42  if ( !style->iconPath().isEmpty() ) {
43  writer.writeStartElement( kml::kmlTag_Icon );
44  writer.writeStartElement( kml::kmlTag_href );
45  writer.writeCharacters( style->iconPath() );
46  writer.writeEndElement();
47  writer.writeEndElement();
48  }
49 
50  GeoDataHotSpot::Units xunits, yunits;
51  QPointF const hotSpot = style->hotSpot( xunits, yunits );
52  bool const emptyHotSpot = hotSpot.x() == 0.5 && hotSpot.y() == 0.5 &&
53  xunits == GeoDataHotSpot::Fraction && yunits == GeoDataHotSpot::Fraction;
54  if ( !emptyHotSpot ) {
55  writer.writeStartElement( kml::kmlTag_hotSpot );
56  if ( hotSpot.x() != 0.5 || xunits != GeoDataHotSpot::Fraction ) {
57  writer.writeAttribute( "x", QString::number( hotSpot.x(), 'f' ) );
58  }
59  if ( hotSpot.y() != 0.5 || yunits != GeoDataHotSpot::Fraction ) {
60  writer.writeAttribute( "y", QString::number( hotSpot.y(), 'f' ) );
61  }
62 
63  if ( xunits != GeoDataHotSpot::Fraction ) {
64  writer.writeAttribute( "xunits", unitString( xunits ) );
65  }
66  if ( yunits != GeoDataHotSpot::Fraction ) {
67  writer.writeAttribute( "yunits", unitString( yunits ) );
68  }
69  writer.writeEndElement();
70  }
71 
72  return true;
73 }
74 
75 bool KmlIconStyleTagWriter::isEmpty( const GeoNode *node ) const
76 {
77  const GeoDataIconStyle *style = static_cast<const GeoDataIconStyle*>( node );
78  GeoDataHotSpot::Units xunits, yunits;
79  QPointF const hotSpot = style->hotSpot( xunits, yunits );
80  return style->iconPath().isEmpty() &&
81  hotSpot.x() == 0.5 &&
82  hotSpot.y() == 0.5 &&
83  xunits == GeoDataHotSpot::Fraction &&
84  yunits == GeoDataHotSpot::Fraction;
85 }
86 
87 QString KmlIconStyleTagWriter::unitString(GeoDataHotSpot::Units unit)
88 {
89  switch (unit) {
90  case GeoDataHotSpot::Pixels: return "pixels";
91  case GeoDataHotSpot::InsetPixels: return "insetPixels";
92  case GeoDataHotSpot::Fraction: return "fraction";
93  }
94 
95  return "fraction";
96 }
97 
98 }
QString number(int n, int base)
QPair< QString, QString > QualifiedName
Object Name and Namespace Pair This type is intended to be used in a similar way to.
Definition: GeoTagWriter.h:44
Binds a QML item to a specific geodetic location in screen coordinates.
qreal x() const const
qreal y() const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Oct 2 2023 03:52:08 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.