QGIS API Documentation  3.12.1-București (121cc00ff0)
qgslayoutvaliditychecks.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgslayoutvaliditychecks.cpp
3  ---------------------------
4  begin : November 2018
5  copyright : (C) 2018 Nyall Dawson
6  email : nyall dot dawson at gmail dot com
7  ***************************************************************************/
8 /***************************************************************************
9  * *
10  * This program is free software; you can redistribute it and/or modify *
11  * it under the terms of the GNU General Public License as published by *
12  * the Free Software Foundation; either version 2 of the License, or *
13  * (at your option) any later version. *
14  * *
15  ***************************************************************************/
16 
19 #include "qgslayoutitemscalebar.h"
20 #include "qgslayoutitemmap.h"
21 #include "qgslayoutitempicture.h"
22 #include "qgslayout.h"
23 #include "qgssettings.h"
24 
25 //
26 // QgsLayoutScaleBarValidityCheck
27 //
28 
30 {
31  return new QgsLayoutScaleBarValidityCheck();
32 }
33 
35 {
36  return QStringLiteral( "layout_scalebar_check" );
37 }
38 
40 {
42 }
43 
45 {
47  return false;
48 
49  const QgsLayoutValidityCheckContext *layoutContext = static_cast< const QgsLayoutValidityCheckContext * >( context );
50  if ( !layoutContext )
51  return false;
52 
53  QList< QgsLayoutItemScaleBar * > barItems;
54  layoutContext->layout->layoutItems( barItems );
55  for ( QgsLayoutItemScaleBar *bar : qgis::as_const( barItems ) )
56  {
57  if ( !bar->linkedMap() )
58  {
61  res.title = QObject::tr( "Scalebar is not linked to a map" );
62  const QString name = bar->displayName().toHtmlEscaped();
63  res.detailedDescription = QObject::tr( "The scalebar “%1” is not linked to a map item. This scale will be misleading." ).arg( name );
64  mResults.append( res );
65  }
66  }
67 
68  return true;
69 }
70 
72 {
73  return mResults;
74 }
75 
76 
77 //
78 // QgsLayoutNorthArrowValidityCheck
79 //
80 
82 {
84 }
85 
87 {
88  return QStringLiteral( "layout_northarrow_check" );
89 }
90 
92 {
94 }
95 
97 {
99  return false;
100 
101  const QgsLayoutValidityCheckContext *layoutContext = static_cast< const QgsLayoutValidityCheckContext * >( context );
102  if ( !layoutContext )
103  return false;
104 
105  QgsSettings settings;
106  const QString defaultPath = settings.value( QStringLiteral( "LayoutDesigner/defaultNorthArrow" ), QStringLiteral( ":/images/north_arrows/layout_default_north_arrow.svg" ), QgsSettings::Gui ).toString();
107 
108  QList< QgsLayoutItemPicture * > pictureItems;
109  layoutContext->layout->layoutItems( pictureItems );
110  for ( QgsLayoutItemPicture *picture : qgis::as_const( pictureItems ) )
111  {
112  // look for pictures which use the default north arrow svg, but aren't actually linked to maps.
113  // alternatively identify them by looking for the default "North Arrow" string in their id
114  if ( !picture->linkedMap() && ( picture->picturePath() == defaultPath || picture->id().contains( QObject::tr( "North Arrow" ), Qt::CaseInsensitive ) ) )
115  {
118  res.title = QObject::tr( "North arrow is not linked to a map" );
119  const QString name = picture->displayName().toHtmlEscaped();
120  res.detailedDescription = QObject::tr( "The north arrow “%1” is not linked to a map item. The arrow orientation may be misleading." ).arg( name );
121  mResults.append( res );
122  }
123  }
124 
125  return true;
126 }
127 
129 {
130  return mResults;
131 }
132 
133 
134 
135 //
136 // QgsLayoutOverviewValidityCheck
137 //
138 
140 {
141  return new QgsLayoutOverviewValidityCheck();
142 }
143 
145 {
146  return QStringLiteral( "layout_overview_check" );
147 }
148 
150 {
152 }
153 
155 {
157  return false;
158 
159  const QgsLayoutValidityCheckContext *layoutContext = static_cast< const QgsLayoutValidityCheckContext * >( context );
160  if ( !layoutContext )
161  return false;
162 
163  QList< QgsLayoutItemMap * > mapItems;
164  layoutContext->layout->layoutItems( mapItems );
165  for ( QgsLayoutItemMap *map : qgis::as_const( mapItems ) )
166  {
167  for ( int i = 0; i < map->overviews()->size(); ++i )
168  {
169  QgsLayoutItemMapOverview *overview = map->overviews()->overview( i );
170  if ( overview && overview->enabled() && !overview->linkedMap() )
171  {
174  res.title = QObject::tr( "Overview is not linked to a map" );
175  const QString name = map->displayName().toHtmlEscaped();
176  res.detailedDescription = QObject::tr( "The map “%1” includes an overview (“%2”) which is not linked to a map item." ).arg( name, overview->name() );
177  mResults.append( res );
178  }
179  }
180  }
181 
182  return true;
183 }
184 
186 {
187  return mResults;
188 }
189 
190 
191 
192 //
193 // QgsLayoutPictureSourceValidityCheck
194 //
195 
197 {
199 }
200 
202 {
203  return QStringLiteral( "layout_picture_source_check" );
204 }
205 
207 {
209 }
210 
212 {
214  return false;
215 
216  const QgsLayoutValidityCheckContext *layoutContext = static_cast< const QgsLayoutValidityCheckContext * >( context );
217  if ( !layoutContext )
218  return false;
219 
220  QList< QgsLayoutItemPicture * > pictureItems;
221  layoutContext->layout->layoutItems( pictureItems );
222  for ( QgsLayoutItemPicture *picture : qgis::as_const( pictureItems ) )
223  {
224  if ( picture->isMissingImage() )
225  {
228  res.title = QObject::tr( "Picture source is missing or corrupt" );
229  const QString name = picture->displayName().toHtmlEscaped();
230 
231  const QUrl picUrl = QUrl::fromUserInput( picture->evaluatedPath() );
232  const bool isLocalFile = picUrl.isLocalFile();
233 
234  res.detailedDescription = QObject::tr( "The source for picture “%1” could not be loaded or is corrupt:<p>%2" ).arg( name,
235  isLocalFile ? QDir::toNativeSeparators( picture->evaluatedPath() ) : picture->evaluatedPath() );
236  mResults.append( res );
237  }
238  }
239 
240  return true;
241 }
242 
244 {
245  return mResults;
246 }
Validity check context for print layout validation.
Layout north arrow validity check.
int checkType() const override
Returns the type of the check.
QList< QgsValidityCheckResult > runCheck(const QgsValidityCheckContext *context, QgsFeedback *feedback) override
Runs the check and returns a list of results.
Represents an individual result from a validity check run by a QgsAbstractValidityCheck subclass...
An individual overview which is drawn above the map content in a QgsLayoutItemMap, and shows the extent of another QgsLayoutItemMap.
QString detailedDescription
Detailed description of the result (translated), giving users enough detail for them to resolve the e...
Layout picture source validity check.
This class is a composition of two QSettings instances:
Definition: qgssettings.h:58
QList< QgsValidityCheckResult > runCheck(const QgsValidityCheckContext *context, QgsFeedback *feedback) override
Runs the check and returns a list of results.
Layout overview validity check.
QgsLayoutPictureSourceValidityCheck * create() const override
constructor
virtual int type() const =0
Returns the context type.
Warning only, allow operation to proceed but notify user of result.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
QgsLayoutScaleBarValidityCheck * create() const override
constructor
A layout item subclass that displays SVG files or raster format images (jpg, png, ...
int checkType() const override
Returns the type of the check.
QString id() const override
Returns the unique ID of the check.
bool prepareCheck(const QgsValidityCheckContext *context, QgsFeedback *feedback) override
Prepares the check for execution, and returns true if the check can be run.
Layout scalebar validity check.
Base class for feedback objects to be used for cancellation of something running in a worker thread...
Definition: qgsfeedback.h:45
void layoutItems(QList< T *> &itemList) const
Returns a list of layout items of a specific type.
Definition: qgslayout.h:121
Layout graphical items for displaying a map.
QString id() const override
Returns the unique ID of the check.
QgsLayout * layout
Pointer to the layout which the check is being run against.
bool enabled() const
Returns whether the item will be drawn.
bool prepareCheck(const QgsValidityCheckContext *context, QgsFeedback *feedback) override
Prepares the check for execution, and returns true if the check can be run.
QgsLayoutNorthArrowValidityCheck * create() const override
constructor
bool prepareCheck(const QgsValidityCheckContext *context, QgsFeedback *feedback) override
Prepares the check for execution, and returns true if the check can be run.
QString id() const override
Returns the unique ID of the check.
QString id() const override
Returns the unique ID of the check.
QgsLayoutOverviewValidityCheck * create() const override
constructor
Print layout validity check, triggered on exporting a print layout.
bool prepareCheck(const QgsValidityCheckContext *context, QgsFeedback *feedback) override
Prepares the check for execution, and returns true if the check can be run.
int checkType() const override
Returns the type of the check.
Layout context, see QgsLayoutValidityCheckContext.
int checkType() const override
Returns the type of the check.
A layout item subclass for scale bars.
Base class for validity check contexts.
QList< QgsValidityCheckResult > runCheck(const QgsValidityCheckContext *context, QgsFeedback *feedback) override
Runs the check and returns a list of results.
QString name() const
Returns the friendly display name for the item.
QList< QgsValidityCheckResult > runCheck(const QgsValidityCheckContext *context, QgsFeedback *feedback) override
Runs the check and returns a list of results.
QString title
A short, translated string summarising the result.
QgsLayoutItemMap * linkedMap()
Returns the source map to show the overview extent of.