File indexing completed on 2024-04-21 03:49:29
0001 // SPDX-License-Identifier: LGPL-2.1-or-later 0002 // 0003 // SPDX-FileCopyrightText: 2010 Dennis Nienhüser <nienhueser@kde.org> 0004 // SPDX-FileCopyrightText: 2012 Thibaut Gridel <tgridel@free.fr> 0005 // 0006 0007 #include "BookmarkManagerDialog.h" 0008 #include "BookmarkManager.h" 0009 #include "BookmarkManager_p.h" 0010 #include "BranchFilterProxyModel.h" 0011 #include "EditBookmarkDialog.h" 0012 #include "FileManager.h" 0013 #include "GeoDataCoordinates.h" 0014 #include "GeoDataDocument.h" 0015 #include "GeoDataLookAt.h" 0016 #include "GeoDataExtendedData.h" 0017 #include "GeoDataFolder.h" 0018 #include "GeoDataPlacemark.h" 0019 #include "GeoDataPoint.h" 0020 #include "GeoDataStyle.h" 0021 #include "GeoDataIconStyle.h" 0022 #include "GeoDataTreeModel.h" 0023 #include "GeoDataTypes.h" 0024 #include "GeoDataDocumentWriter.h" 0025 #include "MarbleDirs.h" 0026 #include "MarbleDebug.h" 0027 #include "MarbleModel.h" 0028 #include "NewBookmarkFolderDialog.h" 0029 #include "MarblePlacemarkModel.h" 0030 #include <KmlElementDictionary.h> 0031 0032 #include <QPointer> 0033 #include <QFile> 0034 #include <QSortFilterProxyModel> 0035 #include <QFileDialog> 0036 #include <QMessageBox> 0037 0038 namespace Marble { 0039 0040 /* 0041 * The two list views use the model data like this: 0042 * 0043 * (folder filter) 0044 * 0045 * QSortFilterProxyModel => Folders View 0046 * / | 0047 * bookmarks.kml => GeoDataTreeModel | current folder sets filter 0048 * \ \ / 0049 * BranchFilterModel => Bookmarks View 0050 * 0051 * (placemark filter) (placemark list) 0052 * 0053 */ 0054 class BookmarkManagerDialogPrivate { 0055 Q_DECLARE_TR_FUNCTIONS(BookmarkManagerDialogPrivate) 0056 0057 public: 0058 BookmarkManagerDialog *m_parent; 0059 0060 BookmarkManager *const m_manager; 0061 0062 GeoDataTreeModel *const m_treeModel; 0063 0064 QSortFilterProxyModel m_folderFilterModel; 0065 0066 QPersistentModelIndex m_selectedFolder; 0067 0068 BranchFilterProxyModel m_branchFilterModel; 0069 0070 BookmarkManagerDialogPrivate( BookmarkManagerDialog* parent, MarbleModel *model ); 0071 0072 void initializeFoldersView( GeoDataTreeModel* treeModel ); 0073 0074 void initializeBookmarksView( GeoDataTreeModel* treeModel ); 0075 0076 void handleFolderSelection( const QModelIndex &index ); 0077 0078 void updateButtonState(); 0079 0080 void addNewFolder(); 0081 0082 void renameFolder(); 0083 0084 void deleteFolder(); 0085 0086 void editBookmark(); 0087 0088 void deleteBookmark(); 0089 0090 void discardChanges(); 0091 0092 QModelIndex bookmarkTreeIndex( const QModelIndex &bookmark ) const; 0093 0094 QModelIndex folderTreeIndex( const QModelIndex &index ) const; 0095 GeoDataContainer* selectedFolder(); 0096 0097 void selectFolder( const QString &name = QString(), const QModelIndex &index = QModelIndex() ); 0098 0099 void importBookmarksRecursively( GeoDataContainer *source, GeoDataContainer *destination, 0100 bool &replaceAll, bool &skipAll ); 0101 0102 GeoDataDocument* bookmarkDocument(); 0103 }; 0104 0105 BookmarkManagerDialogPrivate::BookmarkManagerDialogPrivate( BookmarkManagerDialog* parent, MarbleModel *model ) : 0106 m_parent( parent ), 0107 m_manager( model->bookmarkManager() ), 0108 m_treeModel( model->treeModel() ), 0109 m_folderFilterModel(), 0110 m_branchFilterModel() 0111 { 0112 // nothing to do 0113 } 0114 0115 /// react to clicking on the folder index (of folderfiltermodel fame) 0116 /// consequence is selecting this folder, or unselecting it and going to root folder 0117 void BookmarkManagerDialogPrivate::handleFolderSelection( const QModelIndex &index ) 0118 { 0119 if( !index.isValid() ) { 0120 return; 0121 } 0122 Q_ASSERT( index.isValid() ); 0123 Q_ASSERT( index.model() == &m_folderFilterModel ); 0124 if( m_selectedFolder.isValid() && 0125 m_parent->foldersTreeView->selectionModel()->selectedIndexes().contains( m_selectedFolder ) ) { 0126 m_selectedFolder = QModelIndex(); 0127 m_parent->foldersTreeView->selectionModel()->clear(); 0128 selectFolder(); 0129 } else { 0130 m_selectedFolder = index; 0131 m_branchFilterModel.setBranchIndex( m_treeModel, folderTreeIndex( index ) ); 0132 m_parent->bookmarksListView->setRootIndex( 0133 m_branchFilterModel.mapFromSource( folderTreeIndex( index ) ) ); 0134 m_parent->bookmarksListView->selectionModel()->clear(); 0135 } 0136 } 0137 0138 void BookmarkManagerDialogPrivate::updateButtonState() 0139 { 0140 bool const hasFolderSelection = !m_parent->foldersTreeView->selectionModel()->selectedIndexes().isEmpty(); 0141 m_parent->renameFolderButton->setEnabled( hasFolderSelection ); 0142 m_parent->removeFolderButton->setEnabled( hasFolderSelection ); 0143 0144 bool const hasBookmarkSelection = !m_parent->bookmarksListView->selectionModel()->selectedIndexes().isEmpty(); 0145 m_parent->editBookmarkButton->setEnabled( hasBookmarkSelection ); 0146 m_parent->removeBookmarkButton->setEnabled( hasBookmarkSelection ); 0147 } 0148 0149 void BookmarkManagerDialogPrivate::addNewFolder() 0150 { 0151 QPointer<NewBookmarkFolderDialog> dialog = new NewBookmarkFolderDialog( m_parent ); 0152 if ( dialog->exec() == QDialog::Accepted && !dialog->folderName().isEmpty() ) { 0153 m_manager->addNewBookmarkFolder( selectedFolder(), dialog->folderName() ); 0154 selectFolder( dialog->folderName(), m_selectedFolder ); 0155 } 0156 delete dialog; 0157 } 0158 0159 void BookmarkManagerDialogPrivate::renameFolder() 0160 { 0161 GeoDataFolder *folder = geodata_cast<GeoDataFolder>(selectedFolder()); 0162 if ( folder ) { 0163 QPointer<NewBookmarkFolderDialog> dialog = new NewBookmarkFolderDialog( m_parent ); 0164 dialog->setFolderName( folder->name() ); 0165 QPersistentModelIndex parentIndex = m_selectedFolder.parent(); 0166 if ( dialog->exec() == QDialog::Accepted ) { 0167 m_manager->renameBookmarkFolder( folder, dialog->folderName() ); 0168 } 0169 selectFolder( dialog->folderName(), parentIndex ); 0170 delete dialog; 0171 } 0172 } 0173 0174 void BookmarkManagerDialogPrivate::deleteFolder() 0175 { 0176 GeoDataFolder *folder = geodata_cast<GeoDataFolder>(selectedFolder()); 0177 if ( folder ) { 0178 if ( folder->size() > 0 ) { 0179 QString const text = tr( "The folder %1 is not empty. Removing it will delete all bookmarks it contains. Are you sure you want to delete the folder?" ).arg( folder->name() ); 0180 if (QMessageBox::question(m_parent, tr("Remove Folder"), text, QMessageBox::Yes, QMessageBox::No) != QMessageBox::Yes) { 0181 return; 0182 } 0183 } 0184 0185 // take note of the parentIndex before removing the folder 0186 QString parent = static_cast<GeoDataContainer*>(folder->parent())->name(); 0187 QPersistentModelIndex greatParentIndex = m_selectedFolder.parent().parent(); 0188 m_manager->removeBookmarkFolder( folder ); 0189 selectFolder( parent, greatParentIndex); 0190 } 0191 } 0192 0193 void BookmarkManagerDialogPrivate::editBookmark() 0194 { 0195 QModelIndexList selection = m_parent->bookmarksListView->selectionModel()->selectedIndexes(); 0196 if ( selection.size() == 1 ) { 0197 QModelIndex index = m_branchFilterModel.mapToSource( selection.first() ); 0198 Q_ASSERT( index.isValid() ); 0199 GeoDataObject* object = qvariant_cast<GeoDataObject*>( index.data( MarblePlacemarkModel::ObjectPointerRole ) ); 0200 Q_ASSERT( object ); 0201 GeoDataPlacemark *bookmark = geodata_cast<GeoDataPlacemark>(object); 0202 // do not try to edit folders 0203 if ( !bookmark ) { 0204 return; 0205 } 0206 Q_ASSERT( bookmark ); 0207 QModelIndex treeIndex = index; 0208 Q_ASSERT( treeIndex.isValid() ); 0209 QModelIndex folderIndex = treeIndex.parent(); 0210 Q_ASSERT( folderIndex.isValid() ); 0211 GeoDataObject* folderObject = qvariant_cast<GeoDataObject*>( folderIndex.data( MarblePlacemarkModel::ObjectPointerRole ) ); 0212 Q_ASSERT( folderObject ); 0213 GeoDataFolder* folder = geodata_cast<GeoDataFolder>(folderObject); 0214 Q_ASSERT( folder ); 0215 0216 QPointer<EditBookmarkDialog> dialog = new EditBookmarkDialog( m_manager, m_parent ); 0217 dialog->setName( bookmark->name() ); 0218 if ( bookmark->lookAt() ) { 0219 dialog->setRange( bookmark->lookAt()->range() ); 0220 } 0221 dialog->setCoordinates( bookmark->coordinate() ); 0222 dialog->setDescription( bookmark->description() ); 0223 dialog->setFolderName( folder->name() ); 0224 dialog->setIconLink( bookmark->style()->iconStyle().iconPath() ); 0225 if ( dialog->exec() == QDialog::Accepted ) { 0226 bookmark->setName( dialog->name() ); 0227 bookmark->setDescription( dialog->description() ); 0228 bookmark->setCoordinate( dialog->coordinates() ); 0229 GeoDataStyle::Ptr newStyle(new GeoDataStyle( *bookmark->style() )); 0230 newStyle->iconStyle().setIconPath( dialog->iconLink() ); 0231 bookmark->setStyle( newStyle ); 0232 if ( bookmark->lookAt() ) { 0233 bookmark->lookAt()->setCoordinates( dialog->coordinates() ); 0234 bookmark->lookAt()->setRange( dialog->range() ); 0235 } else if ( dialog->range() ) { 0236 GeoDataLookAt *lookat = new GeoDataLookAt; 0237 lookat->setCoordinates( dialog->coordinates() ); 0238 lookat->setRange( dialog->range() ); 0239 bookmark->setAbstractView( lookat ); 0240 } 0241 m_manager->updateBookmark( bookmark ); 0242 0243 if (folder->name() != dialog->folder()->name() ) { 0244 GeoDataPlacemark newBookmark( *bookmark ); 0245 m_manager->removeBookmark( bookmark ); 0246 m_manager->addBookmark( dialog->folder(), newBookmark ); 0247 } 0248 } 0249 delete dialog; 0250 } 0251 } 0252 0253 void BookmarkManagerDialogPrivate::deleteBookmark() 0254 { 0255 const QModelIndexList selection = m_parent->bookmarksListView->selectionModel()->selectedIndexes(); 0256 0257 if (selection.size() != 1) { 0258 return; 0259 } 0260 0261 const QModelIndex bookmarkIndex = m_branchFilterModel.mapToSource(selection.first()); 0262 GeoDataFolder *folder = geodata_cast<GeoDataFolder>(selectedFolder()); 0263 if (!folder) { 0264 return; 0265 } 0266 0267 GeoDataPlacemark *bookmark = geodata_cast<GeoDataPlacemark>(folder->child(bookmarkIndex.row())); 0268 if (!bookmark) { 0269 return; 0270 } 0271 0272 m_manager->removeBookmark(bookmark); 0273 } 0274 0275 void BookmarkManagerDialogPrivate::discardChanges() 0276 { 0277 m_manager->loadFile( "bookmarks/bookmarks.kml" ); 0278 } 0279 0280 /// selects the folder name from its parent (of folder filter fame) 0281 void BookmarkManagerDialogPrivate::selectFolder( const QString &name, const QModelIndex &parent ) 0282 { 0283 if ( parent.isValid() ) { 0284 Q_ASSERT( parent.model() == &m_folderFilterModel ); 0285 } 0286 0287 if ( name.isEmpty() ) { 0288 QModelIndex documentTreeIndex = m_treeModel->index( bookmarkDocument() ); 0289 QModelIndex folderFilterIndex = m_folderFilterModel.mapFromSource( documentTreeIndex ); 0290 Q_ASSERT( folderFilterIndex.isValid() ); 0291 m_parent->foldersTreeView->setCurrentIndex( folderFilterIndex ); 0292 handleFolderSelection( folderFilterIndex ); 0293 return; 0294 } 0295 0296 for ( int i=0; i < m_folderFilterModel.rowCount( parent ); ++i ) { 0297 QModelIndex childIndex = m_folderFilterModel.index( i, 0, parent ); 0298 if ( childIndex.data().toString() == name 0299 && m_selectedFolder != childIndex ) { 0300 m_parent->foldersTreeView->setCurrentIndex( childIndex ); 0301 handleFolderSelection( childIndex ); 0302 return; 0303 } 0304 if ( m_folderFilterModel.hasChildren( childIndex ) ) { 0305 selectFolder( name, childIndex ); 0306 } 0307 } 0308 } 0309 0310 QModelIndex BookmarkManagerDialogPrivate::folderTreeIndex( const QModelIndex &index ) const 0311 { 0312 Q_ASSERT( index.isValid() ); 0313 Q_ASSERT( index.model() == &m_folderFilterModel ); 0314 QModelIndex const treeModelIndex = m_folderFilterModel.mapToSource( index ); 0315 Q_ASSERT( treeModelIndex.isValid() ); 0316 Q_ASSERT( treeModelIndex.model() == m_treeModel ); 0317 return treeModelIndex; 0318 } 0319 0320 GeoDataContainer *BookmarkManagerDialogPrivate::selectedFolder() 0321 { 0322 if( m_selectedFolder.isValid() ) { 0323 GeoDataObject* object = qvariant_cast<GeoDataObject*>( m_selectedFolder.data( MarblePlacemarkModel::ObjectPointerRole ) ); 0324 Q_ASSERT( object ); 0325 GeoDataContainer* container = dynamic_cast<GeoDataContainer*>( object ); 0326 Q_ASSERT( container ); 0327 return container; 0328 } else { 0329 return bookmarkDocument(); 0330 } 0331 } 0332 0333 void BookmarkManagerDialogPrivate::initializeFoldersView( GeoDataTreeModel* treeModel ) 0334 { 0335 m_folderFilterModel.setFilterKeyColumn( 1 ); 0336 const QString regexp = QLatin1String(GeoDataTypes::GeoDataFolderType) + QLatin1Char('|') + QLatin1String(GeoDataTypes::GeoDataDocumentType); 0337 m_folderFilterModel.setFilterRegExp( regexp ); 0338 m_folderFilterModel.setSourceModel( treeModel ); 0339 0340 m_parent->foldersTreeView->setModel( &m_folderFilterModel ); 0341 m_parent->foldersTreeView->setEditTriggers( QAbstractItemView::NoEditTriggers ); 0342 m_parent->foldersTreeView->setHeaderHidden( true ); 0343 for ( int i=1; i<m_treeModel->columnCount(); ++i ) { 0344 m_parent->foldersTreeView->hideColumn( i ); 0345 } 0346 m_parent->foldersTreeView->setRootIndex( m_folderFilterModel.mapFromSource( 0347 m_treeModel->index( bookmarkDocument() ))); 0348 0349 m_parent->connect( m_parent->foldersTreeView, 0350 SIGNAL(clicked(QModelIndex)), 0351 m_parent, SLOT(handleFolderSelection(QModelIndex)) ); 0352 m_parent->connect( m_parent->foldersTreeView->selectionModel(), 0353 SIGNAL(selectionChanged(QItemSelection,QItemSelection)), 0354 m_parent, SLOT(updateButtonState()) ); 0355 m_parent->connect( m_parent->renameFolderButton, SIGNAL(clicked(bool)), 0356 m_parent, SLOT(renameFolder()) ); 0357 m_parent->connect( m_parent->newFolderButton, SIGNAL(clicked(bool)), 0358 m_parent, SLOT(addNewFolder()) ); 0359 m_parent->connect( m_parent->removeFolderButton, SIGNAL(clicked(bool)), 0360 m_parent, SLOT(deleteFolder()) ); 0361 } 0362 0363 void BookmarkManagerDialogPrivate::initializeBookmarksView( GeoDataTreeModel* treeModel ) 0364 { 0365 m_branchFilterModel.setSourceModel( treeModel ); 0366 0367 m_parent->bookmarksListView->setModel( &m_branchFilterModel ); 0368 m_parent->bookmarksListView->setEditTriggers( QAbstractItemView::NoEditTriggers ); 0369 0370 m_parent->connect( m_parent->bookmarksListView->selectionModel(), 0371 SIGNAL(selectionChanged(QItemSelection,QItemSelection)), 0372 m_parent, SLOT(updateButtonState()) ); 0373 m_parent->connect( m_parent->editBookmarkButton, SIGNAL(clicked(bool)), 0374 m_parent, SLOT(editBookmark()) ); 0375 m_parent->connect( m_parent->removeBookmarkButton, SIGNAL(clicked(bool)), 0376 m_parent, SLOT(deleteBookmark()) ); 0377 } 0378 0379 BookmarkManagerDialog::BookmarkManagerDialog( MarbleModel* model, QWidget *parent ) 0380 : QDialog( parent ), 0381 d( new BookmarkManagerDialogPrivate( this, model ) ) 0382 { 0383 setupUi( this ); 0384 bool const smallScreen = MarbleGlobal::getInstance()->profiles() & MarbleGlobal::SmallScreen; 0385 importButton->setVisible( !smallScreen ); 0386 exportButton->setVisible( !smallScreen ); 0387 foldersLabel->setVisible( !smallScreen ); 0388 bookmarkLabel->setVisible( !smallScreen ); 0389 0390 d->initializeFoldersView( d->m_treeModel ); 0391 d->initializeBookmarksView( d->m_treeModel ); 0392 d->updateButtonState(); 0393 0394 connect( this, SIGNAL(accepted()), SLOT(saveBookmarks()) ); 0395 connect( this, SIGNAL(rejected()), SLOT(discardChanges()) ); 0396 connect( exportButton, SIGNAL(clicked()), this, SLOT(exportBookmarks()) ); 0397 connect( importButton, SIGNAL(clicked()), this, SLOT(importBookmarks()) ); 0398 0399 d->selectFolder(); 0400 } 0401 0402 BookmarkManagerDialog::~BookmarkManagerDialog() 0403 { 0404 delete d; 0405 } 0406 0407 void BookmarkManagerDialog::saveBookmarks() 0408 { 0409 d->m_manager->updateBookmarkFile(); 0410 } 0411 0412 void BookmarkManagerDialog::exportBookmarks() 0413 { 0414 QString fileName = QFileDialog::getSaveFileName( this, tr( "Export Bookmarks" ), // krazy:exclude=qclasses 0415 QDir::homePath(), tr( "KML files (*.kml)" ) ); 0416 0417 if ( !fileName.isEmpty() ) { 0418 if (!GeoDataDocumentWriter::write(fileName, *d->bookmarkDocument())) { 0419 mDebug() << "Could not write the bookmarks file" << fileName; 0420 QString const text = tr( "Unable to save bookmarks. Please check that the file is writable." ); 0421 QMessageBox::warning(this, tr("Bookmark Export"), text); 0422 } 0423 } 0424 } 0425 0426 void BookmarkManagerDialog::importBookmarks() 0427 { 0428 QString const file = QFileDialog::getOpenFileName(this, tr("Import Bookmarks"), 0429 QDir::homePath(), tr( "KML Files (*.kml)" ) ); 0430 if ( file.isEmpty() ) { 0431 return; 0432 } 0433 0434 GeoDataDocument *import = BookmarkManager::openFile( file ); 0435 if ( !import ) { 0436 QString const text = tr( "The file %1 cannot be opened as a KML file." ).arg( file ); 0437 QMessageBox::warning(this, tr( "Bookmark Import"), text); 0438 return; 0439 } 0440 GeoDataDocument *current = d->bookmarkDocument(); 0441 0442 bool skipAll = false; 0443 bool replaceAll = false; 0444 d->importBookmarksRecursively(import, current, skipAll, replaceAll); 0445 0446 d->selectFolder(); 0447 } 0448 0449 void BookmarkManagerDialogPrivate::importBookmarksRecursively( GeoDataContainer *source, GeoDataContainer *destination, bool &replaceAll, bool &skipAll ) 0450 { 0451 for( GeoDataFolder *newFolder: source->folderList() ) { 0452 GeoDataFolder *existingFolder = m_manager->addNewBookmarkFolder(destination, newFolder->name()); 0453 importBookmarksRecursively(newFolder, existingFolder, skipAll, replaceAll); 0454 for( GeoDataPlacemark* newPlacemark: newFolder->placemarkList() ) { 0455 bool added = skipAll; 0456 0457 GeoDataCoordinates newCoordinate = newPlacemark->coordinate(); 0458 GeoDataPlacemark *existingPlacemark = m_manager->bookmarkAt( m_manager->document(), newCoordinate ); 0459 if ( existingPlacemark ) { 0460 if ( skipAll ) { 0461 continue; 0462 } 0463 0464 // Avoid message boxes for equal bookmarks, just skip them 0465 if ( existingPlacemark->name() == newPlacemark->name() && 0466 existingPlacemark->description() == newPlacemark->description() ) { 0467 continue; 0468 } 0469 0470 QPointer<QMessageBox> messageBox = new QMessageBox( m_parent ); 0471 QString const intro = tr( "The file contains a bookmark that already exists among your Bookmarks." ); 0472 QString const newBookmark = tr( "Imported bookmark" ); 0473 QString const existingBookmark = tr( "Existing bookmark" ); 0474 QString const question = tr( "Do you want to replace the existing bookmark with the imported one?" ); 0475 QString html = QLatin1String("<p>%1</p><table><tr><td>%2</td><td><b>%3 / %4</b></td></tr>" 0476 "<tr><td>%5</td><td><b>%6 / %7</b></td></tr></table><p>%8</p>"); 0477 html = html.arg( intro, existingBookmark, existingFolder->name(), 0478 existingPlacemark->name(), newBookmark, newFolder->name(), 0479 newPlacemark->name(), question ); 0480 messageBox->setText( html ); 0481 0482 QAbstractButton *replaceButton = messageBox->addButton(tr( "Replace" ), QMessageBox::ActionRole ); 0483 QAbstractButton *replaceAllButton = messageBox->addButton(tr( "Replace All" ), QMessageBox::ActionRole ); 0484 QAbstractButton *skipButton = messageBox->addButton(tr( "Skip" ), QMessageBox::ActionRole ); 0485 QAbstractButton *skipAllButton = messageBox->addButton(tr( "Skip All" ), QMessageBox::ActionRole ); 0486 messageBox->addButton( QMessageBox::Cancel ); 0487 messageBox->setIcon( QMessageBox::Question ); 0488 0489 if ( !replaceAll ) { 0490 messageBox->exec(); 0491 } 0492 if ( messageBox->clickedButton() == replaceAllButton ) { 0493 replaceAll = true; 0494 } else if ( messageBox->clickedButton() == skipAllButton ) { 0495 skipAll = true; 0496 added = true; 0497 } else if ( messageBox->clickedButton() == skipButton ) { 0498 delete messageBox; 0499 continue; 0500 } else if ( messageBox->clickedButton() != replaceButton ) { 0501 delete messageBox; 0502 return; 0503 } 0504 0505 if ( messageBox->clickedButton() == replaceButton || replaceAll ) { 0506 m_manager->removeBookmark( existingPlacemark ); 0507 m_manager->addBookmark( existingFolder, *newPlacemark ); 0508 0509 mDebug() << "Placemark " << newPlacemark->name() << " replaces " << existingPlacemark->name(); 0510 delete messageBox; 0511 break; 0512 } 0513 delete messageBox; 0514 } 0515 0516 if ( !added ) { 0517 m_manager->addBookmark( existingFolder, *newPlacemark ); 0518 } 0519 } 0520 } 0521 } 0522 0523 GeoDataDocument* BookmarkManagerDialogPrivate::bookmarkDocument() 0524 { 0525 return m_manager->document(); 0526 } 0527 0528 void BookmarkManagerDialog::setButtonBoxVisible( bool visible ) 0529 { 0530 buttonBox->setVisible( visible ); 0531 if ( !visible ) { 0532 disconnect( this, SIGNAL(rejected()), this, SLOT(discardChanges()) ); 0533 connect( this, SIGNAL(rejected()), SLOT(saveBookmarks()) ); 0534 } 0535 } 0536 0537 } 0538 0539 #include "moc_BookmarkManagerDialog.cpp"