Skip to content

Commit

Permalink
Move coordinate bounds map to its own reusable widget
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Jul 8, 2019
1 parent e6ac0e2 commit 337f1d9
Show file tree
Hide file tree
Showing 9 changed files with 241 additions and 76 deletions.
@@ -0,0 +1,64 @@
/************************************************************************
* This file has been generated automatically from *
* *
* src/gui/qgscoordinateboundspreviewmapwidget.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
************************************************************************/




class QgsCoordinateBoundsPreviewMapWidget : QgsMapCanvas
{
%Docstring
A widget for showing the bounds of a rectangular region on an interactive map.

.. versionadded:: 3.8.1
%End

%TypeHeaderCode
#include "qgscoordinateboundspreviewmapwidget.h"
%End
public:

QgsCoordinateBoundsPreviewMapWidget( QWidget *parent /TransferThis/ = 0 );
%Docstring
Constructor for QgsCoordinateBoundsPreviewMapWidget.
%End

~QgsCoordinateBoundsPreviewMapWidget();

void setCanvasRect( const QgsRectangle &rect );
%Docstring
Sets the canvas bounds rectangle for the bounds overview map.

Must be in EPSG:4326 coordinate reference system.

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

QgsRectangle canvasRect() const;
%Docstring
Returns the current canvas bounds rectangle shown in the map.

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

void setPreviewRect( const QgsRectangle &rect );
%Docstring
Sets the "preview" rectangle for the bounds overview map.
Must be in EPSG:4326 coordinate reference system.

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

};

/************************************************************************
* This file has been generated automatically from *
* *
* src/gui/qgscoordinateboundspreviewmapwidget.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
************************************************************************/
Expand Up @@ -11,7 +11,6 @@




class QgsProjectionSelectionTreeWidget : QWidget
{
%Docstring
Expand Down
1 change: 1 addition & 0 deletions python/gui/gui_auto.sip
Expand Up @@ -100,6 +100,7 @@
%Include auto_generated/qgscolorwidgets.sip
%Include auto_generated/qgscompoundcolorwidget.sip
%Include auto_generated/qgsconfigureshortcutsdialog.sip
%Include auto_generated/qgscoordinateboundspreviewmapwidget.sip
%Include auto_generated/qgscredentialdialog.sip
%Include auto_generated/qgscurveeditorwidget.sip
%Include auto_generated/qgscustomdrophandler.sip
Expand Down
2 changes: 2 additions & 0 deletions src/gui/CMakeLists.txt
Expand Up @@ -263,6 +263,7 @@ SET(QGIS_GUI_SRCS
qgscolorwidgets.cpp
qgscompoundcolorwidget.cpp
qgsconfigureshortcutsdialog.cpp
qgscoordinateboundspreviewmapwidget.cpp
qgscredentialdialog.cpp
qgscustomdrophandler.cpp
qgscurveeditorwidget.cpp
Expand Down Expand Up @@ -454,6 +455,7 @@ SET(QGIS_GUI_MOC_HDRS
qgscolorwidgets.h
qgscompoundcolorwidget.h
qgsconfigureshortcutsdialog.h
qgscoordinateboundspreviewmapwidget.h
qgscredentialdialog.h
qgscurveeditorwidget.h
qgscustomdrophandler.h
Expand Down
95 changes: 95 additions & 0 deletions src/gui/qgscoordinateboundspreviewmapwidget.cpp
@@ -0,0 +1,95 @@
/***************************************************************************
* qgscoordinateboundspreviewmapwidget.h *
* Copyright (C) 2019 by Nyall Dawson *
* nyall dot dawson at gmail dot com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
***************************************************************************/
#include "qgscoordinateboundspreviewmapwidget.h"
#include "qgsrubberband.h"
#include "qgsvertexmarker.h"
#include "qgsapplication.h"
#include "qgsvectorlayer.h"
#include "qgsmaptoolpan.h"

QgsCoordinateBoundsPreviewMapWidget::QgsCoordinateBoundsPreviewMapWidget( QWidget *parent )
: QgsMapCanvas( parent )
{
mPreviewBand = new QgsRubberBand( this, QgsWkbTypes::PolygonGeometry );
mPreviewBand->setWidth( 4 );

mCanvasPreviewBand = new QgsRubberBand( this, QgsWkbTypes::PolygonGeometry );
mCanvasPreviewBand->setWidth( 4 );
QColor rectColor = QColor( 185, 84, 210, 60 );
mCanvasPreviewBand->setColor( rectColor );

mCanvasCenterMarker = new QgsVertexMarker( this );
mCanvasCenterMarker->setIconType( QgsVertexMarker::ICON_CROSS );
mCanvasCenterMarker->setColor( QColor( 185, 84, 210 ) );
mCanvasCenterMarker->setPenWidth( 3 );

QgsCoordinateReferenceSystem srs( 4326, QgsCoordinateReferenceSystem::EpsgCrsId );
setDestinationCrs( srs );

QString layerPath = QgsApplication::pkgDataPath() + QStringLiteral( "/resources/data/world_map.shp" );
mLayers << new QgsVectorLayer( layerPath );
setLayers( mLayers );
setMapTool( new QgsMapToolPan( this ) );
setPreviewJobsEnabled( true );
}

QgsCoordinateBoundsPreviewMapWidget::~QgsCoordinateBoundsPreviewMapWidget()
{
qDeleteAll( mLayers );
delete mPreviewBand;
delete mCanvasPreviewBand;
delete mCanvasCenterMarker;
}

void QgsCoordinateBoundsPreviewMapWidget::setPreviewRect( const QgsRectangle &rect )
{
if ( !qgsDoubleNear( rect.area(), 0.0 ) )
{
QgsGeometry geom;
if ( rect.xMinimum() > rect.xMaximum() )
{
QgsRectangle rect1 = QgsRectangle( -180, rect.yMinimum(), rect.xMaximum(), rect.yMaximum() );
QgsRectangle rect2 = QgsRectangle( rect.xMinimum(), rect.yMinimum(), 180, rect.yMaximum() );
geom = QgsGeometry::fromRect( rect1 );
geom.addPart( QgsGeometry::fromRect( rect2 ) );
}
else
{
geom = QgsGeometry::fromRect( rect );
}
mPreviewBand->setToGeometry( geom, nullptr );
mPreviewBand->setColor( QColor( 255, 0, 0, 65 ) );
QgsRectangle extent = geom.boundingBox();
extent.scale( 1.1 );
setExtent( extent );
refresh();
mPreviewBand->show();
}
else
{
mPreviewBand->hide();
zoomToFullExtent();
}
}

QgsRectangle QgsCoordinateBoundsPreviewMapWidget::canvasRect() const
{
return mCanvasRect;
}

void QgsCoordinateBoundsPreviewMapWidget::setCanvasRect( const QgsRectangle &rect )
{
mCanvasRect = rect;
mCanvasPreviewBand->setToGeometry( QgsGeometry::fromRect( mCanvasRect ), nullptr );
mCanvasPreviewBand->show();
mCanvasCenterMarker->setCenter( rect.center() );
mCanvasCenterMarker->show();
}
73 changes: 73 additions & 0 deletions src/gui/qgscoordinateboundspreviewmapwidget.h
@@ -0,0 +1,73 @@
/***************************************************************************
* qgscoordinateboundspreviewmapwidget.h *
* Copyright (C) 2019 by Nyall Dawson *
* nyall dot dawson at gmail dot com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
***************************************************************************/
#ifndef QGSCOORDINATEBOUNDSPREVIEWWIDGET_H
#define QGSCOORDINATEBOUNDSPREVIEWWIDGET_H

#include "qgsmapcanvas.h"
#include "qgis_sip.h"
#include "qgis_gui.h"

class QgsVertexMarker;

/**
* \class QgsCoordinateBoundsPreviewMapWidget
* \ingroup gui
* A widget for showing the bounds of a rectangular region on an interactive map.
* \since QGIS 3.8.1
*/

class GUI_EXPORT QgsCoordinateBoundsPreviewMapWidget : public QgsMapCanvas
{
Q_OBJECT

public:

/**
* Constructor for QgsCoordinateBoundsPreviewMapWidget.
*/
QgsCoordinateBoundsPreviewMapWidget( QWidget *parent SIP_TRANSFERTHIS = nullptr );

~QgsCoordinateBoundsPreviewMapWidget() override;

/**
* Sets the canvas bounds rectangle for the bounds overview map.
*
* Must be in EPSG:4326 coordinate reference system.
* \see canvasRect()
*/
void setCanvasRect( const QgsRectangle &rect );

/**
* Returns the current canvas bounds rectangle shown in the map.
* \see setCanvasRect()
*/
QgsRectangle canvasRect() const;

/**
* Sets the "preview" rectangle for the bounds overview map.
* Must be in EPSG:4326 coordinate reference system.
* \see previewRect()
*/
void setPreviewRect( const QgsRectangle &rect );

private:

QgsRubberBand *mPreviewBand = nullptr;
QgsRubberBand *mCanvasPreviewBand = nullptr;
QgsVertexMarker *mCanvasCenterMarker = nullptr;

QList<QgsMapLayer *> mLayers;

QgsRectangle mCanvasRect;

};

#endif // QGSCOORDINATEBOUNDSPREVIEWWIDGET_H
64 changes: 3 additions & 61 deletions src/gui/qgsprojectionselectiontreewidget.cpp
Expand Up @@ -21,10 +21,6 @@
#include "qgsmessagelog.h"
#include "qgssettings.h"
#include "qgsrectangle.h"
#include "qgsrubberband.h"
#include "qgsvectorlayer.h"
#include "qgsmaptoolpan.h"
#include "qgsvertexmarker.h"

//qt includes
#include <QFileInfo>
Expand All @@ -46,27 +42,6 @@ QgsProjectionSelectionTreeWidget::QgsProjectionSelectionTreeWidget( QWidget *par
connect( cbxHideDeprecated, &QCheckBox::stateChanged, this, &QgsProjectionSelectionTreeWidget::updateFilter );
connect( leSearch, &QgsFilterLineEdit::textChanged, this, &QgsProjectionSelectionTreeWidget::updateFilter );

mPreviewBand = new QgsRubberBand( mAreaCanvas, QgsWkbTypes::PolygonGeometry );
mPreviewBand->setWidth( 4 );

mPreviewBand2 = new QgsRubberBand( mAreaCanvas, QgsWkbTypes::PolygonGeometry );
mPreviewBand2->setWidth( 4 );
QColor rectColor = QColor( 185, 84, 210, 60 );
mPreviewBand2->setColor( rectColor );

mVertexMarker = new QgsVertexMarker( mAreaCanvas );
mVertexMarker->setIconType( QgsVertexMarker::ICON_CROSS );
mVertexMarker->setColor( QColor( 185, 84, 210 ) );
mVertexMarker->setPenWidth( 3 );

QgsCoordinateReferenceSystem srs( 4326, QgsCoordinateReferenceSystem::EpsgCrsId );
mAreaCanvas->setDestinationCrs( srs );

QString layerPath = QgsApplication::pkgDataPath() + QStringLiteral( "/resources/data/world_map.shp" );
mLayers << new QgsVectorLayer( layerPath );
mAreaCanvas->setLayers( mLayers );
mAreaCanvas->setMapTool( new QgsMapToolPan( mAreaCanvas ) );
mAreaCanvas->setPreviewJobsEnabled( true );
mAreaCanvas->setVisible( mShowMap );

if ( QDialog *dlg = qobject_cast<QDialog *>( parent ) )
Expand Down Expand Up @@ -108,11 +83,6 @@ QgsProjectionSelectionTreeWidget::QgsProjectionSelectionTreeWidget( QWidget *par

QgsProjectionSelectionTreeWidget::~QgsProjectionSelectionTreeWidget()
{
qDeleteAll( mLayers );
delete mPreviewBand;
delete mPreviewBand2;
delete mVertexMarker;

if ( !mPushProjectionToFront )
{
return;
Expand Down Expand Up @@ -326,16 +296,12 @@ void QgsProjectionSelectionTreeWidget::setCrs( const QgsCoordinateReferenceSyste

void QgsProjectionSelectionTreeWidget::setPreviewRect( const QgsRectangle &rect )
{
mPreviewRect = rect;
mPreviewBand2->setToGeometry( QgsGeometry::fromRect( mPreviewRect ), nullptr );
mPreviewBand2->show();
mVertexMarker->setCenter( rect.center() );
mVertexMarker->show();
mAreaCanvas->setCanvasRect( rect );
}

QgsRectangle QgsProjectionSelectionTreeWidget::previewRect() const
{
return mPreviewRect;
return mAreaCanvas->canvasRect();
}

// Returns the whole proj4 string for the selected projection node
Expand Down Expand Up @@ -1007,38 +973,14 @@ void QgsProjectionSelectionTreeWidget::updateBoundsPreview()

QgsRectangle rect = currentCrs.bounds();
QString extentString = tr( "Extent not known" );
mAreaCanvas->setPreviewRect( rect );
if ( !qgsDoubleNear( rect.area(), 0.0 ) )
{
QgsGeometry geom;
if ( rect.xMinimum() > rect.xMaximum() )
{
QgsRectangle rect1 = QgsRectangle( -180, rect.yMinimum(), rect.xMaximum(), rect.yMaximum() );
QgsRectangle rect2 = QgsRectangle( rect.xMinimum(), rect.yMinimum(), 180, rect.yMaximum() );
geom = QgsGeometry::fromRect( rect1 );
geom.addPart( QgsGeometry::fromRect( rect2 ) );
}
else
{
geom = QgsGeometry::fromRect( rect );
}
mPreviewBand->setToGeometry( geom, nullptr );
mPreviewBand->setColor( QColor( 255, 0, 0, 65 ) );
QgsRectangle extent = geom.boundingBox();
extent.scale( 1.1 );
mAreaCanvas->setExtent( extent );
mAreaCanvas->refresh();
mPreviewBand->show();
extentString = QStringLiteral( "%1, %2, %3, %4" )
.arg( rect.xMinimum(), 0, 'f', 2 )
.arg( rect.yMinimum(), 0, 'f', 2 )
.arg( rect.xMaximum(), 0, 'f', 2 )
.arg( rect.yMaximum(), 0, 'f', 2 );

}
else
{
mPreviewBand->hide();
mAreaCanvas->zoomToFullExtent();
}

QString extentHtml = QStringLiteral( "<dt><b>%1</b></dt><dd>%2</dd>" ).arg( tr( "Extent" ), extentString );
Expand Down

0 comments on commit 337f1d9

Please sign in to comment.