diff --git a/python/gui/gui.sip b/python/gui/gui.sip index 9083e197771..39c9ba78f30 100644 --- a/python/gui/gui.sip +++ b/python/gui/gui.sip @@ -100,6 +100,7 @@ %Include qgsrubberband.sip %Include qgsscalecombobox.sip %Include qgsscalerangewidget.sip +%Include qgsscalewidget.sip %Include qgsscalevisibilitydialog.sip %Include qgssearchquerybuilder.sip %Include qgstextannotationitem.sip diff --git a/python/gui/qgsscalewidget.sip b/python/gui/qgsscalewidget.sip new file mode 100644 index 00000000000..73bc809a82d --- /dev/null +++ b/python/gui/qgsscalewidget.sip @@ -0,0 +1,47 @@ + +/** A combobox which lets the user select map scale from predefined list + * and highlights nearest to current scale value + */ +class QgsScaleWidget : QWidget +{ +%TypeHeaderCode +#include +%End + + public: + QgsScaleWidget( QWidget* parent = 0 ); + ~QgsScaleWidget(); + + //! shows a button to set the scale to the current scale of the map canvas next to the combobox + //! @note the map canvas must be defined to show the button + void setShowCurrentScaleButton( bool showCurrentScaleButton ); + bool showCurrentScaleButton(); + + //! set the map canvas associated to the current button + void setMapCanvas( QgsMapCanvas* canvas ); + + //! Function to read the selected scale as text + QString scaleString(); + //! Function to set the selected scale from text + bool setScaleString( QString scaleTxt ); + //! Function to read the selected scale as double + double scale(); + //! Function to set the selected scale from double + void setScale( double scale ); + + //! Helper function to convert a double to scale string + // Performs rounding, so an exact representation is not to + // be expected. + static QString toString( double scale ); + //! Helper function to convert a scale string to double + static double toDouble( QString scaleString, bool *ok = NULL ); + + signals: + //! Signal is emitted when *user* has finished editing/selecting a new scale. + void scaleChanged(); + + public slots: + void updateScales( const QStringList &scales = QStringList() ); + +}; + diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index afe1b8ed5f0..38bfa0d47f3 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -215,6 +215,7 @@ qgsrubberband.cpp qgsscalecombobox.cpp qgsscalerangewidget.cpp qgsscalevisibilitydialog.cpp +qgsscalewidget.cpp qgssearchquerybuilder.cpp qgsslider.cpp qgssublayersdialog.cpp @@ -412,6 +413,7 @@ qgsrelationmanagerdialog.h qgsscalecombobox.h qgsscalerangewidget.h qgsscalevisibilitydialog.h +qgsscalewidget.h qgssearchquerybuilder.h qgsslider.h qgssublayersdialog.h @@ -491,6 +493,7 @@ qgsrubberband.h qgsscalecombobox.h qgsscalerangewidget.h qgsscalevisibilitydialog.h +qgsscalewidget.h qgssearchquerybuilder.h qgsslider.h qgssublayersdialog.h diff --git a/src/gui/qgsscalewidget.cpp b/src/gui/qgsscalewidget.cpp new file mode 100644 index 00000000000..4a71cd74e9f --- /dev/null +++ b/src/gui/qgsscalewidget.cpp @@ -0,0 +1,69 @@ +/*************************************************************************** + qgsscalewidget.cpp + -------------------------------------- + Date : 08.01.2015 + Copyright : (C) 2014 Denis Rouzaud + Email : denis.rouzaud@gmail.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 + +#include "qgsapplication.h" +#include "qgsscalewidget.h" +#include "qgsmapcanvas.h" + +QgsScaleWidget::QgsScaleWidget( QWidget *parent ) + : QWidget( parent ) + , mShowCurrentScaleButton( false ) + , mCanvas( NULL ) +{ + QHBoxLayout* layout = new QHBoxLayout( this ); + layout->setContentsMargins( 0, 0, 0, 0 ); + layout->setSpacing( 2 ); + + mScaleComboBox = new QgsScaleComboBox( this ); + layout->addWidget( mScaleComboBox ); + + mCurrentScaleButton = new QToolButton( this ); + mCurrentScaleButton->setIcon( QgsApplication::getThemeIcon( "/mActionMapIdentification.svg" ) ); + layout->addWidget( mCurrentScaleButton ); + mCurrentScaleButton->hide(); + + connect( mScaleComboBox, SIGNAL( scaleChanged() ), this, SIGNAL( scaleChanged() ) ); + connect( mCurrentScaleButton, SIGNAL( clicked() ), this, SLOT( setScaleFromCanvas() ) ); +} + + +QgsScaleWidget::~QgsScaleWidget() +{ +} + +void QgsScaleWidget::setShowCurrentScaleButton( bool showCurrentScaleButton ) +{ + mShowCurrentScaleButton = showCurrentScaleButton; + mCurrentScaleButton->setVisible( mShowCurrentScaleButton && mCanvas ); +} + +void QgsScaleWidget::setMapCanvas( QgsMapCanvas* canvas ) +{ + mCanvas = canvas; + mCurrentScaleButton->setVisible( mShowCurrentScaleButton && mCanvas ); +} + +void QgsScaleWidget::setScaleFromCanvas() +{ + if ( !mCanvas ) + return; + + setScale( mCanvas->scale() ); +} + + + diff --git a/src/gui/qgsscalewidget.h b/src/gui/qgsscalewidget.h new file mode 100644 index 00000000000..430abca5f7d --- /dev/null +++ b/src/gui/qgsscalewidget.h @@ -0,0 +1,82 @@ +/*************************************************************************** + qgsscalewidget.h + -------------------------------------- + Date : 08.01.2015 + Copyright : (C) 2014 Denis Rouzaud + Email : denis.rouzaud@gmail.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 QGSSCALEWIDGET_H +#define QGSSCALEWIDGET_H + +#include +#include + + +#include "qgsscalecombobox.h" + +class QgsMapCanvas; + +/** \ingroup gui + * A combobox which lets the user select map scale from predefined list + * and highlights nearest to current scale value + **/ +class GUI_EXPORT QgsScaleWidget : public QWidget +{ + Q_OBJECT + Q_PROPERTY( bool showCurrentScaleButton READ showCurrentScaleButton WRITE setShowCurrentScaleButton ) + + public: + explicit QgsScaleWidget(QWidget *parent = 0); + + virtual ~QgsScaleWidget(); + + //! shows a button to set the scale to the current scale of the map canvas next to the combobox + //! @note the map canvas must be defined to show the button + void setShowCurrentScaleButton( bool showCurrentScaleButton ); + bool showCurrentScaleButton(){ return mShowCurrentScaleButton;} + + //! set the map canvas associated to the current button + void setMapCanvas( QgsMapCanvas* canvas ); + + //! Function to read the selected scale as text + QString scaleString(){return mScaleComboBox->scaleString();} + //! Function to set the selected scale from text + bool setScaleString( QString scaleTxt ){return mScaleComboBox->setScaleString(scaleTxt);} + //! Function to read the selected scale as double + double scale(){return mScaleComboBox->scale();} + //! Function to set the selected scale from double + void setScale( double scale ){return mScaleComboBox->setScale(scale);} + + //! Helper function to convert a double to scale string + // Performs rounding, so an exact representation is not to + // be expected. + static QString toString( double scale ){return QgsScaleComboBox::toString(scale);} + //! Helper function to convert a scale string to double + static double toDouble( QString scaleString, bool *ok = NULL ){return QgsScaleComboBox::toDouble(scaleString, ok);} + + public slots: + void updateScales( const QStringList &scales = QStringList() ){return mScaleComboBox->updateScales(scales);} + + //! assign the current scale from the map canvas + void setScaleFromCanvas(); + + signals: + //! Signal is emitted when *user* has finished editing/selecting a new scale. + void scaleChanged(); + + private: + QgsScaleComboBox* mScaleComboBox; + QToolButton* mCurrentScaleButton; + QgsMapCanvas* mCanvas; + bool mShowCurrentScaleButton; +}; + +#endif // QGSSCALEWIDGET_H