Skip to content

Commit 7ea839b

Browse files
YoannQDQnyalldawson
authored andcommittedMar 29, 2023
Add rotation in QgsBookmarks
1 parent 384b736 commit 7ea839b

11 files changed

+138
-41
lines changed
 

‎python/core/auto_generated/qgsbookmarkmanager.sip.in

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,21 @@ Sets the bookmark's spatial ``extent``.
9191
.. seealso:: :py:func:`extent`
9292
%End
9393

94+
95+
double rotation() const;
96+
%Docstring
97+
Returns the bookmark's map rotation.
98+
99+
.. seealso:: :py:func:`setRotation`
100+
%End
101+
102+
void setRotation( double rotation );
103+
%Docstring
104+
Sets the bookmark's spatial map ``rotation``.
105+
106+
.. seealso:: :py:func:`rotation`
107+
%End
108+
94109
static QgsBookmark fromXml( const QDomElement &element, const QDomDocument &doc );
95110
%Docstring
96111
Creates a bookmark using the properties from a DOM ``element``.

‎python/core/auto_generated/qgsbookmarkmodel.sip.in

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ model data is a merge of the bookmarks stored in both managers.
3535
RoleName,
3636
RoleId,
3737
RoleGroup,
38+
RoleRotation,
3839
};
3940

4041
enum Columns
@@ -45,6 +46,7 @@ model data is a merge of the bookmarks stored in both managers.
4546
ColumnYMin,
4647
ColumnXMax,
4748
ColumnYMax,
49+
ColumnRotation,
4850
ColumnCrs,
4951
ColumnStore,
5052
};

‎src/app/qgsappbrowserproviders.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -924,6 +924,7 @@ bool QgsBookmarkDropHandler::handleCustomUriCanvasDrop( const QgsMimeDataUtils::
924924
}
925925
else
926926
{
927+
canvas->setRotation( b.rotation() );
927928
canvas->refresh();
928929
}
929930
}
@@ -1052,6 +1053,7 @@ void QgsBookmarksItemGuiProvider::populateContextMenu( QgsDataItem *item, QMenu
10521053
}
10531054
else
10541055
{
1056+
QgisApp::instance()->mapCanvas()->setRotation( bookmarkItem->bookmark().rotation() );
10551057
QgisApp::instance()->mapCanvas()->refresh();
10561058
}
10571059
}
@@ -1212,6 +1214,7 @@ bool QgsBookmarksItemGuiProvider::handleDoubleClick( QgsDataItem *item, QgsDataI
12121214
}
12131215
else
12141216
{
1217+
QgisApp::instance()->mapCanvas()->setRotation( bookmarkItem->bookmark().rotation() );
12151218
QgisApp::instance()->mapCanvas()->refresh();
12161219
}
12171220
}

‎src/app/qgsbookmarkeditordialog.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ QgsBookmarkEditorDialog::QgsBookmarkEditorDialog( QgsBookmark bookmark, bool inP
5151
mExtentGroupBox->setOutputExtentFromCurrent();
5252
mExtentGroupBox->setMapCanvas( mMapCanvas );
5353
mCrsSelector->setCrs( mBookmark.extent().crs() );
54+
mRotation->setValue( mBookmark.rotation() );
5455

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

8486
if ( bookmark.id().isEmpty() )
8587
{

‎src/app/qgsbookmarks.cpp

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
#include <QToolButton>
4040
#include <QUrl>
4141

42-
const int QgsDoubleSpinBoxBookmarksDelegate::DECIMAL_PLACES = 6;
42+
const int QgsDoubleSpinBoxBookmarksDelegate::DEFAULT_DECIMAL_PLACES = 6;
4343

4444
QgsBookmarks::QgsBookmarks( QWidget *parent )
4545
: QgsDockWidget( parent )
@@ -78,6 +78,7 @@ QgsBookmarks::QgsBookmarks( QWidget *parent )
7878

7979
lstBookmarks->setModel( mBookmarkModel );
8080
lstBookmarks->setItemDelegate( new QgsDoubleSpinBoxBookmarksDelegate( this ) );
81+
lstBookmarks->setItemDelegateForColumn( QgsBookmarkManagerModel::ColumnRotation, new QgsDoubleSpinBoxBookmarksDelegate( this, 1 ) );
8182
lstBookmarks->setSortingEnabled( true );
8283
lstBookmarks->sortByColumn( 0, Qt::AscendingOrder );
8384

@@ -104,6 +105,7 @@ void QgsBookmarks::addClicked()
104105
QgsBookmark bookmark;
105106
bookmark.setName( tr( "New bookmark" ) );
106107
bookmark.setExtent( QgsReferencedRectangle( canvas->extent(), canvas->mapSettings().destinationCrs() ) );
108+
bookmark.setRotation( canvas->rotation() );
107109
QgsBookmarkEditorDialog *dlg = new QgsBookmarkEditorDialog( bookmark, false, this, canvas );
108110
dlg->setAttribute( Qt::WA_DeleteOnClose );
109111
dlg->show();
@@ -158,6 +160,7 @@ void QgsBookmarks::zoomToBookmarkIndex( const QModelIndex &index )
158160
{
159161
if ( QgisApp::instance()->mapCanvas()->setReferencedExtent( rect ) )
160162
{
163+
QgisApp::instance()->mapCanvas()->setRotation( index.data( QgsBookmarkManagerModel::RoleRotation ).toDouble() );
161164
QgisApp::instance()->mapCanvas()->refresh();
162165
}
163166
else
@@ -253,8 +256,8 @@ void QgsBookmarks::exportToXml()
253256
// QgsDoubleSpinBoxBookmarksDelegate
254257
//
255258

256-
QgsDoubleSpinBoxBookmarksDelegate::QgsDoubleSpinBoxBookmarksDelegate( QObject *parent )
257-
: QStyledItemDelegate( parent )
259+
QgsDoubleSpinBoxBookmarksDelegate::QgsDoubleSpinBoxBookmarksDelegate( QObject *parent, int decimals )
260+
: QStyledItemDelegate( parent ), mDecimals( decimals == -1 ? QgsDoubleSpinBoxBookmarksDelegate::DEFAULT_DECIMAL_PLACES : decimals )
258261
{
259262

260263
}
@@ -263,19 +266,22 @@ QString QgsDoubleSpinBoxBookmarksDelegate::displayText( const QVariant &value, c
263266
{
264267
if ( value.userType() == QVariant::Double )
265268
{
266-
return locale.toString( value.toDouble(), 'f', QgsDoubleSpinBoxBookmarksDelegate::DECIMAL_PLACES );
267-
}
268-
else
269-
{
270-
return QStyledItemDelegate::displayText( value, locale );
269+
return locale.toString( value.toDouble(), 'f', mDecimals );
271270
}
271+
return QStyledItemDelegate::displayText( value, locale );
272272
}
273273

274274
QWidget *QgsDoubleSpinBoxBookmarksDelegate::createEditor( QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index ) const
275275
{
276276
QWidget *widget = QStyledItemDelegate::createEditor( parent, option, index );
277277
QDoubleSpinBox *spinbox = qobject_cast<QDoubleSpinBox *>( widget );
278278
if ( spinbox )
279-
spinbox->setDecimals( QgsDoubleSpinBoxBookmarksDelegate::DECIMAL_PLACES );
279+
{
280+
if ( index.column() == QgsBookmarkManagerModel::ColumnRotation )
281+
{
282+
spinbox->setRange( -360, 360 );
283+
}
284+
spinbox->setDecimals( mDecimals );
285+
}
280286
return widget;
281287
}

‎src/app/qgsbookmarks.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class QgsDoubleSpinBoxBookmarksDelegate : public QStyledItemDelegate
3838

3939
public:
4040

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

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

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

50-
static const int DECIMAL_PLACES;
50+
static const int DEFAULT_DECIMAL_PLACES;
51+
int mDecimals;
5152

5253
};
5354

‎src/core/qgsbookmarkmanager.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ QgsBookmark QgsBookmark::fromXml( const QDomElement &element, const QDomDocument
4343
b.setName( element.attribute( QStringLiteral( "name" ) ) );
4444
b.setGroup( element.attribute( QStringLiteral( "group" ) ) );
4545
const QgsRectangle e = QgsRectangle::fromWkt( element.attribute( QStringLiteral( "extent" ) ) );
46+
b.setRotation( element.attribute( QStringLiteral( "rotation" ) ).toDouble() );
4647
QgsCoordinateReferenceSystem crs;
4748
crs.readXml( element );
4849
b.setExtent( QgsReferencedRectangle( e, crs ) );
@@ -56,6 +57,7 @@ QDomElement QgsBookmark::writeXml( QDomDocument &doc ) const
5657
bookmarkElem.setAttribute( QStringLiteral( "name" ), mName );
5758
bookmarkElem.setAttribute( QStringLiteral( "group" ), mGroup );
5859
bookmarkElem.setAttribute( QStringLiteral( "extent" ), mExtent.asWktPolygon() );
60+
bookmarkElem.setAttribute( QStringLiteral( "rotation" ), mRotation );
5961
mExtent.crs().writeXml( bookmarkElem, doc );
6062
return bookmarkElem;
6163
}
@@ -100,6 +102,16 @@ void QgsBookmark::setExtent( const QgsReferencedRectangle &extent )
100102
mExtent = extent;
101103
}
102104

105+
double QgsBookmark::rotation() const
106+
{
107+
return mRotation;
108+
}
109+
110+
void QgsBookmark::setRotation( double rotation )
111+
{
112+
mRotation = rotation;
113+
}
114+
103115

104116
//
105117
// QgsBookmarkManager
@@ -359,6 +371,7 @@ bool QgsBookmarkManager::exportToFile( const QString &path, const QList<const Qg
359371
<< QStringLiteral( "ymin" )
360372
<< QStringLiteral( "xmax" )
361373
<< QStringLiteral( "ymax" )
374+
<< QStringLiteral( "rotation" )
362375
<< QStringLiteral( "sr_id" );
363376

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

413+
QDomElement rotation = doc.createElement( QStringLiteral( "rotation" ) );
414+
rotation.appendChild( doc.createTextNode( qgsDoubleToString( b.rotation() ) ) );
415+
bookmark.appendChild( rotation );
416+
400417
QDomElement crs = doc.createElement( QStringLiteral( "sr_id" ) );
401418
crs.appendChild( doc.createTextNode( QString::number( b.extent().crs().srsid() ) ) );
402419
bookmark.appendChild( crs );
@@ -453,6 +470,7 @@ bool QgsBookmarkManager::importFromFile( const QString &path )
453470
QDomElement ymin = bookmark.firstChildElement( QStringLiteral( "ymin" ) );
454471
QDomElement xmax = bookmark.firstChildElement( QStringLiteral( "xmax" ) );
455472
QDomElement ymax = bookmark.firstChildElement( QStringLiteral( "ymax" ) );
473+
QDomElement rotation = bookmark.firstChildElement( QStringLiteral( "rotation" ) );
456474
QDomElement srid = bookmark.firstChildElement( QStringLiteral( "sr_id" ) );
457475

458476
bool ok = false;
@@ -465,6 +483,7 @@ bool QgsBookmarkManager::importFromFile( const QString &path )
465483
ymin.text().toDouble(),
466484
xmax.text().toDouble(),
467485
ymax.text().toDouble() ), crs ) );
486+
b.setRotation( rotation.text().toDouble() );
468487
addBookmark( b, &ok );
469488
res = res && ok;
470489
}

‎src/core/qgsbookmarkmanager.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,19 @@ class CORE_EXPORT QgsBookmark
9696
*/
9797
void setExtent( const QgsReferencedRectangle &extent );
9898

99+
100+
/**
101+
* Returns the bookmark's map rotation.
102+
* \see setRotation()
103+
*/
104+
double rotation() const;
105+
106+
/**
107+
* Sets the bookmark's spatial map \a rotation.
108+
* \see rotation()
109+
*/
110+
void setRotation( double rotation );
111+
99112
/**
100113
* Creates a bookmark using the properties from a DOM \a element.
101114
* \see writeXml()
@@ -126,6 +139,7 @@ class CORE_EXPORT QgsBookmark
126139
QString mName;
127140
QString mGroup;
128141
QgsReferencedRectangle mExtent;
142+
double mRotation;
129143

130144
};
131145

‎src/core/qgsbookmarkmodel.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ QVariant QgsBookmarkManagerModel::data( const QModelIndex &index, int role ) con
5757
case RoleExtent:
5858
return b.extent();
5959

60+
case RoleRotation:
61+
return b.rotation();
62+
6063
case RoleName:
6164
return b.name();
6265

@@ -86,6 +89,8 @@ QVariant QgsBookmarkManagerModel::data( const QModelIndex &index, int role ) con
8689
return b.extent().xMaximum();
8790
case ColumnYMax:
8891
return b.extent().yMaximum();
92+
case ColumnRotation:
93+
return b.rotation();
8994
case ColumnCrs:
9095
return b.extent().crs().authid();
9196
case ColumnStore:
@@ -176,6 +181,9 @@ bool QgsBookmarkManagerModel::setData( const QModelIndex &index, const QVariant
176181
return false;
177182
break;
178183
}
184+
case ColumnRotation:
185+
b.setRotation( value.toDouble() );
186+
break;
179187
case ColumnCrs:
180188
{
181189
QgsCoordinateReferenceSystem crs;
@@ -267,6 +275,8 @@ QVariant QgsBookmarkManagerModel::headerData( int section, Qt::Orientation orien
267275
return tr( "xMax" );
268276
case ColumnYMax:
269277
return tr( "yMax" );
278+
case ColumnRotation:
279+
return tr( "rotation" );
270280
case ColumnCrs:
271281
return tr( "CRS" );
272282
case ColumnStore:

‎src/core/qgsbookmarkmodel.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class CORE_EXPORT QgsBookmarkManagerModel: public QAbstractTableModel
5151
RoleName, //!< Bookmark name
5252
RoleId, //!< Bookmark ID
5353
RoleGroup, //!< Bookmark group
54+
RoleRotation, //!< Bookmark map rotation
5455
};
5556

5657
//! Model columns
@@ -61,7 +62,8 @@ class CORE_EXPORT QgsBookmarkManagerModel: public QAbstractTableModel
6162
ColumnXMin, //!< Extent x-minimum
6263
ColumnYMin, //!< Extent y-minimum
6364
ColumnXMax, //!< Extent x-maximum
64-
ColumnYMax, //!< Extent y-maxnimum
65+
ColumnYMax, //!< Extent y-maximum
66+
ColumnRotation, //!< Rotation of the map
6567
ColumnCrs, //!< CRS of extent
6668
ColumnStore, //!< Manager storing the bookmark (TRUE if stored in project bookmark manager)
6769
};

‎src/ui/qgsbookmarkeditordialog.ui

Lines changed: 52 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,35 @@
1515
</property>
1616
<layout class="QVBoxLayout" name="verticalLayout">
1717
<item>
18-
<layout class="QGridLayout" name="gridLayout" rowstretch="0,0,0,0,0,0,0,0,0,0,0">
19-
<item row="2" column="0" colspan="2">
20-
<widget class="QgsExtentGroupBox" name="mExtentGroupBox">
18+
<layout class="QGridLayout" name="gridLayout" rowstretch="0,0,0,0,0,0">
19+
<item row="3" column="0">
20+
<widget class="QLabel" name="lblRotation">
21+
<property name="text">
22+
<string>Rotation</string>
23+
</property>
24+
</widget>
25+
</item>
26+
<item row="4" column="0">
27+
<widget class="QLabel" name="lblCRS">
28+
<property name="text">
29+
<string>CRS</string>
30+
</property>
31+
</widget>
32+
</item>
33+
<item row="5" column="1">
34+
<widget class="QComboBox" name="mSaveLocation"/>
35+
</item>
36+
<item row="4" column="1">
37+
<widget class="QgsProjectionSelectionWidget" name="mCrsSelector" native="true">
2138
<property name="focusPolicy">
2239
<enum>Qt::StrongFocus</enum>
2340
</property>
24-
<property name="title">
25-
<string>Extent</string>
41+
</widget>
42+
</item>
43+
<item row="5" column="0">
44+
<widget class="QLabel" name="lblSaveLocation">
45+
<property name="text">
46+
<string>Saved in</string>
2647
</property>
2748
</widget>
2849
</item>
@@ -33,47 +54,49 @@
3354
</property>
3455
</widget>
3556
</item>
36-
<item row="0" column="1">
37-
<widget class="QLineEdit" name="mName"/>
38-
</item>
3957
<item row="1" column="0">
4058
<widget class="QLabel" name="lblGroup">
4159
<property name="text">
4260
<string>Group</string>
4361
</property>
4462
</widget>
4563
</item>
64+
<item row="0" column="1">
65+
<widget class="QLineEdit" name="mName"/>
66+
</item>
4667
<item row="1" column="1">
4768
<widget class="QComboBox" name="mGroup">
4869
<property name="editable">
4970
<bool>true</bool>
5071
</property>
5172
</widget>
5273
</item>
53-
<item row="3" column="0">
54-
<widget class="QLabel" name="lblCRS">
55-
<property name="text">
56-
<string>CRS</string>
57-
</property>
58-
</widget>
59-
</item>
60-
<item row="3" column="1">
61-
<widget class="QgsProjectionSelectionWidget" name="mCrsSelector" native="true">
74+
<item row="2" column="0" colspan="2">
75+
<widget class="QgsExtentGroupBox" name="mExtentGroupBox" native="true">
6276
<property name="focusPolicy">
6377
<enum>Qt::StrongFocus</enum>
6478
</property>
79+
<property name="title" stdset="0">
80+
<string>Extent</string>
81+
</property>
6582
</widget>
6683
</item>
67-
<item row="4" column="0">
68-
<widget class="QLabel" name="lblSaveLocation">
69-
<property name="text">
70-
<string>Saved in</string>
84+
<item row="3" column="1">
85+
<widget class="QDoubleSpinBox" name="mRotation">
86+
<property name="suffix">
87+
<string> °</string>
88+
</property>
89+
<property name="decimals">
90+
<number>1</number>
91+
</property>
92+
<property name="minimum">
93+
<double>-360.000000000000000</double>
94+
</property>
95+
<property name="maximum">
96+
<double>360.000000000000000</double>
7197
</property>
7298
</widget>
7399
</item>
74-
<item row="4" column="1">
75-
<widget class="QComboBox" name="mSaveLocation"/>
76-
</item>
77100
</layout>
78101
</item>
79102
<item>
@@ -103,15 +126,15 @@
103126
</widget>
104127
<customwidgets>
105128
<customwidget>
106-
<class>QgsExtentGroupBox</class>
107-
<extends>QgsCollapsibleGroupBox</extends>
108-
<header>qgsextentgroupbox.h</header>
129+
<class>QgsProjectionSelectionWidget</class>
130+
<extends>QWidget</extends>
131+
<header>qgsprojectionselectionwidget.h</header>
109132
<container>1</container>
110133
</customwidget>
111134
<customwidget>
112-
<class>QgsProjectionSelectionWidget</class>
135+
<class>QgsExtentGroupBox</class>
113136
<extends>QWidget</extends>
114-
<header>qgsprojectionselectionwidget.h</header>
137+
<header>qgsextentgroupbox.h</header>
115138
<container>1</container>
116139
</customwidget>
117140
</customwidgets>

0 commit comments

Comments
 (0)
Please sign in to comment.