• 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
BookmarkManager.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 Gaurav Gupta <1989.gaurav@googlemail.com>
9 // Copyright 2012 Thibaut Gridel <tgridel@free.fr>
10 //
11 
12 #include "BookmarkManager.h"
13 #include "BookmarkManager_p.h"
14 #include "GeoDataParser.h"
15 #include "GeoDataContainer.h"
16 #include "GeoDataDocument.h"
17 #include "GeoDataFolder.h"
18 #include "GeoDataPlacemark.h"
19 #include "GeoDataTreeModel.h"
20 #include "GeoWriter.h"
21 #include "KmlElementDictionary.h"
22 #include "MarbleDebug.h"
23 #include "MarbleDirs.h"
24 #include <QFile>
25 
26 namespace Marble
27 {
28 
29 BookmarkManagerPrivate::BookmarkManagerPrivate( GeoDataTreeModel *treeModel ) :
30  m_treeModel( treeModel ),
31  m_bookmarkDocument( 0 ),
32  m_bookmarkFileRelativePath( "bookmarks/bookmarks.kml" )
33 {
34  resetBookmarkDocument();
35 }
36 
37 BookmarkManagerPrivate::~BookmarkManagerPrivate()
38 {
39  m_treeModel->removeDocument( m_bookmarkDocument );
40  delete m_bookmarkDocument;
41 }
42 
43 void BookmarkManagerPrivate::resetBookmarkDocument()
44 {
45  if ( m_bookmarkDocument ) {
46  m_treeModel->removeDocument( m_bookmarkDocument );
47  delete m_bookmarkDocument;
48  }
49 
50  GeoDataFolder* folder = new GeoDataFolder;
51  folder->setName( QObject::tr( "Default" ) );
52 
53  m_bookmarkDocument = new GeoDataDocument;
54  m_bookmarkDocument->setDocumentRole( BookmarkDocument );
55  m_bookmarkDocument->setName( QObject::tr("Bookmarks") );
56  m_bookmarkDocument->append( folder );
57  m_treeModel->addDocument( m_bookmarkDocument );
58 }
59 
60 void BookmarkManagerPrivate::setVisualCategory( GeoDataContainer *container ) {
61  foreach( GeoDataFolder* folder, container->folderList() ) {
62  setVisualCategory( folder );
63  }
64  foreach( GeoDataPlacemark* placemark, container->placemarkList() ) {
65  placemark->setVisualCategory( GeoDataFeature::Bookmark );
66  placemark->setZoomLevel( 1 );
67  }
68 
69 }
70 
71 BookmarkManager::BookmarkManager( GeoDataTreeModel *treeModel, QObject *parent ) :
72  QObject( parent ),
73  d( new BookmarkManagerPrivate( treeModel ) )
74 {
75 }
76 
77 BookmarkManager::~BookmarkManager()
78 {
79  delete d;
80 }
81 
82 QString BookmarkManager::bookmarkFile() const
83 {
84  return MarbleDirs::path( d->m_bookmarkFileRelativePath );
85 }
86 
87 bool BookmarkManager::loadFile( const QString &relativeFilePath )
88 {
89  d->m_bookmarkFileRelativePath = relativeFilePath;
90  QString absoluteFilePath = bookmarkFile();
91 
92  mDebug() << Q_FUNC_INFO << "Loading Bookmark File:" << absoluteFilePath;
93 
94  if (absoluteFilePath.isEmpty())
95  return false;
96 
97  if ( relativeFilePath.isNull() )
98  return false;
99 
100  GeoDataDocument *document = openFile( absoluteFilePath );
101  bool recover = false;
102  if ( !document ) {
103  mDebug() << "Could not parse file" << absoluteFilePath;
104  mDebug() << "This could be caused by a previous broken bookmark file. Trying to recover.";
106  recover = true;
107  // return false;
108  }
109 
110  d->m_treeModel->removeDocument( d->m_bookmarkDocument );
111  delete d->m_bookmarkDocument;
112  d->m_bookmarkDocument = document;
113 
114  if ( recover ) {
115  d->resetBookmarkDocument();
116  updateBookmarkFile();
117  } else {
118  Q_ASSERT( d->m_bookmarkDocument && "d->m_bookmarkDocument is 0 but must not be. Please report a bug at http://bugs.kde.org" );
119  d->m_treeModel->addDocument( d->m_bookmarkDocument );
120  }
121 
122  emit bookmarksChanged();
123  return true;
124 }
125 
126 
127 void BookmarkManager::addBookmark( GeoDataContainer *container, const GeoDataPlacemark &placemark )
128 {
129  GeoDataPlacemark *bookmark = new GeoDataPlacemark( placemark );
130  bookmark->setVisualCategory( GeoDataDocument::Bookmark );
131  bookmark->setZoomLevel( 1 );
132  d->m_treeModel->addFeature( container, bookmark );
133 
134  updateBookmarkFile();
135 }
136 
137 void BookmarkManager::updateBookmark( GeoDataPlacemark *bookmark )
138 {
139  d->m_treeModel->updateFeature( bookmark );
140 }
141 
142 void BookmarkManager::removeBookmark( GeoDataPlacemark *bookmark )
143 {
144  d->m_treeModel->removeFeature( bookmark );
145  delete bookmark;
146  updateBookmarkFile();
147 }
148 
149 GeoDataDocument * BookmarkManager::document() const
150 {
151  return d->m_bookmarkDocument;
152 }
153 
154 bool BookmarkManager::showBookmarks() const
155 {
156  return d->m_bookmarkDocument->isVisible();
157 }
158 
159 void BookmarkManager::setShowBookmarks( bool visible )
160 {
161  d->m_bookmarkDocument->setVisible( visible );
162  d->m_treeModel->updateFeature( d->m_bookmarkDocument );
163 }
164 
165 QVector<GeoDataFolder*> BookmarkManager::folders() const
166 {
167  return d->m_bookmarkDocument->folderList();
168 }
169 
170 void BookmarkManager::addNewBookmarkFolder( GeoDataContainer *container, const QString &name )
171 {
172  //If name is empty string
173  if ( name.isEmpty() ) {
174  mDebug() << "Folder with empty name is not acceptable, please give it another name" ;
175  return;
176  }
177 
178  //If folder with same name already exist
179  QVector<GeoDataFolder*> folderList = container->folderList();
180 
181  QVector<GeoDataFolder*>::const_iterator i = folderList.constBegin();
182  QVector<GeoDataFolder*>::const_iterator end = folderList.constEnd();
183  for ( ; i != end; ++i ) {
184  if ( name == ( *i )->name() ) {
185  mDebug() << "Folder with same name already exist, please give it another name";
186  return;
187  }
188  }
189 
190  GeoDataFolder *bookmarkFolder = new GeoDataFolder();
191  bookmarkFolder->setName( name );
192 
193  d->m_treeModel->addFeature( container, bookmarkFolder );
194  updateBookmarkFile();
195 }
196 
197 void BookmarkManager::renameBookmarkFolder( GeoDataFolder *folder, const QString &name )
198 {
199  folder->setName( name );
200  d->m_treeModel->updateFeature( folder );
201 }
202 
203 void BookmarkManager::removeBookmarkFolder( GeoDataFolder *folder )
204 {
205  d->m_treeModel->removeFeature( folder );
206  delete folder;
207 }
208 
209 void BookmarkManager::removeAllBookmarks()
210 {
211  d->resetBookmarkDocument();
212  updateBookmarkFile();
213 }
214 
215 bool BookmarkManager::updateBookmarkFile()
216 {
217  QString absoluteLocalFilePath = MarbleDirs::localPath() + '/' + d->m_bookmarkFileRelativePath ;
218 
219  if ( ! d->m_bookmarkFileRelativePath.isNull() ) {
220  GeoWriter writer;
221  writer.setDocumentType( "http://earth.google.com/kml/2.2" );
222 
223  QFile file( absoluteLocalFilePath );
224 
225  if ( !file.exists() ) {
226  // Extracting directory of file : for bookmarks it will be MarbleDirs::localPath()+/bookmarks/
227  QFileInfo fileInfo( absoluteLocalFilePath );
228  QString directoryPath = fileInfo.path();
229 
230  //Creating all directories, which doesn't exist
231  QDir directory( MarbleDirs::localPath() );
232  directory.mkpath( directoryPath );
233  }
234 
235  file.open( QIODevice::WriteOnly );
236 
237  if ( !writer.write( &file, d->m_bookmarkDocument ) ) {
238  mDebug() << "Could not write the bookmarks file" << absoluteLocalFilePath;
239  file.close();
240  return false;
241  }
242  emit bookmarksChanged();
243  file.close();
244  return true;
245  }
246  return false;
247 }
248 
249 GeoDataDocument* BookmarkManager::openFile( const QString &fileName )
250 {
251  GeoDataParser parser( GeoData_KML );
252  QFile file( fileName );
253 
254  if ( !file.exists() ) {
255  return 0;
256  }
257 
258  if ( !file.open( QIODevice::ReadOnly ) || !parser.read( &file ) ) {
259  mDebug() << "Could not open/parse file" << fileName;
260  return 0;
261  }
262 
263  GeoDataDocument *result = dynamic_cast<GeoDataDocument*>( parser.releaseDocument() );
264  if ( !result ) {
265  return 0;
266  }
267 
268  result->setDocumentRole( BookmarkDocument );
269  foreach( GeoDataFolder* folder, result->folderList() ) {
270  BookmarkManagerPrivate::setVisualCategory( folder );
271  }
272 
273  return result;
274 }
275 
276 }
277 
278 #include "BookmarkManager.moc"
GeoDataDocument.h
Marble::BookmarkManagerPrivate::m_bookmarkFileRelativePath
QString m_bookmarkFileRelativePath
Definition: BookmarkManager_p.h:38
Marble::GeoDataTreeModel::addFeature
int addFeature(GeoDataContainer *parent, GeoDataFeature *feature, int row=-1)
Definition: GeoDataTreeModel.cpp:566
Marble::GeoDataDocument
A container for Features, Styles and in the future Schemas.
Definition: GeoDataDocument.h:64
Marble::BookmarkManager::renameBookmarkFolder
void renameBookmarkFolder(GeoDataFolder *folder, const QString &name)
Definition: BookmarkManager.cpp:197
Marble::BookmarkManager::loadFile
bool loadFile(const QString &relativeFilePath)
load bookmark file as GeoDataDocument and return true if loaded successfully else false ...
Definition: BookmarkManager.cpp:87
Marble::GeoDataTreeModel
The representation of GeoData in a model This class represents all available data given by kml-data f...
Definition: GeoDataTreeModel.h:32
Marble::BookmarkManager::addBookmark
void addBookmark(GeoDataContainer *folder, const GeoDataPlacemark &bookmark)
add bookmark in a folder
Definition: BookmarkManager.cpp:127
Marble::GeoDataDocument::setDocumentRole
void setDocumentRole(DocumentRole role)
Definition: GeoDataDocument.cpp:62
Marble::MarbleDirs::path
static QString path(const QString &relativePath)
Definition: MarbleDirs.cpp:53
GeoDataContainer.h
Marble::GeoDataFeature::setVisualCategory
void setVisualCategory(GeoDataVisualCategory category)
Sets the symbol index of the placemark.
Definition: GeoDataFeature.cpp:680
Marble::BookmarkManager::updateBookmark
void updateBookmark(GeoDataPlacemark *bookmark)
Definition: BookmarkManager.cpp:137
Marble::GeoDataTreeModel::removeFeature
bool removeFeature(GeoDataContainer *parent, int index)
Definition: GeoDataTreeModel.cpp:600
Marble::GeoDataFeature::isVisible
bool isVisible() const
Return whether this feature is visible or not.
Definition: GeoDataFeature.cpp:581
Marble::BookmarkManager::document
GeoDataDocument * document() const
Definition: BookmarkManager.cpp:149
Marble::GeoDataContainer
A base class that can hold GeoDataFeatures.
Definition: GeoDataContainer.h:47
Marble::BookmarkManagerPrivate::m_bookmarkDocument
GeoDataDocument * m_bookmarkDocument
Definition: BookmarkManager_p.h:36
GeoDataParser.h
Marble::MarbleDirs::localPath
static QString localPath()
Definition: MarbleDirs.cpp:217
Marble::GeoDataFeature::Bookmark
Definition: GeoDataFeature.h:132
QObject
MarbleDebug.h
Marble::BookmarkDocument
Definition: GeoDataDocument.h:44
Marble::GeoDataTreeModel::addDocument
int addDocument(GeoDataDocument *document)
Definition: GeoDataTreeModel.cpp:595
BookmarkManager.h
Marble::BookmarkManager::bookmarksChanged
void bookmarksChanged()
One or more bookmarks were added or removed.
GeoWriter.h
Marble::BookmarkManager::setShowBookmarks
void setShowBookmarks(bool visible)
Definition: BookmarkManager.cpp:159
Marble::GeoData_KML
Definition: GeoDataParser.h:36
BookmarkManager_p.h
Marble::BookmarkManagerPrivate::~BookmarkManagerPrivate
~BookmarkManagerPrivate()
Definition: BookmarkManager.cpp:37
Marble::BookmarkManagerPrivate::setVisualCategory
static void setVisualCategory(GeoDataContainer *container)
Definition: BookmarkManager.cpp:60
Marble::BookmarkManager::removeBookmark
void removeBookmark(GeoDataPlacemark *bookmark)
Definition: BookmarkManager.cpp:142
Marble::GeoDataFeature::setName
void setName(const QString &value)
Set a new name for this feature.
Definition: GeoDataFeature.cpp:485
Marble::BookmarkManager::removeAllBookmarks
void removeAllBookmarks()
remove all folders and bookmarks except default folder
Definition: BookmarkManager.cpp:209
KmlElementDictionary.h
Marble::GeoDataTreeModel::removeDocument
void removeDocument(int index)
Definition: GeoDataTreeModel.cpp:646
Marble::BookmarkManager::folders
QVector< GeoDataFolder * > folders() const
return Vector of folders
Definition: BookmarkManager.cpp:165
MarbleDirs.h
Marble::GeoDataContainer::folderList
QVector< GeoDataFolder * > folderList() const
A convenience function that returns all folders in this container.
Definition: GeoDataContainer.cpp:90
Marble::GeoWriter
Standard Marble way of writing XML This class is intended to be a standardised way of writing XML for...
Definition: GeoWriter.h:28
Marble::BookmarkManagerPrivate::m_treeModel
GeoDataTreeModel *const m_treeModel
Definition: BookmarkManager_p.h:34
Marble::GeoDataTreeModel::updateFeature
void updateFeature(GeoDataFeature *feature)
Definition: GeoDataTreeModel.cpp:638
Marble::GeoDataFolder
Definition: GeoDataFolder.h:50
GeoDataPlacemark.h
GeoDataTreeModel.h
Marble::GeoDataContainer::append
void append(GeoDataFeature *other)
add an element
Definition: GeoDataContainer.cpp:165
Marble::GeoWriter::setDocumentType
void setDocumentType(const QString &documentType)
Set the current document type.
Definition: GeoWriter.cpp:79
Marble::BookmarkManager::BookmarkManager
BookmarkManager(GeoDataTreeModel *treeModel, QObject *parent=0)
Definition: BookmarkManager.cpp:71
Marble::BookmarkManagerPrivate::BookmarkManagerPrivate
BookmarkManagerPrivate(GeoDataTreeModel *treeModel)
Definition: BookmarkManager.cpp:29
Marble::GeoDataFeature::setVisible
void setVisible(bool value)
Set a new value for visibility.
Definition: GeoDataFeature.cpp:586
GeoDataFolder.h
Marble::BookmarkManager::~BookmarkManager
~BookmarkManager()
Definition: BookmarkManager.cpp:77
Marble::BookmarkManagerPrivate
Definition: BookmarkManager_p.h:23
Marble::BookmarkManagerPrivate::resetBookmarkDocument
void resetBookmarkDocument()
Definition: BookmarkManager.cpp:43
Marble::BookmarkManager::bookmarkFile
QString bookmarkFile() const
return bookmark file path
Definition: BookmarkManager.cpp:82
Marble::GeoWriter::write
bool write(QIODevice *device, const GeoNode *feature)
The main API call to use the XML writer.
Definition: GeoWriter.cpp:28
Marble::GeoDataFeature::setZoomLevel
void setZoomLevel(int index)
Sets the popularity index of the placemark.
Definition: GeoDataFeature.cpp:712
Marble::BookmarkManager::removeBookmarkFolder
void removeBookmarkFolder(GeoDataFolder *folder)
Definition: BookmarkManager.cpp:203
Marble::GeoDataPlacemark
a class representing a point of interest on the map
Definition: GeoDataPlacemark.h:54
Marble::mDebug
QDebug mDebug()
a function to replace qDebug() in Marble library code
Definition: MarbleDebug.cpp:31
Marble::BookmarkManager::showBookmarks
bool showBookmarks() const
Definition: BookmarkManager.cpp:154
Marble::BookmarkManager::addNewBookmarkFolder
void addNewBookmarkFolder(GeoDataContainer *folder, const QString &name)
add a folder
Definition: BookmarkManager.cpp:170
Marble::GeoDataContainer::placemarkList
QVector< GeoDataPlacemark * > placemarkList() const
A convenience function that returns all placemarks in this container.
Definition: GeoDataContainer.cpp:107
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