diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt index 2439c8e8195..9fa631b8b7e 100644 --- a/src/app/CMakeLists.txt +++ b/src/app/CMakeLists.txt @@ -53,7 +53,6 @@ SET(QGIS_APP_SRCS qgssourcefieldsproperties.cpp qgsattributesformproperties.cpp qgsidentifyresultsdialog.cpp - qgsinstallgridshiftdialog.cpp qgsfeatureaction.cpp qgslayercapabilitiesmodel.cpp qgslayertreeviewindicatorprovider.cpp diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index c30aca3b64d..e0600218900 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -357,6 +357,7 @@ SET(QGIS_GUI_SRCS qgshistogramwidget.cpp qgshelp.cpp qgsidentifymenu.cpp + qgsinstallgridshiftdialog.cpp qgskeyvaluewidget.cpp qgslistwidget.cpp qgslegendfilterbutton.cpp @@ -561,6 +562,7 @@ SET(QGIS_GUI_HDRS qgshighlightablecombobox.h qgshistogramwidget.h qgsidentifymenu.h + qgsinstallgridshiftdialog.h qgskeyvaluewidget.h qgslegendfilterbutton.h qgslimitedrandomcolorrampdialog.h diff --git a/src/gui/qgscoordinateoperationwidget.cpp b/src/gui/qgscoordinateoperationwidget.cpp index 533f8d0ab5f..343b50cb27e 100644 --- a/src/gui/qgscoordinateoperationwidget.cpp +++ b/src/gui/qgscoordinateoperationwidget.cpp @@ -24,6 +24,7 @@ #include "qgsguiutils.h" #include "qgsgui.h" #include "qgshelp.h" +#include "qgsinstallgridshiftdialog.h" #include #include @@ -40,8 +41,10 @@ QgsCoordinateOperationWidget::QgsCoordinateOperationWidget( QWidget *parent ) mLabelSrcDescription->setTextInteractionFlags( Qt::TextBrowserInteraction ); mLabelSrcDescription->setOpenExternalLinks( true ); + mInstallGridButton->hide(); #if PROJ_VERSION_MAJOR>=6 + connect( mInstallGridButton, &QPushButton::clicked, this, &QgsCoordinateOperationWidget::installGrid ); mCoordinateOperationTableWidget->setColumnCount( 3 ); #else mCoordinateOperationTableWidget->setColumnCount( 2 ); @@ -201,10 +204,17 @@ void QgsCoordinateOperationWidget::loadAvailableOperations() if ( !transform.isAvailable ) { QStringList gridMessages; + QStringList missingGrids; + QStringList missingGridPackages; + QStringList missingGridUrls; + for ( const QgsDatumTransform::GridDetails &grid : transform.grids ) { if ( !grid.isAvailable ) { + missingGrids << grid.shortName; + missingGridPackages << grid.packageName; + missingGridUrls << grid.url; QString m = tr( "This transformation requires the grid file “%1”, which is not available for use on the system." ).arg( grid.shortName ); if ( !grid.url.isEmpty() ) { @@ -221,6 +231,10 @@ void QgsCoordinateOperationWidget::loadAvailableOperations() } } + item->setData( MissingGridsRole, missingGrids ); + item->setData( MissingGridPackageNamesRole, missingGridPackages ); + item->setData( MissingGridUrlsRole, missingGridUrls ); + if ( gridMessages.count() > 1 ) { for ( int k = 0; k < gridMessages.count(); ++k ) @@ -702,6 +716,7 @@ void QgsCoordinateOperationWidget::tableCurrentItemChanged( QTableWidgetItem *, mLabelDstDescription->clear(); #if PROJ_VERSION_MAJOR>=6 mAreaCanvas->hide(); + mInstallGridButton->hide(); #endif } else @@ -721,6 +736,13 @@ void QgsCoordinateOperationWidget::tableCurrentItemChanged( QTableWidgetItem *, mAreaCanvas->setPreviewRect( rect ); #if PROJ_VERSION_MAJOR>=6 mAreaCanvas->show(); + + const QStringList missingGrids = srcItem->data( MissingGridsRole ).toStringList(); + mInstallGridButton->setVisible( !missingGrids.empty() ); + if ( !missingGrids.empty() ) + { + mInstallGridButton->setText( tr( "Install “%1” Grid…" ).arg( missingGrids.at( 0 ) ) ); + } #endif } else @@ -728,6 +750,7 @@ void QgsCoordinateOperationWidget::tableCurrentItemChanged( QTableWidgetItem *, mAreaCanvas->setPreviewRect( QgsRectangle() ); #if PROJ_VERSION_MAJOR>=6 mAreaCanvas->hide(); + mInstallGridButton->hide(); #endif } QTableWidgetItem *destItem = mCoordinateOperationTableWidget->item( row, 1 ); @@ -782,3 +805,42 @@ void QgsCoordinateOperationWidget::showSupersededToggled( bool ) #endif loadAvailableOperations(); } + +void QgsCoordinateOperationWidget::installGrid() +{ +#if PROJ_VERSION_MAJOR>=6 + int row = mCoordinateOperationTableWidget->currentRow(); + QTableWidgetItem *srcItem = mCoordinateOperationTableWidget->item( row, 0 ); + if ( !srcItem ) + return; + + const QStringList missingGrids = srcItem->data( MissingGridsRole ).toStringList(); + if ( missingGrids.empty() ) + return; + + const QStringList missingGridPackagesNames = srcItem->data( MissingGridPackageNamesRole ).toStringList(); + const QString packageName = missingGridPackagesNames.value( 0 ); + const QStringList missingGridUrls = srcItem->data( MissingGridUrlsRole ).toStringList(); + const QString gridUrl = missingGridUrls.value( 0 ); + + QString downloadMessage; + if ( !packageName.isEmpty() ) + { + downloadMessage = tr( "This grid is part of the “%1” package, available for download from %2." ).arg( packageName, gridUrl ); + } + else if ( !gridUrl.isEmpty() ) + { + downloadMessage = tr( "This grid is available for download from %1." ).arg( gridUrl ); + } + + const QString longMessage = tr( "

This transformation requires the grid file “%1”, which is not available for use on the system.

" ).arg( missingGrids.at( 0 ) ); + + QgsInstallGridShiftFileDialog *dlg = new QgsInstallGridShiftFileDialog( missingGrids.at( 0 ), this ); + dlg->setAttribute( Qt::WA_DeleteOnClose ); + dlg->setWindowTitle( tr( "Install Grid File" ) ); + dlg->setDescription( longMessage ); + dlg->setDownloadMessage( downloadMessage ); + dlg->exec(); + +#endif +} diff --git a/src/gui/qgscoordinateoperationwidget.h b/src/gui/qgscoordinateoperationwidget.h index 0bdb855b7a0..ec2fc57cf54 100644 --- a/src/gui/qgscoordinateoperationwidget.h +++ b/src/gui/qgscoordinateoperationwidget.h @@ -159,6 +159,8 @@ class GUI_EXPORT QgsCoordinateOperationWidget : public QWidget, private Ui::QgsC void showSupersededToggled( bool toggled ); + void installGrid(); + private: enum Roles @@ -166,7 +168,10 @@ class GUI_EXPORT QgsCoordinateOperationWidget : public QWidget, private Ui::QgsC TransformIdRole = Qt::UserRole + 1, ProjRole, AvailableRole, - BoundsRole + BoundsRole, + MissingGridsRole, + MissingGridPackageNamesRole, + MissingGridUrlsRole }; bool gridShiftTransformation( const QString &itemText ) const; diff --git a/src/app/qgsinstallgridshiftdialog.cpp b/src/gui/qgsinstallgridshiftdialog.cpp similarity index 99% rename from src/app/qgsinstallgridshiftdialog.cpp rename to src/gui/qgsinstallgridshiftdialog.cpp index 1910fdb357a..8e161d79e62 100644 --- a/src/app/qgsinstallgridshiftdialog.cpp +++ b/src/gui/qgsinstallgridshiftdialog.cpp @@ -23,6 +23,8 @@ #include #include +///@cond PRIVATE + QgsInstallGridShiftFileDialog::QgsInstallGridShiftFileDialog( const QString &gridName, QWidget *parent ) : QDialog( parent ) , mGridName( gridName ) @@ -75,3 +77,5 @@ void QgsInstallGridShiftFileDialog::installFromFile() QMessageBox::critical( this, tr( "Install Grid File" ), tr( "Could not copy %1 to %2. Please check folder permissions and retry." ).arg( mGridName, destPath ) ); } } + +///@endcond diff --git a/src/app/qgsinstallgridshiftdialog.h b/src/gui/qgsinstallgridshiftdialog.h similarity index 89% rename from src/app/qgsinstallgridshiftdialog.h rename to src/gui/qgsinstallgridshiftdialog.h index 1c5bcaead19..11bb1f37359 100644 --- a/src/app/qgsinstallgridshiftdialog.h +++ b/src/gui/qgsinstallgridshiftdialog.h @@ -20,9 +20,12 @@ #include "ui_qgsinstallgridshiftdialog.h" #include -#include "qgis_app.h" +#include "qgis_gui.h" -class QgsInstallGridShiftFileDialog: public QDialog, private Ui::QgsInstallGridShiftFileDialogBase +#define SIP_NO_FILE + +///@cond PRIVATE +class GUI_EXPORT QgsInstallGridShiftFileDialog: public QDialog, private Ui::QgsInstallGridShiftFileDialogBase { Q_OBJECT public: @@ -39,5 +42,6 @@ class QgsInstallGridShiftFileDialog: public QDialog, private Ui::QgsInstallGridS QString mGridName; }; +///@endcond #endif // QGSINSTALLGRIDSHIFTDIALOG_H diff --git a/src/ui/qgscoordinateoperationwidgetbase.ui b/src/ui/qgscoordinateoperationwidgetbase.ui index b92a8708861..68adb4b2267 100644 --- a/src/ui/qgscoordinateoperationwidgetbase.ui +++ b/src/ui/qgscoordinateoperationwidgetbase.ui @@ -29,23 +29,50 @@ - - - IBeamCursor + + + 0 - - Description - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - true - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse - - + + + + Install Grid… + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + IBeamCursor + + + Description + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + true + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + +