18 #include "qgssettings.h" 
   22 #include <QTextStream> 
   42   b.
setId( element.attribute( QStringLiteral( 
"id" ) ) );
 
   43   b.
setName( element.attribute( QStringLiteral( 
"name" ) ) );
 
   44   b.
setGroup( element.attribute( QStringLiteral( 
"group" ) ) );
 
   54   QDomElement bookmarkElem = doc.createElement( QStringLiteral( 
"Bookmark" ) );
 
   55   bookmarkElem.setAttribute( QStringLiteral( 
"id" ), mId );
 
   56   bookmarkElem.setAttribute( QStringLiteral( 
"name" ), mName );
 
   57   bookmarkElem.setAttribute( QStringLiteral( 
"group" ), mGroup );
 
   58   bookmarkElem.setAttribute( QStringLiteral( 
"extent" ), mExtent.
asWktPolygon() );
 
   65   return mId == other.mId && mName == other.mName && mExtent == other.mExtent && mGroup == other.mGroup;
 
   70   return !( *
this == other );
 
  111   res->mProject = project;
 
  132   if ( bookmark.
id().isEmpty() )
 
  133     bookmark.
setId( QUuid::createUuid().toString() );
 
  137     for ( 
const QgsBookmark &b : std::as_const( mBookmarks ) )
 
  139       if ( b.
id() == bookmark.
id() )
 
  150   mBookmarks << bookmark;
 
  151   if ( !mGroups.contains( bookmark.
group() ) )
 
  152     mGroups << bookmark.
group();
 
  159   return bookmark.
id();
 
  170   for ( 
const QgsBookmark &b : std::as_const( mBookmarks ) )
 
  185   mBookmarks.removeAt( pos );
 
  187     mGroups.removeOne( group );
 
  201   for ( 
const QgsBookmark &b : std::as_const( mBookmarks ) )
 
  203     if ( b.id() == bookmark.
id() )
 
  205       if ( mBookmarks[i].group() != bookmark.
group() )
 
  208           mGroups.removeOne( mBookmarks[i].group() );
 
  209         if ( !mGroups.contains( bookmark.
group() ) )
 
  210           mGroups << bookmark.
group();
 
  212       mBookmarks[i] = bookmark;
 
  228   const QList< QgsBookmark > 
bookmarks = mBookmarks;
 
  242   for ( 
int i = 0; i < mBookmarks.count(); ++i )
 
  244     if ( mBookmarks.at( i ).group() == oldName )
 
  246       mBookmarks[ i ].setGroup( newName );
 
  272     if ( b.group() == group )
 
  282   QDomElement bookmarksElem = element;
 
  283   if ( element.tagName() != QLatin1String( 
"Bookmarks" ) )
 
  285     bookmarksElem = element.firstChildElement( QStringLiteral( 
"Bookmarks" ) );
 
  288   if ( mProject && bookmarksElem.isNull() )
 
  291     const int count = mProject->
readNumEntry( QStringLiteral( 
"Bookmarks" ), QStringLiteral( 
"/count" ) );
 
  292     for ( 
int i = 0; i < count; ++i )
 
  294       const double minX = mProject->
readDoubleEntry( QStringLiteral( 
"Bookmarks" ), QStringLiteral( 
"/Row-%1/MinX" ).arg( i ) );
 
  295       const double minY = mProject->
readDoubleEntry( QStringLiteral( 
"Bookmarks" ), QStringLiteral( 
"/Row-%1/MinY" ).arg( i ) );
 
  296       const double maxX = mProject->
readDoubleEntry( QStringLiteral( 
"Bookmarks" ), QStringLiteral( 
"/Row-%1/MaxX" ).arg( i ) );
 
  297       const double maxY = mProject->
readDoubleEntry( QStringLiteral( 
"Bookmarks" ), QStringLiteral( 
"/Row-%1/MaxY" ).arg( i ) );
 
  298       const long srid = mProject->
readNumEntry( QStringLiteral( 
"Bookmarks" ), QStringLiteral( 
"/Row-%1/SRID" ).arg( i ) );
 
  300       b.
setId( QStringLiteral( 
"bookmark_%1" ).arg( i ) );
 
  301       b.
setName( mProject->
readEntry( QStringLiteral( 
"Bookmarks" ), QStringLiteral( 
"/Row-%1/Name" ).arg( i ) ) );
 
  306       result = added && result;
 
  312   QDomNodeList bookmarkNodes = element.elementsByTagName( QStringLiteral( 
"Bookmark" ) );
 
  313   for ( 
int i = 0; i < bookmarkNodes.size(); ++i )
 
  318     result = added && result;
 
  326   QDomElement bookmarksElem = doc.createElement( QStringLiteral( 
"Bookmarks" ) );
 
  330     QDomElement bookmarkElem = b.writeXml( doc );
 
  331     bookmarksElem.appendChild( bookmarkElem );
 
  333   return bookmarksElem;
 
  339   if ( b.
id().isEmpty() )
 
  351   QDomDocument doc( QStringLiteral( 
"qgis_bookmarks" ) );
 
  352   QDomElement root = doc.createElement( QStringLiteral( 
"qgis_bookmarks" ) );
 
  353   doc.appendChild( root );
 
  355   QList<QString> headerList;
 
  357       << QStringLiteral( 
"project" )
 
  358       << QStringLiteral( 
"xmin" )
 
  359       << QStringLiteral( 
"ymin" )
 
  360       << QStringLiteral( 
"xmax" )
 
  361       << QStringLiteral( 
"ymax" )
 
  362       << QStringLiteral( 
"sr_id" );
 
  366     const QList< QgsBookmark > 
bookmarks = manager->bookmarks();
 
  369       if ( !group.isEmpty() && b.group() != group )
 
  372       QDomElement bookmark = doc.createElement( QStringLiteral( 
"bookmark" ) );
 
  373       root.appendChild( bookmark );
 
  375       QDomElement 
id = doc.createElement( QStringLiteral( 
"id" ) );
 
  376       id.appendChild( doc.createTextNode( b.id() ) );
 
  377       bookmark.appendChild( 
id );
 
  379       QDomElement name = doc.createElement( QStringLiteral( 
"name" ) );
 
  380       name.appendChild( doc.createTextNode( b.name() ) );
 
  381       bookmark.appendChild( name );
 
  383       QDomElement group = doc.createElement( QStringLiteral( 
"project" ) );
 
  384       group.appendChild( doc.createTextNode( b.group() ) );
 
  385       bookmark.appendChild( group );
 
  387       QDomElement xMin = doc.createElement( QStringLiteral( 
"xmin" ) );
 
  388       xMin.appendChild( doc.createTextNode( 
qgsDoubleToString( b.extent().xMinimum() ) ) );
 
  389       bookmark.appendChild( xMin );
 
  390       QDomElement yMin = doc.createElement( QStringLiteral( 
"ymin" ) );
 
  391       yMin.appendChild( doc.createTextNode( 
qgsDoubleToString( b.extent().yMinimum() ) ) );
 
  392       bookmark.appendChild( yMin );
 
  393       QDomElement xMax = doc.createElement( QStringLiteral( 
"xmax" ) );
 
  394       xMax.appendChild( doc.createTextNode( 
qgsDoubleToString( b.extent().xMaximum() ) ) );
 
  395       bookmark.appendChild( xMax );
 
  396       QDomElement yMax = doc.createElement( QStringLiteral( 
"ymax" ) );
 
  397       yMax.appendChild( doc.createTextNode( 
qgsDoubleToString( b.extent().yMaximum() ) ) );
 
  398       bookmark.appendChild( yMax );
 
  400       QDomElement 
crs = doc.createElement( QStringLiteral( 
"sr_id" ) );
 
  401       crs.appendChild( doc.createTextNode( QString::number( b.extent().crs().srsid() ) ) );
 
  402       bookmark.appendChild( 
crs );
 
  407   if ( !f.open( QFile::WriteOnly | QIODevice::Truncate ) )
 
  413   QTextStream out( &f );
 
  414 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) 
  415   out.setCodec( 
"UTF-8" );
 
  425   if ( path.isEmpty() )
 
  431   if ( !f.open( QIODevice::ReadOnly | QIODevice::Text ) )
 
  437   if ( !doc.setContent( &f ) )
 
  443   QDomElement docElem = doc.documentElement();
 
  444   QDomNodeList nodeList = docElem.elementsByTagName( QStringLiteral( 
"bookmark" ) );
 
  447   for ( 
int i = 0; i < nodeList.count(); i++ )
 
  449     QDomNode bookmark = nodeList.at( i );
 
  450     QDomElement name = bookmark.firstChildElement( QStringLiteral( 
"name" ) );
 
  451     QDomElement prjname = bookmark.firstChildElement( QStringLiteral( 
"project" ) );
 
  452     QDomElement xmin = bookmark.firstChildElement( QStringLiteral( 
"xmin" ) );
 
  453     QDomElement ymin = bookmark.firstChildElement( QStringLiteral( 
"ymin" ) );
 
  454     QDomElement xmax = bookmark.firstChildElement( QStringLiteral( 
"xmax" ) );
 
  455     QDomElement ymax = bookmark.firstChildElement( QStringLiteral( 
"ymax" ) );
 
  456     QDomElement srid = bookmark.firstChildElement( QStringLiteral( 
"sr_id" ) );
 
  465                                          ymin.text().toDouble(),
 
  466                                          xmax.text().toDouble(),
 
  467                                          ymax.text().toDouble() ), 
crs ) );
 
  475 void QgsBookmarkManager::store()
 
  477   if ( !mFilePath.isEmpty() )
 
  479     QFile f( mFilePath );
 
  480     if ( !f.open( QFile::WriteOnly | QIODevice::Truncate ) )
 
  488     doc.appendChild( elem );
 
  490     QTextStream out( &f );
 
  491 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) 
  492     out.setCodec( 
"UTF-8" );
 
  504   mFilePath = filePath;
 
  509   if ( !QFileInfo::exists( mFilePath ) )
 
  514     if ( result != SQLITE_OK )
 
  520     if ( result == SQLITE_OK )
 
  522       while ( preparedStatement.
step() == SQLITE_ROW )
 
  524         const QString name = preparedStatement.
columnAsText( 0 );
 
  542     QFile f( mFilePath );
 
  543     if ( !f.open( QIODevice::ReadOnly | QIODevice::Text ) )
 
  549     if ( !doc.setContent( &f ) )
 
  555     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)
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.
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.
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.
bool operator!=(const QgsBookmark &other)
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.
const QgsCoordinateReferenceSystem & crs