QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
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
20#include "qgslayoutitemmap.h"
22#include "qgslayout.h"
23#include "qgssettings.h"
24#include <QUrl>
25
26//
27// QgsLayoutScaleBarValidityCheck
28//
29
31{
33}
34
36{
37 return QStringLiteral( "layout_scalebar_check" );
38}
39
41{
42 return static_cast< int >( QgsAbstractValidityCheck::Type::LayoutCheck );
43}
44
46{
48 return false;
49
50 const QgsLayoutValidityCheckContext *layoutContext = static_cast< const QgsLayoutValidityCheckContext * >( context );
51 if ( !layoutContext )
52 return false;
53
54 QList< QgsLayoutItemScaleBar * > barItems;
55 layoutContext->layout->layoutItems( barItems );
56 for ( QgsLayoutItemScaleBar *bar : std::as_const( barItems ) )
57 {
58 if ( !bar->linkedMap() )
59 {
62 res.title = QObject::tr( "Scalebar is not linked to a map" );
63 const QString name = bar->displayName().toHtmlEscaped();
64 res.detailedDescription = QObject::tr( "The scalebar “%1” is not linked to a map item. This scale will be misleading." ).arg( name );
65 mResults.append( res );
66 }
67 }
68
69 return true;
70}
71
73{
74 return mResults;
75}
76
77
78//
79// QgsLayoutNorthArrowValidityCheck
80//
81
83{
85}
86
88{
89 return QStringLiteral( "layout_northarrow_check" );
90}
91
93{
94 return static_cast< int >( QgsAbstractValidityCheck::Type::LayoutCheck );
95}
96
98{
100 return false;
101
102 const QgsLayoutValidityCheckContext *layoutContext = static_cast< const QgsLayoutValidityCheckContext * >( context );
103 if ( !layoutContext )
104 return false;
105
106 QgsSettings settings;
107 const QString defaultPath = settings.value( QStringLiteral( "LayoutDesigner/defaultNorthArrow" ), QStringLiteral( ":/images/north_arrows/layout_default_north_arrow.svg" ), QgsSettings::Gui ).toString();
108
109 QList< QgsLayoutItemPicture * > pictureItems;
110 layoutContext->layout->layoutItems( pictureItems );
111 for ( QgsLayoutItemPicture *picture : std::as_const( pictureItems ) )
112 {
113 // look for pictures which use the default north arrow svg, but aren't actually linked to maps.
114 // alternatively identify them by looking for the default "North Arrow" string in their id
115 if ( !picture->linkedMap() && ( picture->picturePath() == defaultPath || picture->id().contains( QObject::tr( "North Arrow" ), Qt::CaseInsensitive ) ) )
116 {
119 res.title = QObject::tr( "North arrow is not linked to a map" );
120 const QString name = picture->displayName().toHtmlEscaped();
121 res.detailedDescription = QObject::tr( "The north arrow “%1” is not linked to a map item. The arrow orientation may be misleading." ).arg( name );
122 mResults.append( res );
123 }
124 }
125
126 return true;
127}
128
130{
131 return mResults;
132}
133
134
135
136//
137// QgsLayoutOverviewValidityCheck
138//
139
141{
143}
144
146{
147 return QStringLiteral( "layout_overview_check" );
148}
149
151{
152 return static_cast< int >( QgsAbstractValidityCheck::Type::LayoutCheck );
153}
154
156{
158 return false;
159
160 const QgsLayoutValidityCheckContext *layoutContext = static_cast< const QgsLayoutValidityCheckContext * >( context );
161 if ( !layoutContext )
162 return false;
163
164 QList< QgsLayoutItemMap * > mapItems;
165 layoutContext->layout->layoutItems( mapItems );
166 for ( QgsLayoutItemMap *map : std::as_const( mapItems ) )
167 {
168 for ( int i = 0; i < map->overviews()->size(); ++i )
169 {
170 QgsLayoutItemMapOverview *overview = map->overviews()->overview( i );
171 if ( overview && overview->enabled() && !overview->linkedMap() )
172 {
175 res.title = QObject::tr( "Overview is not linked to a map" );
176 const QString name = map->displayName().toHtmlEscaped();
177 res.detailedDescription = QObject::tr( "The map “%1” includes an overview (“%2”) which is not linked to a map item." ).arg( name, overview->name() );
178 mResults.append( res );
179 }
180 }
181 }
182
183 return true;
184}
185
187{
188 return mResults;
189}
190
191
192
193//
194// QgsLayoutPictureSourceValidityCheck
195//
196
198{
200}
201
203{
204 return QStringLiteral( "layout_picture_source_check" );
205}
206
208{
209 return static_cast< int >( QgsAbstractValidityCheck::Type::LayoutCheck );
210}
211
213{
215 return false;
216
217 const QgsLayoutValidityCheckContext *layoutContext = static_cast< const QgsLayoutValidityCheckContext * >( context );
218 if ( !layoutContext )
219 return false;
220
221 QList< QgsLayoutItemPicture * > pictureItems;
222 layoutContext->layout->layoutItems( pictureItems );
223 for ( QgsLayoutItemPicture *picture : std::as_const( pictureItems ) )
224 {
225 if ( picture->isMissingImage() )
226 {
229 res.title = QObject::tr( "Picture source is missing or corrupt" );
230 const QString name = picture->displayName().toHtmlEscaped();
231
232 const QUrl picUrl = QUrl::fromUserInput( picture->evaluatedPath() );
233 const bool isLocalFile = picUrl.isLocalFile();
234
235 res.detailedDescription = QObject::tr( "The source for picture “%1” could not be loaded or is corrupt:<p>%2" ).arg( name,
236 isLocalFile ? QDir::toNativeSeparators( picture->evaluatedPath() ) : picture->evaluatedPath() );
237 mResults.append( res );
238 }
239 }
240
241 return true;
242}
243
245{
246 return mResults;
247}
@ LayoutCheck
Print layout validity check, triggered on exporting a print layout.
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition: qgsfeedback.h:44
QString name() const
Returns the friendly display name for the item.
bool enabled() const
Returns whether the item will be drawn.
An individual overview which is drawn above the map content in a QgsLayoutItemMap,...
QgsLayoutItemMap * linkedMap()
Returns the source map to show the overview extent of.
Layout graphical items for displaying a map.
A layout item subclass that displays SVG files or raster format images (jpg, png, ....
A layout item subclass for scale bars.
Layout north arrow validity check.
int checkType() const override
Returns the type 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.
QString id() const override
Returns the unique ID of the check.
QgsLayoutNorthArrowValidityCheck * create() const override
constructor
QList< QgsValidityCheckResult > runCheck(const QgsValidityCheckContext *context, QgsFeedback *feedback) override
Runs the check and returns a list of results.
Layout overview validity check.
QList< QgsValidityCheckResult > runCheck(const QgsValidityCheckContext *context, QgsFeedback *feedback) override
Runs the check and returns a list of results.
int checkType() const override
Returns the type of the check.
QString id() const override
Returns the unique ID of the check.
QgsLayoutOverviewValidityCheck * 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.
Layout picture source validity check.
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.
QList< QgsValidityCheckResult > runCheck(const QgsValidityCheckContext *context, QgsFeedback *feedback) override
Runs the check and returns a list of results.
QgsLayoutPictureSourceValidityCheck * create() const override
constructor
int checkType() const override
Returns the type of the check.
Layout scalebar validity 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.
QList< QgsValidityCheckResult > runCheck(const QgsValidityCheckContext *context, QgsFeedback *feedback) override
Runs the check and returns a list of results.
int checkType() const override
Returns the type of the check.
QgsLayoutScaleBarValidityCheck * create() const override
constructor
Validity check context for print layout validation.
QgsLayout * layout
Pointer to the layout which the check is being run against.
void layoutItems(QList< T * > &itemList) const
Returns a list of layout items of a specific type.
Definition: qgslayout.h:120
This class is a composition of two QSettings instances:
Definition: qgssettings.h:64
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
Base class for validity check contexts.
virtual int type() const =0
Returns the context type.
@ TypeLayoutContext
Layout context, see QgsLayoutValidityCheckContext.
Represents an individual result from a validity check run by a QgsAbstractValidityCheck subclass.
@ Warning
Warning only, allow operation to proceed but notify user of result.
QString detailedDescription
Detailed description of the result (translated), giving users enough detail for them to resolve the e...
QString title
A short, translated string summarising the result.