• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

marble

  • sources
  • kde-4.14
  • kdeedu
  • marble
  • src
  • lib
  • marble
BookmarkManagerDialog.cpp
Go to the documentation of this file.
1 //
2 // This file is part of the Marble Virtual Globe.
3 //
4 // This program is free software licensed under the GNU LGPL. You can
5 // find a copy of this license in LICENSE.txt in the top directory of
6 // the source code.
7 //
8 // Copyright 2010 Dennis Nienhüser <earthwings@gentoo.org>
9 // Copyright 2012 Thibaut Gridel <tgridel@free.fr>
10 //
11 
12 #include "BookmarkManagerDialog.h"
13 #include "BookmarkManager.h"
14 #include "BookmarkManager_p.h"
15 #include "BranchFilterProxyModel.h"
16 #include "EditBookmarkDialog.h"
17 #include "FileManager.h"
18 #include "GeoDataCoordinates.h"
19 #include "GeoDataDocument.h"
20 #include "GeoDataExtendedData.h"
21 #include "GeoDataFolder.h"
22 #include "GeoDataPlacemark.h"
23 #include "GeoDataPoint.h"
24 #include "GeoDataTreeModel.h"
25 #include "GeoDataTypes.h"
26 #include "GeoWriter.h"
27 #include "MarbleDirs.h"
28 #include "MarbleDebug.h"
29 #include "MarbleModel.h"
30 #include "NewBookmarkFolderDialog.h"
31 #include "MarblePlacemarkModel.h"
32 #include <KmlElementDictionary.h>
33 
34 #include <QPointer>
35 #include <QFile>
36 #include <QSortFilterProxyModel>
37 #include <QFileDialog>
38 #include <QMessageBox>
39 #include <QItemSelectionModel>
40 
41 namespace Marble {
42 
43 /*
44  * The two list views use the model data like this:
45  *
46  * (folder filter)
47  *
48  * QSortFilterProxyModel => Folders View
49  * / |
50  * bookmarks.kml => GeoDataTreeModel | current folder sets filter
51  * \ \ /
52  * BranchFilterModel => Bookmarks View
53  *
54  * (placemark filter) (placemark list)
55  *
56  */
57 class BookmarkManagerDialogPrivate {
58 public:
59  BookmarkManagerDialog *m_parent;
60 
61  BookmarkManager *m_manager;
62 
63  GeoDataTreeModel* m_treeModel;
64 
65  QSortFilterProxyModel *m_folderFilterModel;
66 
67  QPersistentModelIndex m_selectedFolder;
68 
69  BranchFilterProxyModel *m_branchFilterModel;
70 
71  BookmarkManagerDialogPrivate( BookmarkManagerDialog* parent, BookmarkManager* manager );
72 
73  void initializeFoldersView( GeoDataTreeModel* treeModel );
74 
75  void initializeBookmarksView( GeoDataTreeModel* treeModel );
76 
77  void handleFolderSelection( const QModelIndex &index );
78 
79  void updateButtonState();
80 
81  void addNewFolder();
82 
83  void renameFolder();
84 
85  void deleteFolder();
86 
87  void editBookmark();
88 
89  void deleteBookmark();
90 
91  void discardChanges();
92 
93  QModelIndex bookmarkTreeIndex( const QModelIndex &bookmark ) const;
94 
95  QModelIndex folderTreeIndex( const QModelIndex &index ) const;
96  GeoDataContainer* selectedFolder();
97 
98  void selectFolder( const QString &name = QString(), const QModelIndex &index = QModelIndex() );
99 };
100 
101 BookmarkManagerDialogPrivate::BookmarkManagerDialogPrivate( BookmarkManagerDialog* parent, BookmarkManager* manager ) :
102  m_parent( parent ), m_manager( manager ), m_treeModel( 0 ), m_folderFilterModel( 0 ), m_branchFilterModel( 0 )
103 {
104  // nothing to do
105 }
106 
109 void BookmarkManagerDialogPrivate::handleFolderSelection( const QModelIndex &index )
110 {
111  if( !index.isValid() ) {
112  return;
113  }
114  Q_ASSERT( index.isValid() );
115  Q_ASSERT( index.model() == m_folderFilterModel );
116  if( m_selectedFolder.isValid() &&
117  m_parent->foldersTreeView->selectionModel()->selectedIndexes().contains( m_selectedFolder ) ) {
118  m_selectedFolder = QModelIndex();
119  m_parent->foldersTreeView->selectionModel()->clear();
120  selectFolder();
121  } else {
122  m_selectedFolder = index;
123  m_branchFilterModel->setBranchIndex( m_treeModel, folderTreeIndex( index ) );
124  m_parent->bookmarksListView->setRootIndex(
125  m_branchFilterModel->mapFromSource( folderTreeIndex( index ) ) );
126  m_parent->bookmarksListView->selectionModel()->clear();
127  }
128 }
129 
130 void BookmarkManagerDialogPrivate::updateButtonState()
131 {
132  bool const hasFolderSelection = !m_parent->foldersTreeView->selectionModel()->selectedIndexes().isEmpty();
133  m_parent->renameFolderButton->setEnabled( hasFolderSelection );
134  m_parent->removeFolderButton->setEnabled( hasFolderSelection );
135 
136  bool const hasBookmarkSelection = !m_parent->bookmarksListView->selectionModel()->selectedIndexes().isEmpty();
137  m_parent->editBookmarkButton->setEnabled( hasBookmarkSelection );
138  m_parent->removeBookmarkButton->setEnabled( hasBookmarkSelection );
139 }
140 
141 void BookmarkManagerDialogPrivate::addNewFolder()
142 {
143  QPointer<NewBookmarkFolderDialog> dialog = new NewBookmarkFolderDialog( m_parent );
144  if ( dialog->exec() == QDialog::Accepted && !dialog->folderName().isEmpty() ) {
145  m_manager->addNewBookmarkFolder( selectedFolder(), dialog->folderName() );
146  selectFolder( dialog->folderName(), m_selectedFolder );
147  }
148  delete dialog;
149 }
150 
151 void BookmarkManagerDialogPrivate::renameFolder()
152 {
153  GeoDataFolder *folder = dynamic_cast<GeoDataFolder*>(selectedFolder());
154  if ( folder ) {
155  QPointer<NewBookmarkFolderDialog> dialog = new NewBookmarkFolderDialog( m_parent );
156  dialog->setFolderName( folder->name() );
157  QPersistentModelIndex parentIndex = m_selectedFolder.parent();
158  if ( dialog->exec() == QDialog::Accepted ) {
159  m_manager->renameBookmarkFolder( folder, dialog->folderName() );
160  }
161  selectFolder( dialog->folderName(), parentIndex );
162  delete dialog;
163  }
164 }
165 
166 void BookmarkManagerDialogPrivate::deleteFolder()
167 {
168  GeoDataFolder *folder = dynamic_cast<GeoDataFolder*>(selectedFolder());
169  if ( folder ) {
170  if ( folder->size() > 0 ) {
171  QString const text = QObject::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() );
172  if ( QMessageBox::question( m_parent, QObject::tr("Remove Folder - Marble"), text, QMessageBox::Yes, QMessageBox::No ) != QMessageBox::Yes) {
173  return;
174  }
175  }
176 
177  // take note of the parentIndex before removing the folder
178  QString parent = static_cast<GeoDataContainer*>(folder->parent())->name();
179  QPersistentModelIndex greatParentIndex = m_selectedFolder.parent().parent();
180  m_manager->removeBookmarkFolder( folder );
181  selectFolder( parent, greatParentIndex);
182  }
183 }
184 
185 void BookmarkManagerDialogPrivate::editBookmark()
186 {
187  QModelIndexList selection = m_parent->bookmarksListView->selectionModel()->selectedIndexes();
188  if ( selection.size() == 1 ) {
189  QModelIndex index = m_branchFilterModel->mapToSource( selection.first() );
190  Q_ASSERT( index.isValid() );
191  GeoDataObject* object = qvariant_cast<GeoDataObject*>( index.data( MarblePlacemarkModel::ObjectPointerRole ) );
192  Q_ASSERT( object );
193  GeoDataPlacemark* bookmark = dynamic_cast<GeoDataPlacemark*>( object );
194  // do not try to edit folders
195  if ( !bookmark ) {
196  return;
197  }
198  Q_ASSERT( bookmark );
199  QModelIndex treeIndex = index;
200  Q_ASSERT( treeIndex.isValid() );
201  QModelIndex folderIndex = treeIndex.parent();
202  Q_ASSERT( folderIndex.isValid() );
203  GeoDataObject* folderObject = qvariant_cast<GeoDataObject*>( folderIndex.data( MarblePlacemarkModel::ObjectPointerRole ) );
204  Q_ASSERT( folderObject );
205  GeoDataFolder* folder = dynamic_cast<GeoDataFolder*>( folderObject );
206  Q_ASSERT( folder );
207 
208  QPointer<EditBookmarkDialog> dialog = new EditBookmarkDialog( m_manager, m_parent );
209  dialog->setName( bookmark->name() );
210  if ( bookmark->lookAt() ) {
211  dialog->setRange( bookmark->lookAt()->range() );
212  }
213  dialog->setCoordinates( bookmark->coordinate() );
214  dialog->setDescription( bookmark->description() );
215  dialog->setFolderName( folder->name() );
216  if ( dialog->exec() == QDialog::Accepted ) {
217  bookmark->setName( dialog->name() );
218  bookmark->setDescription( dialog->description() );
219  bookmark->setCoordinate( dialog->coordinates() );
220  if ( bookmark->lookAt() ) {
221  bookmark->lookAt()->setCoordinates( dialog->coordinates() );
222  bookmark->lookAt()->setRange( dialog->range() );
223  } else if ( dialog->range() ) {
224  GeoDataLookAt *lookat = new GeoDataLookAt;
225  lookat->setCoordinates( dialog->coordinates() );
226  lookat->setRange( dialog->range() );
227  bookmark->setAbstractView( lookat );
228  }
229  m_manager->updateBookmark( bookmark );
230 
231  if (folder->name() != dialog->folder()->name() ) {
232  GeoDataPlacemark newBookmark( *bookmark );
233  m_manager->removeBookmark( bookmark );
234  m_manager->addBookmark( dialog->folder(), newBookmark );
235  }
236  }
237  delete dialog;
238  }
239 }
240 
241 void BookmarkManagerDialogPrivate::deleteBookmark()
242 {
243  QModelIndexList selection = m_parent->bookmarksListView->selectionModel()->selectedIndexes();
244  if ( selection.size() == 1 ) {
245  QModelIndex bookmarkIndex = m_branchFilterModel->mapToSource( selection.first() );
246  GeoDataFolder* folder = dynamic_cast<GeoDataFolder*>( selectedFolder() );
247  if ( folder ) {
248  GeoDataPlacemark* bookmark = dynamic_cast<GeoDataPlacemark*>( folder->child( bookmarkIndex.row() ) );
249  if ( bookmark ) {
250  m_manager->removeBookmark( bookmark );
251  }
252  }
253  }
254 }
255 
256 void BookmarkManagerDialogPrivate::discardChanges()
257 {
258  m_manager->loadFile( "bookmarks/bookmarks.kml" );
259 }
260 
262 void BookmarkManagerDialogPrivate::selectFolder( const QString &name, const QModelIndex &parent )
263 {
264  if ( parent.isValid() ) {
265  Q_ASSERT( parent.model() == m_folderFilterModel );
266  }
267 
268  if ( name.isEmpty() ) {
269  QModelIndex documentTreeIndex = m_treeModel->index( m_parent->bookmarkDocument() );
270  QModelIndex folderFilterIndex = m_folderFilterModel->mapFromSource( documentTreeIndex );
271  Q_ASSERT( folderFilterIndex.isValid() );
272  m_parent->foldersTreeView->setCurrentIndex( folderFilterIndex );
273  handleFolderSelection( folderFilterIndex );
274  return;
275  }
276 
277  for ( int i=0; i < m_folderFilterModel->rowCount( parent ); ++i ) {
278  QModelIndex childIndex = m_folderFilterModel->index( i, 0, parent );
279  if ( childIndex.data().toString() == name
280  && m_selectedFolder != childIndex ) {
281  m_parent->foldersTreeView->setCurrentIndex( childIndex );
282  handleFolderSelection( childIndex );
283  return;
284  }
285  if ( m_folderFilterModel->hasChildren( childIndex ) ) {
286  selectFolder( name, childIndex );
287  }
288  }
289 }
290 
291 QModelIndex BookmarkManagerDialogPrivate::folderTreeIndex( const QModelIndex &index ) const
292 {
293  Q_ASSERT( index.isValid() );
294  Q_ASSERT( index.model() == m_folderFilterModel );
295  QModelIndex const treeModelIndex = m_folderFilterModel->mapToSource( index );
296  Q_ASSERT( treeModelIndex.isValid() );
297  Q_ASSERT( treeModelIndex.model() == m_treeModel );
298  return treeModelIndex;
299 }
300 
301 GeoDataContainer *BookmarkManagerDialogPrivate::selectedFolder()
302 {
303  if( m_selectedFolder.isValid() ) {
304  GeoDataObject* object = qvariant_cast<GeoDataObject*>( m_selectedFolder.data( MarblePlacemarkModel::ObjectPointerRole ) );
305  Q_ASSERT( object );
306  GeoDataContainer* container = dynamic_cast<GeoDataContainer*>( object );
307  Q_ASSERT( container );
308  return container;
309  } else {
310  return m_parent->bookmarkDocument();
311  }
312 }
313 
314 void BookmarkManagerDialogPrivate::initializeFoldersView( GeoDataTreeModel* treeModel )
315 {
316  m_folderFilterModel = new QSortFilterProxyModel( m_parent );
317  m_folderFilterModel->setFilterKeyColumn( 1 );
318  QString regexp = GeoDataTypes::GeoDataFolderType;
319  regexp += '|';
320  regexp += GeoDataTypes::GeoDataDocumentType;
321  m_folderFilterModel->setFilterRegExp( regexp );
322  m_folderFilterModel->setSourceModel( treeModel );
323 
324  m_parent->foldersTreeView->setModel( m_folderFilterModel );
325  m_parent->foldersTreeView->setEditTriggers( QAbstractItemView::NoEditTriggers );
326  m_parent->foldersTreeView->setHeaderHidden( true );
327  for ( int i=1; i<m_treeModel->columnCount(); ++i ) {
328  m_parent->foldersTreeView->hideColumn( i );
329  }
330  m_parent->foldersTreeView->setRootIndex( m_folderFilterModel->mapFromSource(
331  m_treeModel->index( m_parent->bookmarkDocument() )));
332 
333  m_parent->connect( m_parent->foldersTreeView,
334  SIGNAL(clicked(QModelIndex)),
335  m_parent, SLOT(handleFolderSelection(QModelIndex)) );
336  m_parent->connect( m_parent->foldersTreeView->selectionModel(),
337  SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
338  m_parent, SLOT(updateButtonState()) );
339  m_parent->connect( m_parent->renameFolderButton, SIGNAL(clicked(bool)),
340  m_parent, SLOT(renameFolder()) );
341  m_parent->connect( m_parent->newFolderButton, SIGNAL(clicked(bool)),
342  m_parent, SLOT(addNewFolder()) );
343  m_parent->connect( m_parent->removeFolderButton, SIGNAL(clicked(bool)),
344  m_parent, SLOT(deleteFolder()) );
345 }
346 
347 void BookmarkManagerDialogPrivate::initializeBookmarksView( GeoDataTreeModel* treeModel )
348 {
349  m_branchFilterModel = new BranchFilterProxyModel( m_parent );
350  m_branchFilterModel->setSourceModel( treeModel );
351 
352  m_parent->bookmarksListView->setModel( m_branchFilterModel );
353  m_parent->bookmarksListView->setEditTriggers( QAbstractItemView::NoEditTriggers );
354 
355  m_parent->connect( m_parent->bookmarksListView->selectionModel(),
356  SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
357  m_parent, SLOT(updateButtonState()) );
358  m_parent->connect( m_parent->editBookmarkButton, SIGNAL(clicked(bool)),
359  m_parent, SLOT(editBookmark()) );
360  m_parent->connect( m_parent->removeBookmarkButton, SIGNAL(clicked(bool)),
361  m_parent, SLOT(deleteBookmark()) );
362 }
363 
364 BookmarkManagerDialog::BookmarkManagerDialog( MarbleModel* model, QWidget *parent )
365  : QDialog( parent ),
366  d( new BookmarkManagerDialogPrivate( this, model->bookmarkManager() ) )
367 {
368  setupUi( this );
369  bool const smallScreen = MarbleGlobal::getInstance()->profiles() & MarbleGlobal::SmallScreen;
370  importButton->setVisible( !smallScreen );
371  exportButton->setVisible( !smallScreen );
372  foldersLabel->setVisible( !smallScreen );
373  bookmarkLabel->setVisible( !smallScreen );
374 
375  d->m_treeModel = model->treeModel();
376 
377  d->initializeFoldersView( d->m_treeModel );
378  d->initializeBookmarksView( d->m_treeModel );
379  d->updateButtonState();
380 
381  connect( this, SIGNAL(accepted()), SLOT(saveBookmarks()) );
382  connect( this, SIGNAL(rejected()), SLOT(discardChanges()) );
383  connect( exportButton, SIGNAL(clicked()), this, SLOT(exportBookmarks()) );
384  connect( importButton, SIGNAL(clicked()), this, SLOT(importBookmarks()) );
385 
386  d->selectFolder();
387 }
388 
389 BookmarkManagerDialog::~BookmarkManagerDialog()
390 {
391  delete d;
392 }
393 
394 void BookmarkManagerDialog::saveBookmarks()
395 {
396  d->m_manager->updateBookmarkFile();
397 }
398 
399 void BookmarkManagerDialog::exportBookmarks()
400 {
401  QString fileName = QFileDialog::getSaveFileName( this, tr( "Export Bookmarks" ), // krazy:exclude=qclasses
402  QDir::homePath(), tr( "KML files (*.kml)" ) );
403 
404  if ( !fileName.isEmpty() ) {
405  QFile file( fileName );
406  GeoWriter writer;
407  writer.setDocumentType( kml::kmlTag_nameSpaceOgc22 );
408 
409  if ( !file.open( QIODevice::ReadWrite ) || !writer.write( &file, bookmarkDocument() ) ) {
410  mDebug() << "Could not write the bookmarks file" << fileName;
411  QString const text = tr( "Unable to save bookmarks. Please check that the file is writable." );
412  QMessageBox::warning( this, tr( "Bookmark Export - Marble" ), text );
413  }
414  }
415 }
416 
417 void BookmarkManagerDialog::importBookmarks()
418 {
419  QString const file = QFileDialog::getOpenFileName( this, tr( "Import Bookmarks - Marble" ),
420  QDir::homePath(), tr( "KML Files (*.kml)" ) );
421  if ( file.isEmpty() ) {
422  return;
423  }
424 
425  GeoDataDocument *import = BookmarkManager::openFile( file );
426  if ( !import ) {
427  QString const text = tr( "The file %1 cannot be opened as a KML file." ).arg( file );
428  QMessageBox::warning( this, tr( "Bookmark Import - Marble" ), text );
429  return;
430  }
431 
432  GeoDataDocument* current = bookmarkDocument();
433 
434  bool replaceAll = false;
435  bool skipAll = false;
436  foreach( GeoDataFolder* newFolder, import->folderList() ) {
437  foreach( GeoDataPlacemark* newPlacemark, newFolder->placemarkList() ) {
438  bool added = skipAll;
439  foreach( GeoDataFolder* existingFolder, current->folderList() ) {
440  for( int i=0; i<existingFolder->size() && !added; ++i ) {
441  GeoDataPlacemark* existingPlacemark = dynamic_cast<GeoDataPlacemark*>( existingFolder->child( i ) );
442  if ( existingPlacemark && existingPlacemark->coordinate() == newPlacemark->coordinate() ) {
443 
444  if ( skipAll ) {
445  continue;
446  }
447 
448  // Avoid message boxes for equal bookmarks, just skip them
449  if ( existingPlacemark->name() == newPlacemark->name() &&
450  existingPlacemark->description() == newPlacemark->description() ) {
451  added = true;
452  continue;
453  }
454 
455  QPointer<QMessageBox> messageBox = new QMessageBox( this );
456  QString const intro = tr( "The file contains a bookmark that already exists among your Bookmarks." );
457  QString const newBookmark = tr( "Imported bookmark" );
458  QString const existingBookmark = tr( "Existing bookmark" );
459  QString const question = tr( "Do you want to replace the existing bookmark with the imported one?" );
460  QString html = "<p>%1</p><table><tr><td>%2</td><td><b>%3 / %4</b></td></tr>";
461  html += "<tr><td>%5</td><td><b>%6 / %7</b></td></tr></table><p>%8</p>";
462  html = html.arg( intro ).arg( existingBookmark ).arg( existingFolder->name() );
463  html = html.arg( existingPlacemark->name() ).arg( newBookmark ).arg( newFolder->name() );
464  html = html.arg( newPlacemark->name() ).arg( question );
465  messageBox->setText( html );
466 
467  QAbstractButton *replaceButton = messageBox->addButton(tr( "Replace" ), QMessageBox::ActionRole );
468  QAbstractButton *replaceAllButton = messageBox->addButton(tr( "Replace All" ), QMessageBox::ActionRole );
469  QAbstractButton *skipButton = messageBox->addButton(tr( "Skip" ), QMessageBox::ActionRole );
470  QAbstractButton *skipAllButton = messageBox->addButton(tr( "Skip All" ), QMessageBox::ActionRole );
471  messageBox->addButton(tr( "Cancel" ), QMessageBox::RejectRole );
472  messageBox->setIcon( QMessageBox::Question );
473 
474  if ( !replaceAll ) {
475  messageBox->exec();
476  }
477  if ( messageBox->clickedButton() == replaceAllButton ) {
478  replaceAll = true;
479  } else if ( messageBox->clickedButton() == skipAllButton ) {
480  skipAll = true;
481  added = true;
482  } else if ( messageBox->clickedButton() == skipButton ) {
483  added = true;
484  delete messageBox;
485  continue;
486  } else if ( messageBox->clickedButton() != replaceButton ) {
487  delete messageBox;
488  return;
489  }
490 
491  if ( messageBox->clickedButton() == replaceButton || replaceAll ) {
492  d->m_manager->removeBookmark( existingPlacemark );
493  d->m_manager->addBookmark( newFolder, *newPlacemark );
494  mDebug() << "Placemark " << newPlacemark->name() << " replaces " << existingPlacemark->name();
495  added = true;
496  delete messageBox;
497  break;
498  }
499  delete messageBox;
500  }
501  }
502  }
503 
504  if ( !added ) {
505  d->m_manager->addBookmark( newFolder, *newPlacemark );
506  }
507  }
508  }
509 
510  d->selectFolder();
511 }
512 
513 GeoDataDocument* BookmarkManagerDialog::bookmarkDocument()
514 {
515  return d->m_manager->document();
516 }
517 
518 void BookmarkManagerDialog::setButtonBoxVisible( bool visible )
519 {
520  buttonBox->setVisible( visible );
521  if ( !visible ) {
522  disconnect( this, SIGNAL(rejected()), this, SLOT(discardChanges()) );
523  connect( this, SIGNAL(rejected()), SLOT(saveBookmarks()) );
524  }
525 }
526 
527 }
528 
529 #include "BookmarkManagerDialog.moc"
GeoDataDocument.h
QModelIndex
GeoDataCoordinates.h
QWidget
FileManager.h
QWidget::setupUi
void setupUi(QWidget *widget)
Marble::MarbleModel::treeModel
GeoDataTreeModel * treeModel()
Return the list of Placemarks as a QAbstractItemModel *.
Definition: MarbleModel.cpp:477
MarbleModel.h
This file contains the headers for MarbleModel.
QDialog::rejected
void rejected()
QPointer
Marble::GeoDataTypes::GeoDataDocumentType
const char * GeoDataDocumentType
Definition: GeoDataTypes.cpp:38
QDialog::accepted
void accepted()
GeoDataExtendedData.h
QObject::disconnect
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
Marble::MarblePlacemarkModel::ObjectPointerRole
The pointer to a specific object.
Definition: MarblePlacemarkModel.h:62
QDir::homePath
QString homePath()
MarbleDebug.h
QObject::tr
QString tr(const char *sourceText, const char *disambiguation, int n)
QFile
Marble::BookmarkManagerDialog::setButtonBoxVisible
void setButtonBoxVisible(bool visible)
Definition: BookmarkManagerDialog.cpp:518
BookmarkManager.h
GeoWriter.h
BookmarkManager_p.h
BookmarkManagerDialog.h
QModelIndex::isValid
bool isValid() const
QMessageBox
NewBookmarkFolderDialog.h
QMessageBox::question
StandardButton question(QWidget *parent, const QString &title, const QString &text, QFlags< QMessageBox::StandardButton > buttons, StandardButton defaultButton)
KmlElementDictionary.h
MarbleDirs.h
QString::isEmpty
bool isEmpty() const
QModelIndex::row
int row() const
Marble::BookmarkManagerDialog::~BookmarkManagerDialog
~BookmarkManagerDialog()
Destructor.
Definition: BookmarkManagerDialog.cpp:389
Marble::GeoDataTypes::GeoDataFolderType
const char * GeoDataFolderType
Definition: GeoDataTypes.cpp:42
QString
MarblePlacemarkModel.h
BranchFilterProxyModel.h
GeoDataPlacemark.h
QModelIndex::parent
QModelIndex parent() const
GeoDataTreeModel.h
EditBookmarkDialog.h
Marble::kml::kmlTag_nameSpaceOgc22
const char * kmlTag_nameSpaceOgc22
Definition: KmlElementDictionary.cpp:34
QSortFilterProxyModel
Marble::MarbleGlobal::SmallScreen
Definition: MarbleGlobal.h:287
Marble::MarbleGlobal::getInstance
static MarbleGlobal * getInstance()
Definition: MarbleGlobal.cpp:37
QItemSelection
GeoDataFolder.h
QAbstractButton
Marble::MarbleModel
The data model (not based on QAbstractModel) for a MarbleWidget.
Definition: MarbleModel.h:97
QPersistentModelIndex
QModelIndex::model
const QAbstractItemModel * model() const
GeoDataPoint.h
QModelIndex::data
QVariant data(int role) const
Marble::MarbleGlobal::profiles
Profiles profiles() const
Definition: MarbleGlobal.cpp:48
QFileDialog::getSaveFileName
QString getSaveFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFlags< QFileDialog::Option > options)
QDialog
QMessageBox::warning
StandardButton warning(QWidget *parent, const QString &title, const QString &text, QFlags< QMessageBox::StandardButton > buttons, StandardButton defaultButton)
QFileDialog::getOpenFileName
QString getOpenFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFlags< QFileDialog::Option > options)
GeoDataTypes.h
Marble::BookmarkManagerDialog::BookmarkManagerDialog
BookmarkManagerDialog(MarbleModel *model, QWidget *parent=0)
Constructor.
Definition: BookmarkManagerDialog.cpp:364
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QString::arg
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
QVariant::toString
QString toString() const
Marble::mDebug
QDebug mDebug()
a function to replace qDebug() in Marble library code
Definition: MarbleDebug.cpp:36
QPersistentModelIndex::parent
QModelIndex parent() const
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:13:38 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

marble

Skip menu "marble"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal