From 02a0e53284a950718f0a1c664b3d8d49ce7a52b5 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 8 Mar 2017 12:04:52 +1000 Subject: [PATCH] Add options menu and allow setting map view scale --- images/images.qrc | 1 + images/themes/default/mActionMapSettings.svg | 177 +++++++++++++++++++ src/app/qgsmapcanvasdockwidget.cpp | 49 +++++ src/app/qgsmapcanvasdockwidget.h | 27 +++ 4 files changed, 254 insertions(+) create mode 100644 images/themes/default/mActionMapSettings.svg diff --git a/images/images.qrc b/images/images.qrc index 4aef98bb1ea..e12f6b65645 100644 --- a/images/images.qrc +++ b/images/images.qrc @@ -557,6 +557,7 @@ themes/default/processingResult.svg themes/default/search.svg themes/default/mActionNewMap.svg + themes/default/mActionMapSettings.svg qgis_tips/symbol_levels.png diff --git a/images/themes/default/mActionMapSettings.svg b/images/themes/default/mActionMapSettings.svg new file mode 100644 index 00000000000..f331cdb3f6c --- /dev/null +++ b/images/themes/default/mActionMapSettings.svg @@ -0,0 +1,177 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/app/qgsmapcanvasdockwidget.cpp b/src/app/qgsmapcanvasdockwidget.cpp index 616f76fa845..42157b2a191 100644 --- a/src/app/qgsmapcanvasdockwidget.cpp +++ b/src/app/qgsmapcanvasdockwidget.cpp @@ -15,7 +15,11 @@ #include "qgsmapcanvasdockwidget.h" #include "qgsmapcanvas.h" #include "qgsprojectionselectiondialog.h" +#include "qgsscalecombobox.h" #include +#include +#include +#include QgsMapCanvasDockWidget::QgsMapCanvasDockWidget( const QString &name, QWidget *parent ) : QgsDockWidget( parent ) @@ -38,6 +42,36 @@ QgsMapCanvasDockWidget::QgsMapCanvasDockWidget( const QString &name, QWidget *pa connect( mActionSetCrs, &QAction::triggered, this, &QgsMapCanvasDockWidget::setMapCrs ); connect( mActionSyncView, &QAction::toggled, this, &QgsMapCanvasDockWidget::syncView ); + + QMenu *menu = new QMenu(); + + QToolButton *toolButton = new QToolButton(); + toolButton->setMenu( menu ); + toolButton->setPopupMode( QToolButton::InstantPopup ); + toolButton->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionMapSettings.svg" ) ) ); + mToolbar->addWidget( toolButton ); + + QgsScaleComboAction *scaleAction = new QgsScaleComboAction( menu ); + menu->addAction( scaleAction ); + mScaleCombo = scaleAction->scaleCombo(); + connect( mScaleCombo, &QgsScaleComboBox::scaleChanged, this, [ = ]( double scale ) + { + if ( !mBlockScaleUpdate ) + { + mBlockScaleUpdate = true; + mMapCanvas->zoomScale( 1.0 / scale ); + mBlockScaleUpdate = false; + } + } ); + connect( mMapCanvas, &QgsMapCanvas::scaleChanged, this, [ = ]( double scale ) + { + if ( !mBlockScaleUpdate ) + { + mBlockScaleUpdate = true; + mScaleCombo->setScale( 1.0 / scale ); + mBlockScaleUpdate = false; + } + } ); } QgsMapCanvas *QgsMapCanvasDockWidget::mapCanvas() @@ -106,3 +140,18 @@ void QgsMapCanvasDockWidget::mapExtentChanged() syncView( true ); } + +QgsScaleComboAction::QgsScaleComboAction( QWidget *parent ) + : QWidgetAction( parent ) +{ + mScaleCombo = new QgsScaleComboBox(); + + QHBoxLayout *hLayout = new QHBoxLayout(); + hLayout->setContentsMargins( 2, 2, 2, 2 ); + QLabel *label = new QLabel( tr( "Scale" ) ); + hLayout->addWidget( label ); + hLayout->addWidget( mScaleCombo ); + QWidget *w = new QWidget(); + w->setLayout( hLayout ); + setDefaultWidget( w ); +} diff --git a/src/app/qgsmapcanvasdockwidget.h b/src/app/qgsmapcanvasdockwidget.h index 4ef38dea1f1..d3396007798 100644 --- a/src/app/qgsmapcanvasdockwidget.h +++ b/src/app/qgsmapcanvasdockwidget.h @@ -19,9 +19,16 @@ #include "qgsdockwidget.h" #include "qgis_app.h" +#include class QgsMapCanvas; +class QgsScaleComboBox; +/** + * \class QgsMapCanvasDockWidget + * A dock widget with an embedded map canvas, for additional map views. + * \note added in QGIS 3.0 + */ class APP_EXPORT QgsMapCanvasDockWidget : public QgsDockWidget, private Ui::QgsMapCanvasDockWidgetBase { Q_OBJECT @@ -58,8 +65,28 @@ class APP_EXPORT QgsMapCanvasDockWidget : public QgsDockWidget, private Ui::QgsM QgsMapCanvas *mMapCanvas = nullptr; QgsMapCanvas *mMainCanvas = nullptr; bool mShowCloseWarning = true; + QgsScaleComboBox *mScaleCombo = nullptr; + bool mBlockScaleUpdate = false; +}; +/** + * \class QgsScaleComboAction + * Allows embedding a scale combo into a menu. + * \note added in QGIS 3.0 + */ +class QgsScaleComboAction: public QWidgetAction +{ + Q_OBJECT + + public: + + QgsScaleComboAction( QWidget *parent = nullptr ); + + QgsScaleComboBox *scaleCombo() { return mScaleCombo; } + + private: + QgsScaleComboBox *mScaleCombo = nullptr; };