Skip to content

Commit

Permalink
Add rotation in QgsBookmarks
Browse files Browse the repository at this point in the history
  • Loading branch information
YoannQDQ authored and nyalldawson committed Mar 29, 2023
1 parent 384b736 commit 7ea839b
Show file tree
Hide file tree
Showing 11 changed files with 138 additions and 41 deletions.
15 changes: 15 additions & 0 deletions python/core/auto_generated/qgsbookmarkmanager.sip.in
Expand Up @@ -91,6 +91,21 @@ Sets the bookmark's spatial ``extent``.
.. seealso:: :py:func:`extent`
%End


double rotation() const;
%Docstring
Returns the bookmark's map rotation.

.. seealso:: :py:func:`setRotation`
%End

void setRotation( double rotation );
%Docstring
Sets the bookmark's spatial map ``rotation``.

.. seealso:: :py:func:`rotation`
%End

static QgsBookmark fromXml( const QDomElement &element, const QDomDocument &doc );
%Docstring
Creates a bookmark using the properties from a DOM ``element``.
Expand Down
2 changes: 2 additions & 0 deletions python/core/auto_generated/qgsbookmarkmodel.sip.in
Expand Up @@ -35,6 +35,7 @@ model data is a merge of the bookmarks stored in both managers.
RoleName,
RoleId,
RoleGroup,
RoleRotation,
};

enum Columns
Expand All @@ -45,6 +46,7 @@ model data is a merge of the bookmarks stored in both managers.
ColumnYMin,
ColumnXMax,
ColumnYMax,
ColumnRotation,
ColumnCrs,
ColumnStore,
};
Expand Down
3 changes: 3 additions & 0 deletions src/app/qgsappbrowserproviders.cpp
Expand Up @@ -924,6 +924,7 @@ bool QgsBookmarkDropHandler::handleCustomUriCanvasDrop( const QgsMimeDataUtils::
}
else
{
canvas->setRotation( b.rotation() );
canvas->refresh();
}
}
Expand Down Expand Up @@ -1052,6 +1053,7 @@ void QgsBookmarksItemGuiProvider::populateContextMenu( QgsDataItem *item, QMenu
}
else
{
QgisApp::instance()->mapCanvas()->setRotation( bookmarkItem->bookmark().rotation() );
QgisApp::instance()->mapCanvas()->refresh();
}
}
Expand Down Expand Up @@ -1212,6 +1214,7 @@ bool QgsBookmarksItemGuiProvider::handleDoubleClick( QgsDataItem *item, QgsDataI
}
else
{
QgisApp::instance()->mapCanvas()->setRotation( bookmarkItem->bookmark().rotation() );
QgisApp::instance()->mapCanvas()->refresh();
}
}
Expand Down
2 changes: 2 additions & 0 deletions src/app/qgsbookmarkeditordialog.cpp
Expand Up @@ -51,6 +51,7 @@ QgsBookmarkEditorDialog::QgsBookmarkEditorDialog( QgsBookmark bookmark, bool inP
mExtentGroupBox->setOutputExtentFromCurrent();
mExtentGroupBox->setMapCanvas( mMapCanvas );
mCrsSelector->setCrs( mBookmark.extent().crs() );
mRotation->setValue( mBookmark.rotation() );

mSaveLocation->addItem( tr( "User Bookmarks" ), ApplicationManager );
mSaveLocation->addItem( tr( "Project Bookmarks" ), ProjectManager );
Expand Down Expand Up @@ -80,6 +81,7 @@ void QgsBookmarkEditorDialog::onAccepted()
bookmark.setName( mName->text() );
bookmark.setGroup( mGroup->currentText() );
bookmark.setExtent( QgsReferencedRectangle( mExtentGroupBox->outputExtent(), mExtentGroupBox->outputCrs() ) );
bookmark.setRotation( mRotation->value() );

if ( bookmark.id().isEmpty() )
{
Expand Down
24 changes: 15 additions & 9 deletions src/app/qgsbookmarks.cpp
Expand Up @@ -39,7 +39,7 @@
#include <QToolButton>
#include <QUrl>

const int QgsDoubleSpinBoxBookmarksDelegate::DECIMAL_PLACES = 6;
const int QgsDoubleSpinBoxBookmarksDelegate::DEFAULT_DECIMAL_PLACES = 6;

QgsBookmarks::QgsBookmarks( QWidget *parent )
: QgsDockWidget( parent )
Expand Down Expand Up @@ -78,6 +78,7 @@ QgsBookmarks::QgsBookmarks( QWidget *parent )

lstBookmarks->setModel( mBookmarkModel );
lstBookmarks->setItemDelegate( new QgsDoubleSpinBoxBookmarksDelegate( this ) );
lstBookmarks->setItemDelegateForColumn( QgsBookmarkManagerModel::ColumnRotation, new QgsDoubleSpinBoxBookmarksDelegate( this, 1 ) );
lstBookmarks->setSortingEnabled( true );
lstBookmarks->sortByColumn( 0, Qt::AscendingOrder );

Expand All @@ -104,6 +105,7 @@ void QgsBookmarks::addClicked()
QgsBookmark bookmark;
bookmark.setName( tr( "New bookmark" ) );
bookmark.setExtent( QgsReferencedRectangle( canvas->extent(), canvas->mapSettings().destinationCrs() ) );
bookmark.setRotation( canvas->rotation() );
QgsBookmarkEditorDialog *dlg = new QgsBookmarkEditorDialog( bookmark, false, this, canvas );
dlg->setAttribute( Qt::WA_DeleteOnClose );
dlg->show();
Expand Down Expand Up @@ -158,6 +160,7 @@ void QgsBookmarks::zoomToBookmarkIndex( const QModelIndex &index )
{
if ( QgisApp::instance()->mapCanvas()->setReferencedExtent( rect ) )
{
QgisApp::instance()->mapCanvas()->setRotation( index.data( QgsBookmarkManagerModel::RoleRotation ).toDouble() );
QgisApp::instance()->mapCanvas()->refresh();
}
else
Expand Down Expand Up @@ -253,8 +256,8 @@ void QgsBookmarks::exportToXml()
// QgsDoubleSpinBoxBookmarksDelegate
//

QgsDoubleSpinBoxBookmarksDelegate::QgsDoubleSpinBoxBookmarksDelegate( QObject *parent )
: QStyledItemDelegate( parent )
QgsDoubleSpinBoxBookmarksDelegate::QgsDoubleSpinBoxBookmarksDelegate( QObject *parent, int decimals )
: QStyledItemDelegate( parent ), mDecimals( decimals == -1 ? QgsDoubleSpinBoxBookmarksDelegate::DEFAULT_DECIMAL_PLACES : decimals )
{

}
Expand All @@ -263,19 +266,22 @@ QString QgsDoubleSpinBoxBookmarksDelegate::displayText( const QVariant &value, c
{
if ( value.userType() == QVariant::Double )
{
return locale.toString( value.toDouble(), 'f', QgsDoubleSpinBoxBookmarksDelegate::DECIMAL_PLACES );
}
else
{
return QStyledItemDelegate::displayText( value, locale );
return locale.toString( value.toDouble(), 'f', mDecimals );
}
return QStyledItemDelegate::displayText( value, locale );
}

QWidget *QgsDoubleSpinBoxBookmarksDelegate::createEditor( QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
QWidget *widget = QStyledItemDelegate::createEditor( parent, option, index );
QDoubleSpinBox *spinbox = qobject_cast<QDoubleSpinBox *>( widget );
if ( spinbox )
spinbox->setDecimals( QgsDoubleSpinBoxBookmarksDelegate::DECIMAL_PLACES );
{
if ( index.column() == QgsBookmarkManagerModel::ColumnRotation )
{
spinbox->setRange( -360, 360 );
}
spinbox->setDecimals( mDecimals );
}
return widget;
}
5 changes: 3 additions & 2 deletions src/app/qgsbookmarks.h
Expand Up @@ -38,7 +38,7 @@ class QgsDoubleSpinBoxBookmarksDelegate : public QStyledItemDelegate

public:

explicit QgsDoubleSpinBoxBookmarksDelegate( QObject *parent = nullptr );
explicit QgsDoubleSpinBoxBookmarksDelegate( QObject *parent = nullptr, int decimals = -1 );

QString displayText( const QVariant &value, const QLocale &locale ) const override;

Expand All @@ -47,7 +47,8 @@ class QgsDoubleSpinBoxBookmarksDelegate : public QStyledItemDelegate
const QModelIndex &index ) const override;
private:

static const int DECIMAL_PLACES;
static const int DEFAULT_DECIMAL_PLACES;
int mDecimals;

};

Expand Down
19 changes: 19 additions & 0 deletions src/core/qgsbookmarkmanager.cpp
Expand Up @@ -43,6 +43,7 @@ QgsBookmark QgsBookmark::fromXml( const QDomElement &element, const QDomDocument
b.setName( element.attribute( QStringLiteral( "name" ) ) );
b.setGroup( element.attribute( QStringLiteral( "group" ) ) );
const QgsRectangle e = QgsRectangle::fromWkt( element.attribute( QStringLiteral( "extent" ) ) );
b.setRotation( element.attribute( QStringLiteral( "rotation" ) ).toDouble() );
QgsCoordinateReferenceSystem crs;
crs.readXml( element );
b.setExtent( QgsReferencedRectangle( e, crs ) );
Expand All @@ -56,6 +57,7 @@ QDomElement QgsBookmark::writeXml( QDomDocument &doc ) const
bookmarkElem.setAttribute( QStringLiteral( "name" ), mName );
bookmarkElem.setAttribute( QStringLiteral( "group" ), mGroup );
bookmarkElem.setAttribute( QStringLiteral( "extent" ), mExtent.asWktPolygon() );
bookmarkElem.setAttribute( QStringLiteral( "rotation" ), mRotation );
mExtent.crs().writeXml( bookmarkElem, doc );
return bookmarkElem;
}
Expand Down Expand Up @@ -100,6 +102,16 @@ void QgsBookmark::setExtent( const QgsReferencedRectangle &extent )
mExtent = extent;
}

double QgsBookmark::rotation() const
{
return mRotation;
}

void QgsBookmark::setRotation( double rotation )
{
mRotation = rotation;
}


//
// QgsBookmarkManager
Expand Down Expand Up @@ -359,6 +371,7 @@ bool QgsBookmarkManager::exportToFile( const QString &path, const QList<const Qg
<< QStringLiteral( "ymin" )
<< QStringLiteral( "xmax" )
<< QStringLiteral( "ymax" )
<< QStringLiteral( "rotation" )
<< QStringLiteral( "sr_id" );

for ( const QgsBookmarkManager *manager : managers )
Expand Down Expand Up @@ -397,6 +410,10 @@ bool QgsBookmarkManager::exportToFile( const QString &path, const QList<const Qg
yMax.appendChild( doc.createTextNode( qgsDoubleToString( b.extent().yMaximum() ) ) );
bookmark.appendChild( yMax );

QDomElement rotation = doc.createElement( QStringLiteral( "rotation" ) );
rotation.appendChild( doc.createTextNode( qgsDoubleToString( b.rotation() ) ) );
bookmark.appendChild( rotation );

QDomElement crs = doc.createElement( QStringLiteral( "sr_id" ) );
crs.appendChild( doc.createTextNode( QString::number( b.extent().crs().srsid() ) ) );
bookmark.appendChild( crs );
Expand Down Expand Up @@ -453,6 +470,7 @@ bool QgsBookmarkManager::importFromFile( const QString &path )
QDomElement ymin = bookmark.firstChildElement( QStringLiteral( "ymin" ) );
QDomElement xmax = bookmark.firstChildElement( QStringLiteral( "xmax" ) );
QDomElement ymax = bookmark.firstChildElement( QStringLiteral( "ymax" ) );
QDomElement rotation = bookmark.firstChildElement( QStringLiteral( "rotation" ) );
QDomElement srid = bookmark.firstChildElement( QStringLiteral( "sr_id" ) );

bool ok = false;
Expand All @@ -465,6 +483,7 @@ bool QgsBookmarkManager::importFromFile( const QString &path )
ymin.text().toDouble(),
xmax.text().toDouble(),
ymax.text().toDouble() ), crs ) );
b.setRotation( rotation.text().toDouble() );
addBookmark( b, &ok );
res = res && ok;
}
Expand Down
14 changes: 14 additions & 0 deletions src/core/qgsbookmarkmanager.h
Expand Up @@ -96,6 +96,19 @@ class CORE_EXPORT QgsBookmark
*/
void setExtent( const QgsReferencedRectangle &extent );


/**
* Returns the bookmark's map rotation.
* \see setRotation()
*/
double rotation() const;

/**
* Sets the bookmark's spatial map \a rotation.
* \see rotation()
*/
void setRotation( double rotation );

/**
* Creates a bookmark using the properties from a DOM \a element.
* \see writeXml()
Expand Down Expand Up @@ -126,6 +139,7 @@ class CORE_EXPORT QgsBookmark
QString mName;
QString mGroup;
QgsReferencedRectangle mExtent;
double mRotation;

};

Expand Down
10 changes: 10 additions & 0 deletions src/core/qgsbookmarkmodel.cpp
Expand Up @@ -57,6 +57,9 @@ QVariant QgsBookmarkManagerModel::data( const QModelIndex &index, int role ) con
case RoleExtent:
return b.extent();

case RoleRotation:
return b.rotation();

case RoleName:
return b.name();

Expand Down Expand Up @@ -86,6 +89,8 @@ QVariant QgsBookmarkManagerModel::data( const QModelIndex &index, int role ) con
return b.extent().xMaximum();
case ColumnYMax:
return b.extent().yMaximum();
case ColumnRotation:
return b.rotation();
case ColumnCrs:
return b.extent().crs().authid();
case ColumnStore:
Expand Down Expand Up @@ -176,6 +181,9 @@ bool QgsBookmarkManagerModel::setData( const QModelIndex &index, const QVariant
return false;
break;
}
case ColumnRotation:
b.setRotation( value.toDouble() );
break;
case ColumnCrs:
{
QgsCoordinateReferenceSystem crs;
Expand Down Expand Up @@ -267,6 +275,8 @@ QVariant QgsBookmarkManagerModel::headerData( int section, Qt::Orientation orien
return tr( "xMax" );
case ColumnYMax:
return tr( "yMax" );
case ColumnRotation:
return tr( "rotation" );
case ColumnCrs:
return tr( "CRS" );
case ColumnStore:
Expand Down
4 changes: 3 additions & 1 deletion src/core/qgsbookmarkmodel.h
Expand Up @@ -51,6 +51,7 @@ class CORE_EXPORT QgsBookmarkManagerModel: public QAbstractTableModel
RoleName, //!< Bookmark name
RoleId, //!< Bookmark ID
RoleGroup, //!< Bookmark group
RoleRotation, //!< Bookmark map rotation
};

//! Model columns
Expand All @@ -61,7 +62,8 @@ class CORE_EXPORT QgsBookmarkManagerModel: public QAbstractTableModel
ColumnXMin, //!< Extent x-minimum
ColumnYMin, //!< Extent y-minimum
ColumnXMax, //!< Extent x-maximum
ColumnYMax, //!< Extent y-maxnimum
ColumnYMax, //!< Extent y-maximum
ColumnRotation, //!< Rotation of the map
ColumnCrs, //!< CRS of extent
ColumnStore, //!< Manager storing the bookmark (TRUE if stored in project bookmark manager)
};
Expand Down

0 comments on commit 7ea839b

Please sign in to comment.