1212 * (at your option) any later version. *
1313 * *
1414 ***************************************************************************/
15+
1516#include " qgsextentgroupbox.h"
1617
18+ #include " qgslogger.h"
1719#include " qgscoordinatetransform.h"
1820#include " qgsrasterblock.h"
21+ #include " qgsmapcanvas.h"
1922#include " qgsmaplayermodel.h"
2023#include " qgsexception.h"
2124#include " qgsproject.h"
25+
2226#include < QMenu>
2327#include < QAction>
2428
@@ -40,13 +44,15 @@ QgsExtentGroupBox::QgsExtentGroupBox( QWidget *parent )
4044 mYMaxLineEdit ->setValidator ( new QDoubleValidator ( this ) );
4145
4246 mOriginalExtentButton ->setVisible ( false );
47+ mButtonDrawOnCanvas ->setVisible ( false );
4348
4449 connect ( mCurrentExtentButton , &QAbstractButton::clicked, this , &QgsExtentGroupBox::setOutputExtentFromCurrent );
4550 connect ( mOriginalExtentButton , &QAbstractButton::clicked, this , &QgsExtentGroupBox::setOutputExtentFromOriginal );
51+ connect ( mButtonDrawOnCanvas , &QAbstractButton::clicked, this , &QgsExtentGroupBox::setOutputExtentFromDrawOnCanvas );
52+
4653 connect ( this , &QGroupBox::clicked, this , &QgsExtentGroupBox::groupBoxClicked );
4754}
4855
49-
5056void QgsExtentGroupBox::setOriginalExtent ( const QgsRectangle &originalExtent, const QgsCoordinateReferenceSystem &originalCrs )
5157{
5258 mOriginalExtent = originalExtent;
@@ -83,6 +89,11 @@ void QgsExtentGroupBox::setOutputCrs( const QgsCoordinateReferenceSystem &output
8389 setOutputExtentFromLayer ( mExtentLayer .data () );
8490 break ;
8591
92+ case DrawOnCanvas:
93+ mOutputCrs = outputCrs;
94+ extentDrawn ( outputExtent () );
95+ break ;
96+
8697 case UserExtent:
8798 try
8899 {
@@ -167,6 +178,9 @@ void QgsExtentGroupBox::updateTitle()
167178 case ProjectLayerExtent:
168179 msg = mExtentLayerName ;
169180 break ;
181+ case DrawOnCanvas:
182+ msg = tr ( " drawn on canvas" );
183+ break ;
170184 }
171185 if ( isCheckable () && !isChecked () )
172186 msg = tr ( " none" );
@@ -213,7 +227,17 @@ void QgsExtentGroupBox::setExtentToLayerExtent( const QString &layerId )
213227
214228void QgsExtentGroupBox::setOutputExtentFromCurrent ()
215229{
216- setOutputExtent ( mCurrentExtent , mCurrentCrs , CurrentExtent );
230+ if ( mCanvas )
231+ {
232+ // Use unrotated visible extent to insure output size and scale matches canvas
233+ QgsMapSettings ms = mCanvas ->mapSettings ();
234+ ms.setRotation ( 0 );
235+ setOutputExtent ( ms.visibleExtent (), ms.destinationCrs (), CurrentExtent );
236+ }
237+ else
238+ {
239+ setOutputExtent ( mCurrentExtent , mCurrentCrs , CurrentExtent );
240+ }
217241}
218242
219243
@@ -238,6 +262,34 @@ void QgsExtentGroupBox::setOutputExtentFromLayer( const QgsMapLayer *layer )
238262 setOutputExtent ( layer->extent (), layer->crs (), ProjectLayerExtent );
239263}
240264
265+ void QgsExtentGroupBox::setOutputExtentFromDrawOnCanvas ()
266+ {
267+ if ( mCanvas )
268+ {
269+ mMapToolPrevious = mCanvas ->mapTool ();
270+ if ( !mMapToolExtent )
271+ {
272+ mMapToolExtent .reset ( new QgsMapToolExtent ( mCanvas ) );
273+ connect ( mMapToolExtent .get (), &QgsMapToolExtent::extentChanged, this , &QgsExtentGroupBox::extentDrawn );
274+ connect ( mMapToolExtent .get (), &QgsMapTool::deactivated, this , [ = ]
275+ {
276+ window ()->setVisible ( true );
277+ mMapToolPrevious = nullptr ;
278+ } );
279+ }
280+ mCanvas ->setMapTool ( mMapToolExtent .get () );
281+ window ()->setVisible ( false );
282+ }
283+ }
284+
285+ void QgsExtentGroupBox::extentDrawn ( const QgsRectangle &extent )
286+ {
287+ setOutputExtent ( extent, mCanvas ->mapSettings ().destinationCrs (), DrawOnCanvas );
288+ mCanvas ->setMapTool ( mMapToolPrevious );
289+ window ()->setVisible ( true );
290+ mMapToolPrevious = nullptr ;
291+ }
292+
241293void QgsExtentGroupBox::groupBoxClicked ()
242294{
243295 if ( !isCheckable () )
@@ -269,3 +321,16 @@ QString QgsExtentGroupBox::titleBase() const
269321{
270322 return mTitleBase ;
271323}
324+
325+ void QgsExtentGroupBox::setMapCanvas ( QgsMapCanvas *canvas )
326+ {
327+ if ( canvas )
328+ {
329+ mCanvas = canvas;
330+ mButtonDrawOnCanvas ->setVisible ( true );
331+ }
332+ else
333+ {
334+ mButtonDrawOnCanvas ->setVisible ( false );
335+ }
336+ }
0 commit comments