8#include "EditBookmarkDialog.h"
9#include "ui_EditBookmarkDialog.h"
11#include "BookmarkManager.h"
12#include "GeoDataLookAt.h"
13#include "GeoDataDocument.h"
14#include "GeoDataPlacemark.h"
15#include "GeoDataPoint.h"
16#include "GeoDataStyle.h"
17#include "GeoDataIconStyle.h"
18#include "GeoDataFolder.h"
19#include "GeoDataCoordinates.h"
20#include "GeoDataExtendedData.h"
21#include "GeoDataData.h"
22#include "MarbleDirs.h"
25#include "NewBookmarkFolderDialog.h"
26#include "ReverseGeocodingRunnerManager.h"
32class EditBookmarkDialogPrivate {
34 MarbleWidget *m_widget;
35 ReverseGeocodingRunnerManager* m_manager;
36 BookmarkManager* m_bookmarkManager;
37 GeoDataCoordinates m_bookmarkCoordinates;
39 Ui::UiEditBookmarkDialog m_ui;
41 EditBookmarkDialogPrivate( EditBookmarkDialog* q, BookmarkManager *bookmarkManager );
43 void initComboBox(
const GeoDataContainer*
const container ,
int level=0);
47 void setFolderName(
const QString &name );
51 void openNewFolderDialog();
53 void retrieveGeocodeResult(
const GeoDataCoordinates &coordinates,
const GeoDataPlacemark &placemark);
55 void updateCoordinates();
58 EditBookmarkDialog*
const q;
61EditBookmarkDialogPrivate::EditBookmarkDialogPrivate( EditBookmarkDialog* q_, BookmarkManager *bookmarkManager ) :
62 m_widget( nullptr ), m_manager( nullptr ), m_bookmarkManager( bookmarkManager ), m_range( 0 ), q( q_ )
67void EditBookmarkDialogPrivate::initialize()
70 bool const smallScreen = MarbleGlobal::getInstance()->profiles() & MarbleGlobal::SmallScreen;
71 m_ui.m_header->setPositionVisible(!smallScreen);
72 m_ui.m_header->setIdVisible(
false );
73 m_ui.m_header->setIconLink(MarbleDirs::path(QStringLiteral(
"bitmaps/bookmark.png")));
74 QObject::connect( m_ui.m_newFolderButton, SIGNAL(clicked()), q, SLOT(openNewFolderDialog()) );
75 QObject::connect( m_ui.m_header, SIGNAL(valueChanged()), q, SLOT(updateCoordinates()) );
77 m_ui.m_folders->clear();
78 initComboBox( m_bookmarkManager->document() );
81void EditBookmarkDialogPrivate::initComboBox(
const GeoDataContainer*
const container,
int level )
83 m_bookmarkManager->ensureDefaultFolder();
84 for( GeoDataFolder *folder: container->folderList() ) {
88 m_ui.m_folders->addItem( name, folderVariant );
89 if( !folder->folderList().isEmpty() ) {
90 initComboBox( folder, level+1 );
95void EditBookmarkDialogPrivate::setFolderName(
const QString &name )
97 for (
int i=0; i<m_ui.m_folders->count(); ++i ) {
98 if ( m_ui.m_folders->itemText( i ) == name ) {
99 m_ui.m_folders->setCurrentIndex( i );
105EditBookmarkDialog::EditBookmarkDialog( BookmarkManager *bookmarkManager,
QWidget *parent )
106 :
QDialog( parent ), d( new EditBookmarkDialogPrivate( this, bookmarkManager ) )
111void EditBookmarkDialog::setCoordinates(
const GeoDataCoordinates &coordinates )
113 d->m_bookmarkCoordinates = coordinates;
114 QObject::disconnect( d->m_ui.m_header, SIGNAL(valueChanged()),
this, SLOT(updateCoordinates()) );
116 if ( d->m_ui.m_header->name().isEmpty() ) {
117 d->m_ui.m_header->setName( coordinates.toString() );
120 d->m_ui.m_header->setLongitude( coordinates.longitude(GeoDataCoordinates::Degree) );
121 d->m_ui.m_header->setLatitude( coordinates.latitude(GeoDataCoordinates::Degree) );
122 QObject::connect( d->m_ui.m_header, SIGNAL(valueChanged()),
this, SLOT(updateCoordinates()) );
125void EditBookmarkDialog::setRange( qreal range ) {
129void EditBookmarkDialog::setName(
const QString &text )
131 QObject::disconnect( d->m_ui.m_header, SIGNAL(valueChanged()),
this, SLOT(updateCoordinates()) );
132 d->m_ui.m_header->setName( text );
133 d->m_ui.m_header->selectAll();
134 QObject::connect( d->m_ui.m_header, SIGNAL(valueChanged()),
this, SLOT(updateCoordinates()) );
137void EditBookmarkDialog::setDescription(
const QString &text )
139 QObject::disconnect( d->m_ui.m_header, SIGNAL(valueChanged()),
this, SLOT(updateCoordinates()) );
140 d->m_ui.m_description->setText( text );
141 QObject::connect( d->m_ui.m_header, SIGNAL(valueChanged()),
this, SLOT(updateCoordinates()) );
144void EditBookmarkDialog::setFolderName(
const QString &name )
146 d->setFolderName( name );
149void EditBookmarkDialog::setIconLink(
const QString &iconLink)
151 QObject::disconnect( d->m_ui.m_header, SIGNAL(valueChanged()),
this, SLOT(updateCoordinates()) );
152 d->m_ui.m_header->setIconLink( iconLink );
153 QObject::connect( d->m_ui.m_header, SIGNAL(valueChanged()),
this, SLOT(updateCoordinates()) );
156void EditBookmarkDialog::setMarbleWidget( MarbleWidget* widget )
158 d->m_widget = widget;
159 const AngleUnit defaultAngleUnit = d->m_widget->defaultAngleUnit();
160 const GeoDataCoordinates::Notation notation =
161 (defaultAngleUnit ==
DecimalDegree) ? GeoDataCoordinates::Decimal :
162 (defaultAngleUnit ==
DMSDegree) ? GeoDataCoordinates::DMS :
163 GeoDataCoordinates::
UTM;
164 d->m_ui.m_header->setNotation(notation);
166 d->m_manager =
new ReverseGeocodingRunnerManager( d->m_widget->model(),
this );
167 QObject::connect( d->m_manager, SIGNAL(reverseGeocodingFinished(GeoDataCoordinates,GeoDataPlacemark)),
168 this, SLOT(retrieveGeocodeResult(GeoDataCoordinates,GeoDataPlacemark)) );
171void EditBookmarkDialog::setReverseGeocodeName()
173 if ( !d->m_manager ) {
177 d->m_manager->reverseGeocoding( d->m_bookmarkCoordinates );
180EditBookmarkDialog::~EditBookmarkDialog()
185void EditBookmarkDialogPrivate::retrieveGeocodeResult(
const GeoDataCoordinates &coordinates,
const GeoDataPlacemark &placemark)
187 Q_UNUSED(coordinates)
188 GeoDataExtendedData data = placemark.extendedData();
190 qreal
distance = m_widget->distance() * KM2METER;
193 if( distance >= 3500 ) {
194 bookmarkName = data.value(QStringLiteral(
"country")).value().toString();
196 else if( distance >= 200 ) {
197 bookmarkName = append(data.value(QStringLiteral(
"city")).value().
toString(),
198 data.value(QStringLiteral(
"state")).value().
toString());
199 bookmarkName = append(bookmarkName, data.value(QStringLiteral(
"country")).value().
toString());
202 bookmarkName = append(data.value(QStringLiteral(
"road")).value().
toString(),
203 data.value(QStringLiteral(
"city")).value().
toString());
204 bookmarkName = append(bookmarkName, data.value(QStringLiteral(
"country")).value().
toString());
208 bookmarkName = placemark.address();
211 m_ui.m_header->setName( bookmarkName );
212 m_ui.m_header->selectAll();
220 else if( bookmark.
isEmpty() ) {
226 return bookmark +
", " + text;
229void EditBookmarkDialogPrivate::openNewFolderDialog()
233 m_bookmarkManager->addNewBookmarkFolder( m_bookmarkManager->document(), dialog->folderName() );
234 m_ui.m_folders->clear();
235 initComboBox( m_bookmarkManager->document() );
236 setFolderName( dialog->folderName() );
241void EditBookmarkDialogPrivate::updateCoordinates()
243 m_bookmarkCoordinates.setLongitude( m_ui.m_header->longitude(), GeoDataCoordinates::Degree );
244 m_bookmarkCoordinates.setLatitude( m_ui.m_header->latitude(), GeoDataCoordinates::Degree );
247GeoDataPlacemark EditBookmarkDialog::bookmark()
const
250 GeoDataPlacemark bookmark;
251 bookmark.setName(
name() );
252 bookmark.setDescription( description() );
253 GeoDataStyle::Ptr newStyle(
new GeoDataStyle( *bookmark.style() ));
254 newStyle->iconStyle().setIconPath( iconLink() );
255 bookmark.setStyle( newStyle );
257 bookmark.setDescriptionCDATA(
true );
258 bookmark.setCoordinate( coordinates() );
260 GeoDataLookAt *lookat =
new GeoDataLookAt;
261 lookat->setCoordinates( coordinates() );
262 lookat->setRange( range() );
263 bookmark.setAbstractView( lookat );
266 bookmark.extendedData().addValue(GeoDataData(QStringLiteral(
"isBookmark"),
true));
268 if(d->m_widget !=
nullptr) {
269 const QString celestialName = d->m_widget->model()->planetId();
271 bookmark.extendedData().addValue(GeoDataData(QStringLiteral(
"celestialBody"), celestialName));
278QString EditBookmarkDialog::name()
const
280 return d->m_ui.m_header->name();
283GeoDataFolder *EditBookmarkDialog::folder()
const
285 return qvariant_cast<GeoDataFolder*>(d->m_ui.m_folders->itemData(d->m_ui.m_folders->currentIndex()));
288QString EditBookmarkDialog::description()
const
290 return d->m_ui.m_description->toPlainText();
293GeoDataCoordinates EditBookmarkDialog::coordinates()
const
295 return d->m_bookmarkCoordinates;
298qreal EditBookmarkDialog::range()
const {
302QString EditBookmarkDialog::iconLink()
const
304 return d->m_ui.m_header->iconLink();
309#include "moc_EditBookmarkDialog.cpp"
This file contains the headers for MarbleModel.
char * toString(const EngineQuery &query)
QString name(StandardShortcut id)
Binds a QML item to a specific geodetic location in screen coordinates.
AngleUnit
This enum is used to choose the unit chosen to measure angles.
@ DMSDegree
Degrees in DMS notation.
@ DecimalDegree
Degrees in decimal notation.
KOSM_EXPORT double distance(const std::vector< const OSM::Node * > &path, Coordinate coord)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
bool disconnect(const QMetaObject::Connection &connection)
bool isEmpty() const const
QString repeated(qsizetype times) const const
void setValue(QVariant &&value)