QGIS API Documentation  3.20.0-Odense (decaadbb31)
qgsscalewidget.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsscalewidget.cpp
3  --------------------------------------
4  Date : 08.01.2015
5  Copyright : (C) 2014 Denis Rouzaud
6  Email : [email protected]
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15 
16 #include <QHBoxLayout>
17 
18 #include "qgsapplication.h"
19 #include "qgsscalewidget.h"
20 #include "qgsmapcanvas.h"
21 #include "qgsproject.h"
22 #include "qgslayoutmanager.h"
23 #include "qgslayoutitemmap.h"
24 #include "qgsprintlayout.h"
25 
26 #include <QMenu>
27 
29  : QWidget( parent )
30 {
31  QHBoxLayout *layout = new QHBoxLayout( this );
32  layout->setContentsMargins( 0, 0, 0, 0 );
33  layout->setSpacing( 6 );
34 
35  mScaleComboBox = new QgsScaleComboBox( this );
36  layout->addWidget( mScaleComboBox );
37 
38  mCurrentScaleButton = new QToolButton( this );
39  mCurrentScaleButton->setToolTip( tr( "Set to current canvas scale" ) );
40  mCurrentScaleButton->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionMapIdentification.svg" ) ) );
41 
42  mMenu = new QMenu( this );
43  mCurrentScaleButton->setMenu( mMenu );
44  mCurrentScaleButton->setPopupMode( QToolButton::MenuButtonPopup );
45  connect( mMenu, &QMenu::aboutToShow, this, &QgsScaleWidget::menuAboutToShow );
46 
47  layout->addWidget( mCurrentScaleButton );
48  mCurrentScaleButton->hide();
49 
50  connect( mScaleComboBox, &QgsScaleComboBox::scaleChanged, this, &QgsScaleWidget::scaleChanged );
51  connect( mCurrentScaleButton, &QAbstractButton::clicked, this, &QgsScaleWidget::setScaleFromCanvas );
52 }
53 
54 void QgsScaleWidget::setShowCurrentScaleButton( bool showCurrentScaleButton )
55 {
56  mShowCurrentScaleButton = showCurrentScaleButton;
57  mCurrentScaleButton->setVisible( mShowCurrentScaleButton && mCanvas );
58 }
59 
61 {
62  mCanvas = canvas;
63  mCurrentScaleButton->setVisible( mShowCurrentScaleButton && mCanvas );
64 }
65 
67 {
68  return mScaleComboBox->isNull();
69 }
70 
71 void QgsScaleWidget::setAllowNull( bool allowNull )
72 {
73  mScaleComboBox->setAllowNull( allowNull );
74 }
75 
77 {
78  return mScaleComboBox->allowNull();
79 }
80 
82 {
83  if ( !mCanvas )
84  return;
85 
86  setScale( mCanvas->scale() );
87 }
88 
90 {
91  mScaleComboBox->setNull();
92 }
93 
94 void QgsScaleWidget::setScale( double scale )
95 {
96  mScaleComboBox->setScale( scale );
97 }
98 
99 void QgsScaleWidget::menuAboutToShow()
100 {
101  mMenu->clear();
102 
103  double scale = mCanvas->scale();
104  QAction *canvasScaleAction = new QAction( QgsApplication::getThemeIcon( QStringLiteral( "/mActionMapIdentification.svg" ) ),
105  tr( "Current Canvas Scale (1:%1)" ).arg( qgsDoubleToString( scale, 0 ) ), mMenu );
106  connect( canvasScaleAction, &QAction::triggered, this, [this, scale] { setScale( scale ); } );
107  mMenu->addAction( canvasScaleAction );
108 
109  bool first = true;
111  {
112  const QList<QgsPrintLayout *> layouts = manager->printLayouts();
113  for ( const QgsPrintLayout *layout : layouts )
114  {
115  QList< QgsLayoutItemMap * > maps;
116  layout->layoutItems( maps );
117  if ( maps.empty() )
118  continue;
119 
120  if ( first )
121  mMenu->addSeparator();
122 
123  first = false;
124 
125  QMenu *layoutMenu = new QMenu( layout->name(), mMenu );
126  for ( const QgsLayoutItemMap *map : std::as_const( maps ) )
127  {
128  scale = map->scale();
129  QAction *mapScaleAction = new QAction( tr( "%1 (1:%2)" ).arg( map->displayName(), qgsDoubleToString( scale, 0 ) ), mMenu );
130  connect( mapScaleAction, &QAction::triggered, this, [this, scale] { setScale( scale ); } );
131  layoutMenu->addAction( mapScaleAction );
132  }
133  mMenu->addMenu( layoutMenu );
134  }
135  }
136 }
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
Layout graphical items for displaying a map.
Manages storage of a set of layouts.
Map canvas is a class for displaying all GIS data types on a canvas.
Definition: qgsmapcanvas.h:86
double scale() const
Returns the last reported scale of the canvas.
Print layout, a QgsLayout subclass for static or atlas-based layouts.
static QgsProject * instance()
Returns the QgsProject singleton instance.
Definition: qgsproject.cpp:467
const QgsLayoutManager * layoutManager() const
Returns the project's layout manager, which manages print layouts, atlases and reports within the pro...
A combobox which lets the user select map scale from predefined list and highlights nearest to curren...
void setAllowNull(bool allowNull)
Sets whether the scale combobox can be set to a NULL value.
bool isNull() const
Returns true if the combo box is currently set to a "null" value.
bool allowNull() const
Returns true if the combobox can be set to a NULL value.
void setScale(double scale)
Set the selected scale from a double.
void setNull()
Sets the combo box to the null value.
void scaleChanged(double scale)
Emitted when user has finished editing/selecting a new scale.
bool isNull() const
Returns true if the widget is currently set to a "null" value.
void scaleChanged(double scale)
Emitted when user has finished editing/selecting a new scale.
void setScaleFromCanvas()
Assigns the current scale from the map canvas, if set.
bool allowNull() const
Returns true if the widget can be set to a NULL value.
void setMapCanvas(QgsMapCanvas *canvas)
Set the map canvas associated to the current button.
void setShowCurrentScaleButton(bool showCurrentScaleButton)
Sets whether to show a button to set the scale to the current scale of the map canvas next to the com...
void setNull()
Sets the widget to the null value.
bool showCurrentScaleButton
void setScale(double scale)
Set the selected scale from a double.
QgsScaleWidget(QWidget *parent=nullptr)
QgsScaleWidget creates a combobox which lets the user select map scale from predefined list and highl...
void setAllowNull(bool allowNull)
Sets whether the scale widget can be set to a NULL value.
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
Definition: qgis.h:550