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.
 
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.
 
Q_INVOKABLE 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