17#include "moc_qgsbookmarkmanager.cpp"
43 b.
setId( element.attribute( QStringLiteral(
"id" ) ) );
44 b.
setName( element.attribute( QStringLiteral(
"name" ) ) );
45 b.
setGroup( element.attribute( QStringLiteral(
"group" ) ) );
47 b.
setRotation( element.attribute( QStringLiteral(
"rotation" ) ).toDouble() );
56 QDomElement bookmarkElem = doc.createElement( QStringLiteral(
"Bookmark" ) );
57 bookmarkElem.setAttribute( QStringLiteral(
"id" ), mId );
58 bookmarkElem.setAttribute( QStringLiteral(
"name" ), mName );
59 bookmarkElem.setAttribute( QStringLiteral(
"group" ), mGroup );
60 bookmarkElem.setAttribute( QStringLiteral(
"extent" ), mExtent.
asWktPolygon() );
61 bookmarkElem.setAttribute( QStringLiteral(
"rotation" ), mRotation );
68 return mId == other.mId
69 && mName == other.mName
70 && mExtent == other.mExtent
71 && mGroup == other.mGroup
77 return !( *
this == other );
128 res->mProject = project;
149 if ( bookmark.
id().isEmpty() )
150 bookmark.
setId( QUuid::createUuid().toString() );
154 for (
const QgsBookmark &b : std::as_const( mBookmarks ) )
156 if ( b.
id() == bookmark.
id() )
167 mBookmarks << bookmark;
168 if ( !mGroups.contains( bookmark.
group() ) )
169 mGroups << bookmark.
group();
176 return bookmark.
id();
187 for (
const QgsBookmark &b : std::as_const( mBookmarks ) )
202 mBookmarks.removeAt( pos );
204 mGroups.removeOne( group );
218 for (
const QgsBookmark &b : std::as_const( mBookmarks ) )
220 if ( b.id() == bookmark.
id() )
222 if ( mBookmarks[i].group() != bookmark.
group() )
225 mGroups.removeOne( mBookmarks[i].group() );
226 if ( !mGroups.contains( bookmark.
group() ) )
227 mGroups << bookmark.
group();
229 mBookmarks[i] = bookmark;
245 const QList< QgsBookmark >
bookmarks = mBookmarks;
259 for (
int i = 0; i < mBookmarks.count(); ++i )
261 if ( mBookmarks.at( i ).group() == oldName )
263 mBookmarks[ i ].setGroup( newName );
289 if ( b.group() == group )
299 QDomElement bookmarksElem = element;
300 if ( element.tagName() != QLatin1String(
"Bookmarks" ) )
302 bookmarksElem = element.firstChildElement( QStringLiteral(
"Bookmarks" ) );
305 if ( mProject && bookmarksElem.isNull() )
308 const int count = mProject->
readNumEntry( QStringLiteral(
"Bookmarks" ), QStringLiteral(
"/count" ) );
309 for (
int i = 0; i < count; ++i )
311 const double minX = mProject->
readDoubleEntry( QStringLiteral(
"Bookmarks" ), QStringLiteral(
"/Row-%1/MinX" ).arg( i ) );
312 const double minY = mProject->
readDoubleEntry( QStringLiteral(
"Bookmarks" ), QStringLiteral(
"/Row-%1/MinY" ).arg( i ) );
313 const double maxX = mProject->
readDoubleEntry( QStringLiteral(
"Bookmarks" ), QStringLiteral(
"/Row-%1/MaxX" ).arg( i ) );
314 const double maxY = mProject->
readDoubleEntry( QStringLiteral(
"Bookmarks" ), QStringLiteral(
"/Row-%1/MaxY" ).arg( i ) );
315 const long srid = mProject->
readNumEntry( QStringLiteral(
"Bookmarks" ), QStringLiteral(
"/Row-%1/SRID" ).arg( i ) );
317 b.
setId( QStringLiteral(
"bookmark_%1" ).arg( i ) );
318 b.
setName( mProject->
readEntry( QStringLiteral(
"Bookmarks" ), QStringLiteral(
"/Row-%1/Name" ).arg( i ) ) );
323 result = added && result;
329 QDomNodeList bookmarkNodes = element.elementsByTagName( QStringLiteral(
"Bookmark" ) );
330 for (
int i = 0; i < bookmarkNodes.size(); ++i )
335 result = added && result;
343 QDomElement bookmarksElem = doc.createElement( QStringLiteral(
"Bookmarks" ) );
347 QDomElement bookmarkElem = b.writeXml( doc );
348 bookmarksElem.appendChild( bookmarkElem );
350 return bookmarksElem;
356 if ( b.
id().isEmpty() )
368 QDomDocument doc( QStringLiteral(
"qgis_bookmarks" ) );
369 QDomElement root = doc.createElement( QStringLiteral(
"qgis_bookmarks" ) );
370 doc.appendChild( root );
372 QList<QString> headerList;
374 << QStringLiteral(
"project" )
375 << QStringLiteral(
"xmin" )
376 << QStringLiteral(
"ymin" )
377 << QStringLiteral(
"xmax" )
378 << QStringLiteral(
"ymax" )
379 << QStringLiteral(
"rotation" )
380 << QStringLiteral(
"sr_id" );
384 const QList< QgsBookmark >
bookmarks = manager->bookmarks();
387 if ( !group.isEmpty() && b.group() != group )
390 QDomElement bookmark = doc.createElement( QStringLiteral(
"bookmark" ) );
391 root.appendChild( bookmark );
393 QDomElement
id = doc.createElement( QStringLiteral(
"id" ) );
394 id.appendChild( doc.createTextNode( b.id() ) );
395 bookmark.appendChild(
id );
397 QDomElement name = doc.createElement( QStringLiteral(
"name" ) );
398 name.appendChild( doc.createTextNode( b.name() ) );
399 bookmark.appendChild( name );
401 QDomElement group = doc.createElement( QStringLiteral(
"project" ) );
402 group.appendChild( doc.createTextNode( b.group() ) );
403 bookmark.appendChild( group );
405 QDomElement xMin = doc.createElement( QStringLiteral(
"xmin" ) );
406 xMin.appendChild( doc.createTextNode(
qgsDoubleToString( b.extent().xMinimum() ) ) );
407 bookmark.appendChild( xMin );
408 QDomElement yMin = doc.createElement( QStringLiteral(
"ymin" ) );
409 yMin.appendChild( doc.createTextNode(
qgsDoubleToString( b.extent().yMinimum() ) ) );
410 bookmark.appendChild( yMin );
411 QDomElement xMax = doc.createElement( QStringLiteral(
"xmax" ) );
412 xMax.appendChild( doc.createTextNode(
qgsDoubleToString( b.extent().xMaximum() ) ) );
413 bookmark.appendChild( xMax );
414 QDomElement yMax = doc.createElement( QStringLiteral(
"ymax" ) );
415 yMax.appendChild( doc.createTextNode(
qgsDoubleToString( b.extent().yMaximum() ) ) );
416 bookmark.appendChild( yMax );
418 QDomElement rotation = doc.createElement( QStringLiteral(
"rotation" ) );
420 bookmark.appendChild( rotation );
422 QDomElement
crs = doc.createElement( QStringLiteral(
"sr_id" ) );
423 crs.appendChild( doc.createTextNode( QString::number( b.extent().crs().srsid() ) ) );
424 bookmark.appendChild(
crs );
429 if ( !f.open( QFile::WriteOnly | QIODevice::Truncate ) )
435 QTextStream out( &f );
436#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
437 out.setCodec(
"UTF-8" );
447 if ( path.isEmpty() )
453 if ( !f.open( QIODevice::ReadOnly | QIODevice::Text ) )
459 if ( !doc.setContent( &f ) )
465 QDomElement docElem = doc.documentElement();
466 QDomNodeList nodeList = docElem.elementsByTagName( QStringLiteral(
"bookmark" ) );
469 for (
int i = 0; i < nodeList.count(); i++ )
471 QDomNode bookmark = nodeList.at( i );
472 QDomElement name = bookmark.firstChildElement( QStringLiteral(
"name" ) );
473 QDomElement prjname = bookmark.firstChildElement( QStringLiteral(
"project" ) );
474 QDomElement xmin = bookmark.firstChildElement( QStringLiteral(
"xmin" ) );
475 QDomElement ymin = bookmark.firstChildElement( QStringLiteral(
"ymin" ) );
476 QDomElement xmax = bookmark.firstChildElement( QStringLiteral(
"xmax" ) );
477 QDomElement ymax = bookmark.firstChildElement( QStringLiteral(
"ymax" ) );
478 QDomElement rotation = bookmark.firstChildElement( QStringLiteral(
"rotation" ) );
479 QDomElement srid = bookmark.firstChildElement( QStringLiteral(
"sr_id" ) );
488 ymin.text().toDouble(),
489 xmax.text().toDouble(),
490 ymax.text().toDouble() ),
crs ) );
499void QgsBookmarkManager::store()
501 if ( !mFilePath.isEmpty() )
503 QFile f( mFilePath );
504 if ( !f.open( QFile::WriteOnly | QIODevice::Truncate ) )
512 doc.appendChild( elem );
514 QTextStream out( &f );
515#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
516 out.setCodec(
"UTF-8" );
528 mFilePath = filePath;
533 if ( !QFileInfo::exists( mFilePath ) )
538 if ( result != SQLITE_OK )
544 if ( result == SQLITE_OK )
546 while ( preparedStatement.
step() == SQLITE_ROW )
548 const QString name = preparedStatement.
columnAsText( 0 );
566 QFile f( mFilePath );
567 if ( !f.open( QIODevice::ReadOnly | QIODevice::Text ) )
573 if ( !doc.setContent( &f ) )
579 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