diff --git a/src/lib/marble/BookmarkManager.h b/src/lib/marble/BookmarkManager.h --- a/src/lib/marble/BookmarkManager.h +++ b/src/lib/marble/BookmarkManager.h @@ -25,6 +25,7 @@ class GeoDataContainer; class GeoDataDocument; class GeoDataPlacemark; + class GeoDataCoordinates; class GeoDataFolder; class GeoDataTreeModel; class StyleBuilder; @@ -59,14 +60,20 @@ /** * @brief add bookmark in a folder * @param bookmark bookmark to be added - * @param folderName folder name in which bookmark to be added + * @param folder folder to add bookmark to */ void addBookmark( GeoDataContainer *folder, const GeoDataPlacemark &bookmark ) ; void updateBookmark( GeoDataPlacemark *bookmark ); void removeBookmark( GeoDataPlacemark *bookmark ); + /** + * @brief checks all the bookmarks in container recursively and returns + * pointer to the one having the same coordinate as the provided + */ + GeoDataPlacemark* containsCoordinate(GeoDataContainer *container, GeoDataCoordinates &coordinate); + GeoDataDocument * document(); const GeoDataDocument * document() const; @@ -79,9 +86,10 @@ /** * @brief add a folder - * @param folder name of folder to be created + * @param name name of folder to be created + * @return pointer to the newly added folder */ - void addNewBookmarkFolder( GeoDataContainer *folder, const QString &name ); + GeoDataFolder* addNewBookmarkFolder( GeoDataContainer *container, const QString &name ); void renameBookmarkFolder( GeoDataFolder *folder, const QString &name ); diff --git a/src/lib/marble/BookmarkManager.cpp b/src/lib/marble/BookmarkManager.cpp --- a/src/lib/marble/BookmarkManager.cpp +++ b/src/lib/marble/BookmarkManager.cpp @@ -131,7 +131,6 @@ return true; } - void BookmarkManager::addBookmark( GeoDataContainer *container, const GeoDataPlacemark &placemark ) { GeoDataPlacemark *bookmark = new GeoDataPlacemark( placemark ); @@ -162,6 +161,22 @@ updateBookmarkFile(); } +GeoDataPlacemark* BookmarkManager::containsCoordinate( GeoDataContainer *container, GeoDataCoordinates &coordinate ) +{ + foreach ( GeoDataFolder *folder, container->folderList() ) { + GeoDataPlacemark *placemark = containsCoordinate(folder, coordinate); + if ( placemark ) + return placemark; + } + + foreach ( GeoDataPlacemark *placemark, container->placemarkList() ) { + if ( placemark->coordinate() == coordinate ) + return placemark; + } + + return Q_NULLPTR; +} + GeoDataDocument * BookmarkManager::document() { return d->m_bookmarkDocument; @@ -188,12 +203,12 @@ return d->m_bookmarkDocument->folderList(); } -void BookmarkManager::addNewBookmarkFolder( GeoDataContainer *container, const QString &name ) +GeoDataFolder* BookmarkManager::addNewBookmarkFolder( GeoDataContainer *container, const QString &name ) { //If name is empty string if ( name.isEmpty() ) { mDebug() << "Folder with empty name is not acceptable, please give it another name" ; - return; + return Q_NULLPTR; } //If folder with same name already exist @@ -204,15 +219,17 @@ for ( ; i != end; ++i ) { if ( name == ( *i )->name() ) { mDebug() << "Folder with same name already exist, please give it another name"; - return; + return *i; } } GeoDataFolder *bookmarkFolder = new GeoDataFolder(); bookmarkFolder->setName( name ); d->m_treeModel->addFeature( container, bookmarkFolder ); updateBookmarkFile(); + + return bookmarkFolder; } void BookmarkManager::renameBookmarkFolder( GeoDataFolder *folder, const QString &name ) diff --git a/src/lib/marble/BookmarkManagerDialog.h b/src/lib/marble/BookmarkManagerDialog.h --- a/src/lib/marble/BookmarkManagerDialog.h +++ b/src/lib/marble/BookmarkManagerDialog.h @@ -20,6 +20,7 @@ { class GeoDataDocument; +class GeoDataContainer; class MarbleModel; class BookmarkManagerDialogPrivate; @@ -44,6 +45,9 @@ void importBookmarks(); private: + void importBookmarksRecursively( GeoDataContainer *source, GeoDataContainer *destination, + bool &replaceAll, bool &skipAll ); + GeoDataDocument* bookmarkDocument(); Q_PRIVATE_SLOT( d, void updateButtonState() ) diff --git a/src/lib/marble/BookmarkManagerDialog.cpp b/src/lib/marble/BookmarkManagerDialog.cpp --- a/src/lib/marble/BookmarkManagerDialog.cpp +++ b/src/lib/marble/BookmarkManagerDialog.cpp @@ -428,86 +428,90 @@ QMessageBox::warning(this, tr( "Bookmark Import"), text); return; } + GeoDataDocument *current = bookmarkDocument(); - GeoDataDocument* current = bookmarkDocument(); - - bool replaceAll = false; bool skipAll = false; - foreach( GeoDataFolder* newFolder, import->folderList() ) { + bool replaceAll = false; + importBookmarksRecursively(import, current, skipAll, replaceAll); + + d->selectFolder(); +} + +void BookmarkManagerDialog::importBookmarksRecursively( GeoDataContainer *source, GeoDataContainer *destination, bool &replaceAll, bool &skipAll ) +{ + foreach( GeoDataFolder *newFolder, source->folderList() ) { + GeoDataFolder *existingFolder = d->m_manager->addNewBookmarkFolder(destination, newFolder->name()); + importBookmarksRecursively(newFolder, existingFolder, skipAll, replaceAll); foreach( GeoDataPlacemark* newPlacemark, newFolder->placemarkList() ) { bool added = skipAll; - foreach( GeoDataFolder* existingFolder, current->folderList() ) { - for( int i=0; isize() && !added; ++i ) { - GeoDataPlacemark* existingPlacemark = dynamic_cast( existingFolder->child( i ) ); - if ( existingPlacemark && existingPlacemark->coordinate() == newPlacemark->coordinate() ) { - - if ( skipAll ) { - continue; - } - - // Avoid message boxes for equal bookmarks, just skip them - if ( existingPlacemark->name() == newPlacemark->name() && - existingPlacemark->description() == newPlacemark->description() ) { - added = true; - continue; - } - - QPointer messageBox = new QMessageBox( this ); - QString const intro = tr( "The file contains a bookmark that already exists among your Bookmarks." ); - QString const newBookmark = tr( "Imported bookmark" ); - QString const existingBookmark = tr( "Existing bookmark" ); - QString const question = tr( "Do you want to replace the existing bookmark with the imported one?" ); - QString html = QLatin1String("

%1

" - "
%2%3 / %4
%5%6 / %7

%8

"); - html = html.arg( intro ).arg( existingBookmark ).arg( existingFolder->name() ); - html = html.arg( existingPlacemark->name() ).arg( newBookmark ).arg( newFolder->name() ); - html = html.arg( newPlacemark->name() ).arg( question ); - messageBox->setText( html ); - - QAbstractButton *replaceButton = messageBox->addButton(tr( "Replace" ), QMessageBox::ActionRole ); - QAbstractButton *replaceAllButton = messageBox->addButton(tr( "Replace All" ), QMessageBox::ActionRole ); - QAbstractButton *skipButton = messageBox->addButton(tr( "Skip" ), QMessageBox::ActionRole ); - QAbstractButton *skipAllButton = messageBox->addButton(tr( "Skip All" ), QMessageBox::ActionRole ); - messageBox->addButton(tr( "Cancel" ), QMessageBox::RejectRole ); - messageBox->setIcon( QMessageBox::Question ); - - if ( !replaceAll ) { - messageBox->exec(); - } - if ( messageBox->clickedButton() == replaceAllButton ) { - replaceAll = true; - } else if ( messageBox->clickedButton() == skipAllButton ) { - skipAll = true; - added = true; - } else if ( messageBox->clickedButton() == skipButton ) { - added = true; - delete messageBox; - continue; - } else if ( messageBox->clickedButton() != replaceButton ) { - delete messageBox; - return; - } - - if ( messageBox->clickedButton() == replaceButton || replaceAll ) { - d->m_manager->removeBookmark( existingPlacemark ); - d->m_manager->addBookmark( newFolder, *newPlacemark ); - mDebug() << "Placemark " << newPlacemark->name() << " replaces " << existingPlacemark->name(); - added = true; - delete messageBox; - break; - } - delete messageBox; - } + + GeoDataCoordinates newCoordinate = newPlacemark->coordinate(); + GeoDataPlacemark *existingPlacemark = d->m_manager->containsCoordinate( d->m_manager->document(), newCoordinate ); + if ( existingPlacemark ) { + if ( skipAll ) { + continue; } + + // Avoid message boxes for equal bookmarks, just skip them + if ( existingPlacemark->name() == newPlacemark->name() && + existingPlacemark->description() == newPlacemark->description() ) { + added = true; + continue; + } + + QPointer messageBox = new QMessageBox( this ); + QString const intro = tr( "The file contains a bookmark that already exists among your Bookmarks." ); + QString const newBookmark = tr( "Imported bookmark" ); + QString const existingBookmark = tr( "Existing bookmark" ); + QString const question = tr( "Do you want to replace the existing bookmark with the imported one?" ); + QString html = QLatin1String("

%1

" + "
%2%3 / %4
%5%6 / %7

%8

"); + html = html.arg( intro ).arg( existingBookmark ).arg( existingFolder->name() ); + html = html.arg( existingPlacemark->name() ).arg( newBookmark ).arg( newFolder->name() ); + html = html.arg( newPlacemark->name() ).arg( question ); + messageBox->setText( html ); + + QAbstractButton *replaceButton = messageBox->addButton(tr( "Replace" ), QMessageBox::ActionRole ); + QAbstractButton *replaceAllButton = messageBox->addButton(tr( "Replace All" ), QMessageBox::ActionRole ); + QAbstractButton *skipButton = messageBox->addButton(tr( "Skip" ), QMessageBox::ActionRole ); + QAbstractButton *skipAllButton = messageBox->addButton(tr( "Skip All" ), QMessageBox::ActionRole ); + messageBox->addButton(tr( "Cancel" ), QMessageBox::RejectRole ); + messageBox->setIcon( QMessageBox::Question ); + + if ( !replaceAll ) { + messageBox->exec(); + } + if ( messageBox->clickedButton() == replaceAllButton ) { + replaceAll = true; + } else if ( messageBox->clickedButton() == skipAllButton ) { + skipAll = true; + added = true; + } else if ( messageBox->clickedButton() == skipButton ) { + added = true; + delete messageBox; + continue; + } else if ( messageBox->clickedButton() != replaceButton ) { + delete messageBox; + return; + } + + if ( messageBox->clickedButton() == replaceButton || replaceAll ) { + d->m_manager->removeBookmark( existingPlacemark ); + d->m_manager->addBookmark( existingFolder, *newPlacemark ); + + mDebug() << "Placemark " << newPlacemark->name() << " replaces " << existingPlacemark->name(); + added = true; + delete messageBox; + break; + } + delete messageBox; } if ( !added ) { - d->m_manager->addBookmark( newFolder, *newPlacemark ); + d->m_manager->addBookmark( existingFolder, *newPlacemark ); } } } - - d->selectFolder(); } GeoDataDocument* BookmarkManagerDialog::bookmarkDocument()