void OsmNode::create(GeoDataDocument *document) const { GeoDataFeature::GeoDataVisualCategory const category = OsmPresetLibrary::determineVisualCategory(m_osmData); if (category == GeoDataFeature::None || (category >= GeoDataFeature::HighwaySteps && category <= GeoDataFeature::HighwayMotorway)) { return; } GeoDataPlacemark* placemark = new GeoDataPlacemark; placemark->setOsmData(m_osmData); placemark->setCoordinate(m_coordinates); if ((category == GeoDataFeature::TransportCarShare || category == GeoDataFeature::MoneyAtm) && m_osmData.containsTagKey("operator")) { placemark->setName(m_osmData.tagValue("operator")); } else { placemark->setName(m_osmData.tagValue("name")); } placemark->setZoomLevel( 18 ); placemark->setVisualCategory(category); placemark->setStyle( 0 ); if (category == GeoDataFeature::NaturalTree) { qreal const lat = m_coordinates.latitude(GeoDataCoordinates::Degree); if (qAbs(lat) > 15) { /** @todo Should maybe auto-adjust to MarbleClock at some point */ QDate const date = QDate::currentDate(); bool const southernHemisphere = lat < 0; QDate const autumnStart = QDate(date.year(), southernHemisphere ? 3 : 9, 15); QDate const winterEnd = southernHemisphere ? QDate(date.year(), 8, 15) : QDate(date.year()+1, 2, 15); if (date > autumnStart && date < winterEnd) { QDate const autumnEnd = QDate(date.year(), southernHemisphere ? 5 : 11, 15); QString const season = date < autumnEnd ? "autumn" : "winter"; GeoDataIconStyle iconStyle = placemark->style()->iconStyle(); QString const bitmap = QString("bitmaps/osmcarto/symbols/48/individual/tree-29-%1.png").arg(season); iconStyle.setIconPath(MarbleDirs::path(bitmap)); GeoDataStyle* style = new GeoDataStyle(*placemark->style()); style->setIconStyle(iconStyle); placemark->setStyle(style); } } } OsmObjectManager::registerId(m_osmData.id()); document->append(placemark); }
EditPlacemarkDialog::EditPlacemarkDialog( GeoDataPlacemark *placemark, const QHash<qint64, OsmPlacemarkData> *relations, QWidget *parent ) : QDialog( parent ), d( new Private( placemark ) ) { d->setupUi( this ); // Store initial style so that it can be restored if the 'Cancel' button is pressed. d->m_initialStyle = *placemark->style(); d->m_initialVisualCategory = placemark->visualCategory(); d->m_hadInitialOsmData = placemark->hasOsmData(); if ( d->m_hadInitialOsmData ) { d->m_initialOsmData = placemark->osmData(); } // If the placemark has just been created, assign it a default name. if ( placemark->name().isNull() ) { placemark->setName( tr("Untitled Placemark") ); } // Setup id, name, icon link and latitude/longitude values. d->m_header->setId( placemark->id() ); d->m_initialId = placemark->id(); d->m_header->setName( placemark->name() ); d->m_initialName = placemark->name(); d->m_isPlacemarkVisible->setChecked( placemark->isVisible() ); d->m_initialIsPlacemarkVisible = placemark->isVisible(); d->m_header->setIconLink( placemark->style()->iconStyle().iconPath() ); d->m_header->setTargetId( placemark->targetId() ); d->m_initialTargetId = placemark->targetId(); MarbleWidget* marbleWidget = dynamic_cast<MarbleWidget*>( parent ); if( marbleWidget != 0 ) { const AngleUnit defaultAngleUnit = marbleWidget->defaultAngleUnit(); const GeoDataCoordinates::Notation notation = (defaultAngleUnit == DecimalDegree) ? GeoDataCoordinates::Decimal : (defaultAngleUnit == DMSDegree) ? GeoDataCoordinates::DMS : /* else, UTM */ GeoDataCoordinates::DMS; d->m_header->setNotation( notation ); } connect( d->m_header, SIGNAL(valueChanged()), this, SLOT( updateTextAnnotation()) ); d->m_formattedTextWidget->setText( placemark->description() ); d->m_initialDescription = placemark->description(); d->m_initialDescriptionIsCDATA = placemark->descriptionIsCDATA(); d->m_isBalloonVisible->setChecked( placemark->isBalloonVisible() ); d->m_initialIsBaloonVisible = placemark->isBalloonVisible(); d->m_header->setLatitude( placemark->coordinate().latitude( GeoDataCoordinates::Degree ) ); d->m_header->setLongitude( placemark->coordinate().longitude( GeoDataCoordinates::Degree ) ); d->m_initialCoords = GeoDataCoordinates( d->m_header->longitude(), d->m_header->latitude(), 0, GeoDataCoordinates::Degree ); // There's no point showing Relations and Tags tabs if the editor was not // loaded from the annotate plugin ( loaded from tourWidget.. ) if ( relations ) { // Adding the osm tag editor widget tab d->m_osmTagEditorWidget = new OsmTagEditorWidget( placemark, this ); d->tabWidget->addTab( d->m_osmTagEditorWidget, tr( "Tags" ) ); QObject::connect( d->m_osmTagEditorWidget, SIGNAL( placemarkChanged( GeoDataFeature* ) ), this, SLOT( updateTextAnnotation() ) ); // Adding the osm relation editor widget tab d->m_osmRelationManagerWidget = new OsmRelationManagerWidget( placemark, relations, this ); d->tabWidget->addTab( d->m_osmRelationManagerWidget, tr( "Relations" ) ); QObject::connect( d->m_osmRelationManagerWidget, SIGNAL( relationCreated( const OsmPlacemarkData& ) ), this, SIGNAL( relationCreated( const OsmPlacemarkData& ) ) ); } // Adding the elevation widget tab d->m_elevationWidget = new Ui::ElevationWidget; QWidget *elevationTab = new QWidget; d->m_elevationWidget->setupUi( elevationTab ); d->tabWidget->addTab( elevationTab, tr("Elevation") ); qreal altitude = d->m_placemark->coordinate().altitude(); MarbleLocale *locale = MarbleGlobal::getInstance()->locale(); if ( altitude == 0.0 ) { switch ( locale->measurementSystem() ) { case MarbleLocale::MetricSystem: d->m_elevationUnit = MarbleLocale::Meter; break; case MarbleLocale::ImperialSystem: d->m_elevationUnit = MarbleLocale::Foot; break; case MarbleLocale::NauticalSystem: d->m_elevationUnit = MarbleLocale::NauticalMile; break; } d->m_elevationWidget->elevationSpinBox->setSuffix( locale->unitAbbreviation((d->m_elevationUnit)) ); } else { qreal convertedAltitude; const MarbleLocale::MeasurementSystem currentSystem = locale->measurementSystem(); locale->meterToTargetUnit( altitude, currentSystem, convertedAltitude, d->m_elevationUnit ); d->m_elevationWidget->elevationSpinBox->setValue( convertedAltitude ); d->m_elevationWidget->elevationSpinBox->setSuffix( locale->unitAbbreviation(d->m_elevationUnit) ); } // Adjust icon and label scales. d->m_iconScale->setValue( placemark->style()->iconStyle().scale() ); connect( d->m_iconScale, SIGNAL(valueChanged(double)), this, SLOT(updateTextAnnotation()) ); d->m_labelScale->setValue( placemark->style()->labelStyle().scale() ); connect( d->m_labelScale, SIGNAL(valueChanged(double)), this, SLOT(updateTextAnnotation()) ); // Adjust the current color of the two push buttons' pixmap to resemble the label and icon colors. const GeoDataLabelStyle labelStyle = placemark->style()->labelStyle(); const GeoDataIconStyle iconStyle = placemark->style()->iconStyle(); QPixmap labelPixmap( d->m_labelButton->iconSize().width(), d->m_labelButton->iconSize().height() ); labelPixmap.fill( labelStyle.color() ); d->m_labelButton->setIcon( QIcon( labelPixmap ) ); QPixmap iconPixmap( d->m_iconButton->iconSize().width(), d->m_iconButton->iconSize().height() ); iconPixmap.fill( iconStyle.color() ); d->m_iconButton->setIcon( QIcon( iconPixmap ) ); // Setup the color dialogs. d->m_labelColorDialog = new QColorDialog( this ); d->m_labelColorDialog->setOption( QColorDialog::ShowAlphaChannel ); d->m_labelColorDialog->setCurrentColor( labelStyle.color() ); connect( d->m_labelButton, SIGNAL(clicked()), d->m_labelColorDialog, SLOT(exec()) ); connect( d->m_labelColorDialog, SIGNAL(colorSelected(QColor)), this, SLOT(updateLabelDialog(QColor)) ); connect( d->m_labelColorDialog, SIGNAL(colorSelected(QColor)), this, SLOT(updateTextAnnotation()) ); d->m_iconColorDialog = new QColorDialog( this ); d->m_iconColorDialog->setOption( QColorDialog::ShowAlphaChannel ); d->m_iconColorDialog->setCurrentColor( iconStyle.color() ); connect( d->m_iconButton, SIGNAL(clicked()), d->m_iconColorDialog, SLOT(exec()) ); connect( d->m_iconColorDialog, SIGNAL(colorSelected(QColor)), this, SLOT(updateIconDialog(QColor)) ); connect( d->m_iconColorDialog, SIGNAL(colorSelected(QColor)), this, SLOT(updateTextAnnotation()) ); connect( d->m_isBalloonVisible, SIGNAL(toggled(bool)), this, SLOT(updateTextAnnotation()) ); // Promote "Ok" button to default button. d->buttonBox->button( QDialogButtonBox::Ok )->setDefault( true ); connect( d->buttonBox->button( QDialogButtonBox::Ok ), SIGNAL(pressed()), this, SLOT(checkFields()) ); connect( this, SIGNAL(accepted()), SLOT(updateTextAnnotation()) ); connect( this, SIGNAL(accepted()), SLOT(updatePlacemarkAltitude()) ); connect( this, SIGNAL(finished(int)), SLOT(restoreInitial(int)) ); // Ensure that the dialog gets deleted when closing it (either when clicking OK or // Close). connect( this, SIGNAL(finished(int)), SLOT(deleteLater()) ); }
void OsmNode::create(GeoDataDocument *document) const { GeoDataFeature::GeoDataVisualCategory const category = OsmPresetLibrary::determineVisualCategory(m_osmData); if (category == GeoDataFeature::None || (category >= GeoDataFeature::HighwaySteps && category <= GeoDataFeature::HighwayMotorway)) { return; } GeoDataPlacemark* placemark = new GeoDataPlacemark; placemark->setOsmData(m_osmData); placemark->setCoordinate(m_coordinates); if ((category == GeoDataFeature::TransportCarShare || category == GeoDataFeature::MoneyAtm) && m_osmData.containsTagKey("operator")) { placemark->setName(m_osmData.tagValue("operator")); } else { placemark->setName(m_osmData.tagValue("name")); } placemark->setVisualCategory(category); placemark->setStyle( GeoDataStyle::Ptr() ); if (category == GeoDataFeature::NaturalTree) { qreal const lat = m_coordinates.latitude(GeoDataCoordinates::Degree); if (qAbs(lat) > 15) { /** @todo Should maybe auto-adjust to MarbleClock at some point */ QDate const date = QDate::currentDate(); bool const southernHemisphere = lat < 0; QDate const autumnStart = QDate(date.year(), southernHemisphere ? 3 : 9, 15); QDate const winterEnd = southernHemisphere ? QDate(date.year(), 8, 15) : QDate(date.year()+1, 2, 15); if (date > autumnStart && date < winterEnd) { QDate const autumnEnd = QDate(date.year(), southernHemisphere ? 5 : 11, 15); QString const season = date < autumnEnd ? "autumn" : "winter"; GeoDataIconStyle iconStyle = placemark->style()->iconStyle(); QString const bitmap = QString("bitmaps/osmcarto/symbols/48/individual/tree-29-%1.png").arg(season); iconStyle.setIconPath(MarbleDirs::path(bitmap)); GeoDataStyle::Ptr style(new GeoDataStyle(*placemark->style())); style->setIconStyle(iconStyle); placemark->setStyle(style); } } } placemark->setZoomLevel( 18 ); if (category >= GeoDataFeature::PlaceCity && category <= GeoDataFeature::PlaceVillage) { int const population = m_osmData.tagValue("population").toInt(); placemark->setPopulation(qMax(0, population)); if (population > 0) { placemark->setZoomLevel(populationIndex(population)); placemark->setPopularity(population); } else { switch (category) { case GeoDataFeature::PlaceCity: placemark->setZoomLevel(9); break; case GeoDataFeature::PlaceSuburb: placemark->setZoomLevel(13); break; case GeoDataFeature::PlaceHamlet: placemark->setZoomLevel(15); break; case GeoDataFeature::PlaceLocality: placemark->setZoomLevel(15); break; case GeoDataFeature::PlaceTown: placemark->setZoomLevel(11); break; case GeoDataFeature::PlaceVillage: placemark->setZoomLevel(13); break; default: placemark->setZoomLevel(10); break; } } } else if (category == GeoDataFeature::NaturalPeak) { placemark->setZoomLevel(11); bool isInteger = false; int const elevation = m_osmData.tagValue("ele").toInt(&isInteger); if (isInteger) { placemark->setName(QString("%1 (%2 m)").arg(placemark->name()).arg(elevation)); } } OsmObjectManager::registerId(m_osmData.id()); document->append(placemark); }
void TestGeoData::parentingTest() { GeoDataDocument *document = new GeoDataDocument; GeoDataFolder *folder = new GeoDataFolder; /// simple parenting test GeoDataPlacemark *placemark = new GeoDataPlacemark; placemark->setParent(document); QCOMPARE(placemark->parent(), document); /// simple append and child count test document->append(placemark); /// appending folder to document before feeding folder document->append(folder); QCOMPARE(document->size(), 2); GeoDataPlacemark *placemark2 = new GeoDataPlacemark; folder->append(placemark2); QCOMPARE(folder->size(), 1); /// retrieve child and check it matches placemark GeoDataPlacemark *placemarkPtr; QCOMPARE(document->child(0)->nodeType(), placemark->nodeType()); placemarkPtr = static_cast<GeoDataPlacemark*>(document->child(0)); QCOMPARE(placemarkPtr, placemark); /// check retrieved placemark matches intented child int position = document->childPosition(placemarkPtr); QCOMPARE(position, 0); /// retrieve child two and check it matches folder GeoDataFolder *folderPtr; QCOMPARE(document->child(1)->nodeType(), folder->nodeType()); folderPtr = static_cast<GeoDataFolder*>(document->child(1)); QCOMPARE(folderPtr, folder); /// check retrieved folder matches intended child position = document->childPosition(folderPtr); QCOMPARE(position, 1); /// retrieve child three and check it matches placemark QCOMPARE(folderPtr->size(), 1); placemarkPtr = static_cast<GeoDataPlacemark*>(folderPtr->child(0)); QCOMPARE(placemarkPtr->nodeType(), placemark2->nodeType()); QCOMPARE(placemarkPtr, placemark2); /// check retrieved placemark matches intended child QCOMPARE(folderPtr->childPosition(placemarkPtr), 0); /// Set a style GeoDataIconStyle iconStyle; iconStyle.setIconPath( "myicon.png" ); GeoDataStyle* style = new GeoDataStyle; style->setStyleId( "mystyle" ); style->setIconStyle( iconStyle ); GeoDataObject* noParent = 0; QCOMPARE( style->parent(), noParent ); QCOMPARE( iconStyle.parent(), noParent ); document->setStyle( style ); QCOMPARE( style->parent(), document ); // Parent should be assigned now QCOMPARE( style->iconStyle().parent(), style ); QCOMPARE( iconStyle.parent(), noParent ); // setIconStyle copies QCOMPARE( placemark->style()->parent(), noParent ); placemark->setStyle( style ); QCOMPARE( placemark->style()->parent(), placemark ); // Parent should be assigned now /// Set a style map GeoDataStyleMap* styleMap = new GeoDataStyleMap; styleMap->setStyleId( "mystylemap" ); styleMap->insert( "normal", "#mystyle" ); styleMap->insert( "highlight", "#mystyle" ); document->addStyle( *style ); document->setStyleMap( styleMap ); QCOMPARE( placemark2->style()->parent(), noParent ); placemark2->setStyleUrl( "#mystyle" ); QCOMPARE( placemark2->style()->parent(), document ); // Parent is document, not placemark2 QCOMPARE( iconStyle.iconPath(), QString( "myicon.png" ) ); QCOMPARE( placemark2->style()->iconStyle().iconPath(), QString( "myicon.png" ) ); }