42 b.
setId( element.attribute( QStringLiteral(
"id" ) ) );
43 b.
setName( element.attribute( QStringLiteral(
"name" ) ) );
44 b.
setGroup( element.attribute( QStringLiteral(
"group" ) ) );
46 b.
setRotation( element.attribute( QStringLiteral(
"rotation" ) ).toDouble() );
55 QDomElement bookmarkElem = doc.createElement( QStringLiteral(
"Bookmark" ) );
56 bookmarkElem.setAttribute( QStringLiteral(
"id" ), mId );
57 bookmarkElem.setAttribute( QStringLiteral(
"name" ), mName );
58 bookmarkElem.setAttribute( QStringLiteral(
"group" ), mGroup );
59 bookmarkElem.setAttribute( QStringLiteral(
"extent" ), mExtent.
asWktPolygon() );
60 bookmarkElem.setAttribute( QStringLiteral(
"rotation" ), mRotation );
67 return mId == other.mId
68 && mName == other.mName
69 && mExtent == other.mExtent
70 && mGroup == other.mGroup
76 return !( *
this == other );
127 res->mProject = project;
148 if ( bookmark.
id().isEmpty() )
149 bookmark.
setId( QUuid::createUuid().toString() );
153 for (
const QgsBookmark &b : std::as_const( mBookmarks ) )
155 if ( b.
id() == bookmark.
id() )
166 mBookmarks << bookmark;
167 if ( !mGroups.contains( bookmark.
group() ) )
168 mGroups << bookmark.
group();
175 return bookmark.
id();
186 for (
const QgsBookmark &b : std::as_const( mBookmarks ) )
201 mBookmarks.removeAt( pos );
203 mGroups.removeOne( group );
217 for (
const QgsBookmark &b : std::as_const( mBookmarks ) )
219 if ( b.id() == bookmark.
id() )
221 if ( mBookmarks[i].group() != bookmark.
group() )
224 mGroups.removeOne( mBookmarks[i].group() );
225 if ( !mGroups.contains( bookmark.
group() ) )
226 mGroups << bookmark.
group();
228 mBookmarks[i] = bookmark;
244 const QList< QgsBookmark >
bookmarks = mBookmarks;
258 for (
int i = 0; i < mBookmarks.count(); ++i )
260 if ( mBookmarks.at( i ).group() == oldName )
262 mBookmarks[ i ].setGroup( newName );
288 if ( b.group() == group )
298 QDomElement bookmarksElem = element;
299 if ( element.tagName() != QLatin1String(
"Bookmarks" ) )
301 bookmarksElem = element.firstChildElement( QStringLiteral(
"Bookmarks" ) );
304 if ( mProject && bookmarksElem.isNull() )
307 const int count = mProject->
readNumEntry( QStringLiteral(
"Bookmarks" ), QStringLiteral(
"/count" ) );
308 for (
int i = 0; i < count; ++i )
310 const double minX = mProject->
readDoubleEntry( QStringLiteral(
"Bookmarks" ), QStringLiteral(
"/Row-%1/MinX" ).arg( i ) );
311 const double minY = mProject->
readDoubleEntry( QStringLiteral(
"Bookmarks" ), QStringLiteral(
"/Row-%1/MinY" ).arg( i ) );
312 const double maxX = mProject->
readDoubleEntry( QStringLiteral(
"Bookmarks" ), QStringLiteral(
"/Row-%1/MaxX" ).arg( i ) );
313 const double maxY = mProject->
readDoubleEntry( QStringLiteral(
"Bookmarks" ), QStringLiteral(
"/Row-%1/MaxY" ).arg( i ) );
314 const long srid = mProject->
readNumEntry( QStringLiteral(
"Bookmarks" ), QStringLiteral(
"/Row-%1/SRID" ).arg( i ) );
316 b.
setId( QStringLiteral(
"bookmark_%1" ).arg( i ) );
317 b.
setName( mProject->
readEntry( QStringLiteral(
"Bookmarks" ), QStringLiteral(
"/Row-%1/Name" ).arg( i ) ) );
322 result = added && result;
328 QDomNodeList bookmarkNodes = element.elementsByTagName( QStringLiteral(
"Bookmark" ) );
329 for (
int i = 0; i < bookmarkNodes.size(); ++i )
334 result = added && result;
342 QDomElement bookmarksElem = doc.createElement( QStringLiteral(
"Bookmarks" ) );
346 QDomElement bookmarkElem = b.writeXml( doc );
347 bookmarksElem.appendChild( bookmarkElem );
349 return bookmarksElem;
355 if ( b.
id().isEmpty() )
367 QDomDocument doc( QStringLiteral(
"qgis_bookmarks" ) );
368 QDomElement root = doc.createElement( QStringLiteral(
"qgis_bookmarks" ) );
369 doc.appendChild( root );
371 QList<QString> headerList;
373 << QStringLiteral(
"project" )
374 << QStringLiteral(
"xmin" )
375 << QStringLiteral(
"ymin" )
376 << QStringLiteral(
"xmax" )
377 << QStringLiteral(
"ymax" )
378 << QStringLiteral(
"rotation" )
379 << QStringLiteral(
"sr_id" );
383 const QList< QgsBookmark >
bookmarks = manager->bookmarks();
386 if ( !group.isEmpty() && b.group() != group )
389 QDomElement bookmark = doc.createElement( QStringLiteral(
"bookmark" ) );
390 root.appendChild( bookmark );
392 QDomElement
id = doc.createElement( QStringLiteral(
"id" ) );
393 id.appendChild( doc.createTextNode( b.id() ) );
394 bookmark.appendChild(
id );
396 QDomElement name = doc.createElement( QStringLiteral(
"name" ) );
397 name.appendChild( doc.createTextNode( b.name() ) );
398 bookmark.appendChild( name );
400 QDomElement group = doc.createElement( QStringLiteral(
"project" ) );
401 group.appendChild( doc.createTextNode( b.group() ) );
402 bookmark.appendChild( group );
404 QDomElement xMin = doc.createElement( QStringLiteral(
"xmin" ) );
405 xMin.appendChild( doc.createTextNode(
qgsDoubleToString( b.extent().xMinimum() ) ) );
406 bookmark.appendChild( xMin );
407 QDomElement yMin = doc.createElement( QStringLiteral(
"ymin" ) );
408 yMin.appendChild( doc.createTextNode(
qgsDoubleToString( b.extent().yMinimum() ) ) );
409 bookmark.appendChild( yMin );
410 QDomElement xMax = doc.createElement( QStringLiteral(
"xmax" ) );
411 xMax.appendChild( doc.createTextNode(
qgsDoubleToString( b.extent().xMaximum() ) ) );
412 bookmark.appendChild( xMax );
413 QDomElement yMax = doc.createElement( QStringLiteral(
"ymax" ) );
414 yMax.appendChild( doc.createTextNode(
qgsDoubleToString( b.extent().yMaximum() ) ) );
415 bookmark.appendChild( yMax );
417 QDomElement rotation = doc.createElement( QStringLiteral(
"rotation" ) );
419 bookmark.appendChild( rotation );
421 QDomElement
crs = doc.createElement( QStringLiteral(
"sr_id" ) );
422 crs.appendChild( doc.createTextNode( QString::number( b.extent().crs().srsid() ) ) );
423 bookmark.appendChild(
crs );
428 if ( !f.open( QFile::WriteOnly | QIODevice::Truncate ) )
434 QTextStream out( &f );
435#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
436 out.setCodec(
"UTF-8" );
446 if ( path.isEmpty() )
452 if ( !f.open( QIODevice::ReadOnly | QIODevice::Text ) )
458 if ( !doc.setContent( &f ) )
464 QDomElement docElem = doc.documentElement();
465 QDomNodeList nodeList = docElem.elementsByTagName( QStringLiteral(
"bookmark" ) );
468 for (
int i = 0; i < nodeList.count(); i++ )
470 QDomNode bookmark = nodeList.at( i );
471 QDomElement name = bookmark.firstChildElement( QStringLiteral(
"name" ) );
472 QDomElement prjname = bookmark.firstChildElement( QStringLiteral(
"project" ) );
473 QDomElement xmin = bookmark.firstChildElement( QStringLiteral(
"xmin" ) );
474 QDomElement ymin = bookmark.firstChildElement( QStringLiteral(
"ymin" ) );
475 QDomElement xmax = bookmark.firstChildElement( QStringLiteral(
"xmax" ) );
476 QDomElement ymax = bookmark.firstChildElement( QStringLiteral(
"ymax" ) );
477 QDomElement rotation = bookmark.firstChildElement( QStringLiteral(
"rotation" ) );
478 QDomElement srid = bookmark.firstChildElement( QStringLiteral(
"sr_id" ) );
487 ymin.text().toDouble(),
488 xmax.text().toDouble(),
489 ymax.text().toDouble() ),
crs ) );
498void QgsBookmarkManager::store()
500 if ( !mFilePath.isEmpty() )
502 QFile f( mFilePath );
503 if ( !f.open( QFile::WriteOnly | QIODevice::Truncate ) )
511 doc.appendChild( elem );
513 QTextStream out( &f );
514#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
515 out.setCodec(
"UTF-8" );
527 mFilePath = filePath;
532 if ( !QFileInfo::exists( mFilePath ) )
537 if ( result != SQLITE_OK )
543 if ( result == SQLITE_OK )
545 while ( preparedStatement.
step() == SQLITE_ROW )
547 const QString name = preparedStatement.
columnAsText( 0 );
565 QFile f( mFilePath );
566 if ( !f.open( QIODevice::ReadOnly | QIODevice::Text ) )
572 if ( !doc.setContent( &f ) )
578 QDomElement elem = doc.documentElement();
static QString qgisUserDatabaseFilePath()
Returns the path to the user qgis.db file.
Manages storage of a set of bookmarks.
void renameGroup(const QString &oldName, const QString &newName)
Renames an existing group from oldName to newName.
bool removeBookmark(const QString &id)
Removes the bookmark with matching id from the manager.
QList< QgsBookmark > bookmarksByGroup(const QString &group)
Returns a list of bookmark with a matching group, or an empty list if no matching bookmarks were foun...
void initialize(const QString &filePath)
Initializes the bookmark manager.
void bookmarkAboutToBeRemoved(const QString &id)
Emitted when a bookmark is about to be removed from the manager.
~QgsBookmarkManager() override
void bookmarkChanged(const QString &id)
Emitted when a bookmark is changed.
static QgsBookmarkManager * createProjectBasedManager(QgsProject *project)
Returns a newly created QgsBookmarkManager using a project-based bookmark store, linked to the specif...
bool readXml(const QDomElement &element, const QDomDocument &doc)
Reads the manager's state from a DOM element, restoring all bookmarks present in the XML document.
void clear()
Removes and deletes all bookmarks from the manager.
void bookmarkAdded(const QString &id)
Emitted when a bookmark has been added to the manager.
bool updateBookmark(const QgsBookmark &bookmark)
Updates the definition of a bookmark in the manager.
void bookmarkAboutToBeAdded(const QString &id)
Emitted when a bookmark is about to be added to the manager.
bool moveBookmark(const QString &id, QgsBookmarkManager *destination)
Moves the bookmark with matching id from this manager to a destination manager.
static bool exportToFile(const QString &path, const QList< const QgsBookmarkManager * > &managers, const QString &group=QString())
Exports all bookmarks from a list of managers to an xml file at the specified path.
QgsBookmark bookmarkById(const QString &id) const
Returns the bookmark with a matching id, or an empty bookmark if no matching bookmarks were found.
QStringList groups() const
Returns a list of all bookmark groups contained in the manager.
QString addBookmark(const QgsBookmark &bookmark, bool *ok=nullptr)
Adds a bookmark to the manager.
QDomElement writeXml(QDomDocument &doc) const
Returns a DOM element representing the state of the manager.
QgsBookmarkManager(QObject *parent=nullptr)
Constructor for QgsBookmarkManager, with the specified parent object.
QList< QgsBookmark > bookmarks() const
Returns a list of all bookmarks contained in the manager.
void bookmarkRemoved(const QString &id)
Emitted when a bookmark was removed from the manager.
bool importFromFile(const QString &path)
Imports the bookmarks from an xml file at the specified path.
Represents a spatial bookmark, with a name, CRS and extent.
static QgsBookmark fromXml(const QDomElement &element, const QDomDocument &doc)
Creates a bookmark using the properties from a DOM element.
void setGroup(const QString &group)
Sets the bookmark's group, which is a user-visible string identifying the bookmark's category.
bool operator!=(const QgsBookmark &other) const
void setRotation(double rotation)
Sets the bookmark's spatial map rotation.
QString id() const
Returns the bookmark's unique ID.
QgsReferencedRectangle extent() const
Returns the bookmark's spatial extent.
void setExtent(const QgsReferencedRectangle &extent)
Sets the bookmark's spatial extent.
double rotation() const
Returns the bookmark's map rotation.
void setId(const QString &id)
Sets the bookmark's unique id.
QDomElement writeXml(QDomDocument &doc) const
Returns a DOM element representing the bookmark's properties.
bool operator==(const QgsBookmark &other) const
QString group() const
Returns the bookmark's group, which is a user-visible string identifying the bookmark's category.
void setName(const QString &name)
Sets the bookmark's name, which is a user-visible string identifying the bookmark.
QString name() const
Returns the bookmark's name, which is a user-visible string identifying the bookmark.
This class represents a coordinate reference system (CRS).
bool readXml(const QDomNode &node)
Restores state from the given DOM node.
bool createFromSrsId(long srsId)
Sets this CRS by lookup of internal QGIS CRS ID in the CRS database.
bool writeXml(QDomNode &node, QDomDocument &doc) const
Stores state to the given Dom node in the given document.
static QgsCoordinateReferenceSystem fromSrsId(long srsId)
Creates a CRS from a specified QGIS SRS ID.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
int readNumEntry(const QString &scope, const QString &key, int def=0, bool *ok=nullptr) const
Reads an integer from the specified scope and key.
QString readEntry(const QString &scope, const QString &key, const QString &def=QString(), bool *ok=nullptr) const
Reads a string from the specified scope and key.
double readDoubleEntry(const QString &scope, const QString &key, double def=0, bool *ok=nullptr) const
Reads a double from the specified scope and key.
void setDirty(bool b=true)
Flag the project as dirty (modified).
A rectangle specified with double values.
static QgsRectangle fromWkt(const QString &wkt)
Creates a new rectangle from a wkt string.
QString asWktPolygon() const
Returns a string representation of the rectangle as a WKT Polygon.
QgsCoordinateReferenceSystem crs() const
Returns the associated coordinate reference system, or an invalid CRS if no reference system is set.
A QgsRectangle with associated coordinate reference system.
Unique pointer for sqlite3 databases, which automatically closes the database when the pointer goes o...
sqlite3_statement_unique_ptr prepare(const QString &sql, int &resultCode) const
Prepares a sql statement, returning the result.
int open(const QString &path)
Opens the database at the specified file path.
Unique pointer for sqlite3 prepared statements, which automatically finalizes the statement when the ...
QString columnAsText(int column) const
Returns the column value from the current statement row as a string.
double columnAsDouble(int column) const
Gets column value from the current statement row as a double.
int step()
Steps to the next record in the statement, returning the sqlite3 result code.
qlonglong columnAsInt64(int column) const
Gets column value from the current statement row as a long long integer (64 bits).
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
const QgsCoordinateReferenceSystem & crs