28#include "moc_qgsbookmarkmanager.cpp"
47 b.
setId( element.attribute( QStringLiteral(
"id" ) ) );
48 b.
setName( element.attribute( QStringLiteral(
"name" ) ) );
49 b.
setGroup( element.attribute( QStringLiteral(
"group" ) ) );
51 b.
setRotation( element.attribute( QStringLiteral(
"rotation" ) ).toDouble() );
60 QDomElement bookmarkElem = doc.createElement( QStringLiteral(
"Bookmark" ) );
61 bookmarkElem.setAttribute( QStringLiteral(
"id" ), mId );
62 bookmarkElem.setAttribute( QStringLiteral(
"name" ), mName );
63 bookmarkElem.setAttribute( QStringLiteral(
"group" ), mGroup );
64 bookmarkElem.setAttribute( QStringLiteral(
"extent" ), mExtent.asWktPolygon() );
65 bookmarkElem.setAttribute( QStringLiteral(
"rotation" ), mRotation );
66 mExtent.crs().
writeXml( bookmarkElem, doc );
72 return mId == other.mId
73 && mName == other.mName
74 && mExtent == other.mExtent
75 && mGroup == other.mGroup
81 return !( *
this == other );
132 res->mProject = project;
153 if ( bookmark.
id().isEmpty() )
154 bookmark.
setId( QUuid::createUuid().toString() );
158 for (
const QgsBookmark &b : std::as_const( mBookmarks ) )
160 if ( b.
id() == bookmark.
id() )
171 mBookmarks << bookmark;
172 if ( !mGroups.contains( bookmark.
group() ) )
173 mGroups << bookmark.
group();
177 mProject->setDirty(
true );
180 return bookmark.
id();
191 for (
const QgsBookmark &b : std::as_const( mBookmarks ) )
206 mBookmarks.removeAt( pos );
208 mGroups.removeOne( group );
212 mProject->setDirty(
true );
222 for (
const QgsBookmark &b : std::as_const( mBookmarks ) )
224 if ( b.id() == bookmark.
id() )
226 if ( mBookmarks[i].group() != bookmark.
group() )
229 mGroups.removeOne( mBookmarks[i].group() );
230 if ( !mGroups.contains( bookmark.
group() ) )
231 mGroups << bookmark.
group();
233 mBookmarks[i] = bookmark;
237 mProject->setDirty(
true );
249 const QList< QgsBookmark >
bookmarks = mBookmarks;
263 for (
int i = 0; i < mBookmarks.count(); ++i )
265 if ( mBookmarks.at( i ).group() == oldName )
267 mBookmarks[ i ].setGroup( newName );
293 if ( b.group() == group )
303 QDomElement bookmarksElem = element;
304 if ( element.tagName() != QLatin1String(
"Bookmarks" ) )
306 bookmarksElem = element.firstChildElement( QStringLiteral(
"Bookmarks" ) );
309 if ( mProject && bookmarksElem.isNull() )
312 const int count = mProject->readNumEntry( QStringLiteral(
"Bookmarks" ), QStringLiteral(
"/count" ) );
313 for (
int i = 0; i < count; ++i )
315 const double minX = mProject->readDoubleEntry( QStringLiteral(
"Bookmarks" ), QStringLiteral(
"/Row-%1/MinX" ).arg( i ) );
316 const double minY = mProject->readDoubleEntry( QStringLiteral(
"Bookmarks" ), QStringLiteral(
"/Row-%1/MinY" ).arg( i ) );
317 const double maxX = mProject->readDoubleEntry( QStringLiteral(
"Bookmarks" ), QStringLiteral(
"/Row-%1/MaxX" ).arg( i ) );
318 const double maxY = mProject->readDoubleEntry( QStringLiteral(
"Bookmarks" ), QStringLiteral(
"/Row-%1/MaxY" ).arg( i ) );
319 const long srid = mProject->readNumEntry( QStringLiteral(
"Bookmarks" ), QStringLiteral(
"/Row-%1/SRID" ).arg( i ) );
321 b.
setId( QStringLiteral(
"bookmark_%1" ).arg( i ) );
322 b.
setName( mProject->readEntry( QStringLiteral(
"Bookmarks" ), QStringLiteral(
"/Row-%1/Name" ).arg( i ) ) );
327 result = added && result;
333 QDomNodeList bookmarkNodes = element.elementsByTagName( QStringLiteral(
"Bookmark" ) );
334 for (
int i = 0; i < bookmarkNodes.size(); ++i )
339 result = added && result;
347 QDomElement bookmarksElem = doc.createElement( QStringLiteral(
"Bookmarks" ) );
351 QDomElement bookmarkElem = b.writeXml( doc );
352 bookmarksElem.appendChild( bookmarkElem );
354 return bookmarksElem;
360 if ( b.
id().isEmpty() )
372 QDomDocument doc( QStringLiteral(
"qgis_bookmarks" ) );
373 QDomElement root = doc.createElement( QStringLiteral(
"qgis_bookmarks" ) );
374 doc.appendChild( root );
376 QList<QString> headerList;
378 << QStringLiteral(
"project" )
379 << QStringLiteral(
"xmin" )
380 << QStringLiteral(
"ymin" )
381 << QStringLiteral(
"xmax" )
382 << QStringLiteral(
"ymax" )
383 << QStringLiteral(
"rotation" )
384 << QStringLiteral(
"sr_id" );
388 const QList< QgsBookmark >
bookmarks = manager->bookmarks();
391 if ( !group.isEmpty() && b.group() != group )
394 QDomElement bookmark = doc.createElement( QStringLiteral(
"bookmark" ) );
395 root.appendChild( bookmark );
397 QDomElement
id = doc.createElement( QStringLiteral(
"id" ) );
398 id.appendChild( doc.createTextNode( b.id() ) );
399 bookmark.appendChild(
id );
401 QDomElement name = doc.createElement( QStringLiteral(
"name" ) );
402 name.appendChild( doc.createTextNode( b.name() ) );
403 bookmark.appendChild( name );
405 QDomElement group = doc.createElement( QStringLiteral(
"project" ) );
406 group.appendChild( doc.createTextNode( b.group() ) );
407 bookmark.appendChild( group );
409 QDomElement xMin = doc.createElement( QStringLiteral(
"xmin" ) );
410 xMin.appendChild( doc.createTextNode(
qgsDoubleToString( b.extent().xMinimum() ) ) );
411 bookmark.appendChild( xMin );
412 QDomElement yMin = doc.createElement( QStringLiteral(
"ymin" ) );
413 yMin.appendChild( doc.createTextNode(
qgsDoubleToString( b.extent().yMinimum() ) ) );
414 bookmark.appendChild( yMin );
415 QDomElement xMax = doc.createElement( QStringLiteral(
"xmax" ) );
416 xMax.appendChild( doc.createTextNode(
qgsDoubleToString( b.extent().xMaximum() ) ) );
417 bookmark.appendChild( xMax );
418 QDomElement yMax = doc.createElement( QStringLiteral(
"ymax" ) );
419 yMax.appendChild( doc.createTextNode(
qgsDoubleToString( b.extent().yMaximum() ) ) );
420 bookmark.appendChild( yMax );
422 QDomElement rotation = doc.createElement( QStringLiteral(
"rotation" ) );
424 bookmark.appendChild( rotation );
426 QDomElement crs = doc.createElement( QStringLiteral(
"sr_id" ) );
427 crs.appendChild( doc.createTextNode( QString::number( b.extent().crs().srsid() ) ) );
428 bookmark.appendChild( crs );
433 if ( !f.open( QFile::WriteOnly | QIODevice::Truncate ) )
439 QTextStream out( &f );
440#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
441 out.setCodec(
"UTF-8" );
451 if ( path.isEmpty() )
457 if ( !f.open( QIODevice::ReadOnly | QIODevice::Text ) )
463 if ( !doc.setContent( &f ) )
469 QDomElement docElem = doc.documentElement();
470 QDomNodeList nodeList = docElem.elementsByTagName( QStringLiteral(
"bookmark" ) );
473 for (
int i = 0; i < nodeList.count(); i++ )
475 QDomNode bookmark = nodeList.at( i );
476 QDomElement name = bookmark.firstChildElement( QStringLiteral(
"name" ) );
477 QDomElement prjname = bookmark.firstChildElement( QStringLiteral(
"project" ) );
478 QDomElement xmin = bookmark.firstChildElement( QStringLiteral(
"xmin" ) );
479 QDomElement ymin = bookmark.firstChildElement( QStringLiteral(
"ymin" ) );
480 QDomElement xmax = bookmark.firstChildElement( QStringLiteral(
"xmax" ) );
481 QDomElement ymax = bookmark.firstChildElement( QStringLiteral(
"ymax" ) );
482 QDomElement rotation = bookmark.firstChildElement( QStringLiteral(
"rotation" ) );
483 QDomElement srid = bookmark.firstChildElement( QStringLiteral(
"sr_id" ) );
492 ymin.text().toDouble(),
493 xmax.text().toDouble(),
494 ymax.text().toDouble() ), crs ) );
503void QgsBookmarkManager::store()
505 if ( !mFilePath.isEmpty() )
507 QFile f( mFilePath );
508 if ( !f.open( QFile::WriteOnly | QIODevice::Truncate ) )
516 doc.appendChild( elem );
518 QTextStream out( &f );
519#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
520 out.setCodec(
"UTF-8" );
532 mFilePath = filePath;
537 if ( !QFileInfo::exists( mFilePath ) )
542 if ( result != SQLITE_OK )
548 if ( result == SQLITE_OK )
550 while ( preparedStatement.
step() == SQLITE_ROW )
552 const QString name = preparedStatement.
columnAsText( 0 );
570 QFile f( mFilePath );
571 if ( !f.open( QIODevice::ReadOnly | QIODevice::Text ) )
577 if ( !doc.setContent( &f ) )
583 QDomElement elem = doc.documentElement();
static QString qgisUserDatabaseFilePath()
Returns the path to the user qgis.db file.
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.
QgsBookmark()=default
Default constructor, creates an empty bookmark.
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.
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.
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,...
A rectangle specified with double values.
static QgsRectangle fromWkt(const QString &wkt)
Creates a new rectangle from a wkt string.
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).