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

marble

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