QGIS API Documentation 3.99.0-Master (2fe06baccd8)
Loading...
Searching...
No Matches
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
18
19#include "qgslayoutitemmap.h"
23
24#ifndef WITH_QTWEBKIT
25#include "qgslayoutmultiframe.h"
26#endif
27#include "qgslayout.h"
28#include "qgssettings.h"
29#include <QUrl>
30
31//
32// QgsLayoutScaleBarValidityCheck
33//
34
39
41{
42 return QStringLiteral( "layout_scalebar_check" );
43}
44
49
51{
53 return false;
54
55 const QgsLayoutValidityCheckContext *layoutContext = static_cast<const QgsLayoutValidityCheckContext *>( context );
56 if ( !layoutContext )
57 return false;
58
59 QList<QgsLayoutItemScaleBar *> barItems;
60 layoutContext->layout->layoutItems( barItems );
61 for ( QgsLayoutItemScaleBar *bar : std::as_const( barItems ) )
62 {
63 if ( !bar->linkedMap() )
64 {
67 res.title = QObject::tr( "Scalebar is not linked to a map" );
68 const QString name = bar->displayName().toHtmlEscaped();
69 res.detailedDescription = QObject::tr( "The scalebar “%1” is not linked to a map item. This scale will be misleading." ).arg( name );
70 mResults.append( res );
71 }
72 }
73
74 return true;
75}
76
78{
79 return mResults;
80}
81
82
83//
84// QgsLayoutNorthArrowValidityCheck
85//
86
91
93{
94 return QStringLiteral( "layout_northarrow_check" );
95}
96
101
103{
105 return false;
106
107 const QgsLayoutValidityCheckContext *layoutContext = static_cast<const QgsLayoutValidityCheckContext *>( context );
108 if ( !layoutContext )
109 return false;
110
111 QgsSettings settings;
112 const QString defaultPath = settings.value( QStringLiteral( "LayoutDesigner/defaultNorthArrow" ), QStringLiteral( ":/images/north_arrows/layout_default_north_arrow.svg" ), QgsSettings::Gui ).toString();
113
114 QList<QgsLayoutItemPicture *> pictureItems;
115 layoutContext->layout->layoutItems( pictureItems );
116 for ( QgsLayoutItemPicture *picture : std::as_const( pictureItems ) )
117 {
118 // look for pictures which use the default north arrow svg, but aren't actually linked to maps.
119 // alternatively identify them by looking for the default "North Arrow" string in their id
120 if ( !picture->linkedMap() && ( picture->picturePath() == defaultPath || picture->id().contains( QObject::tr( "North Arrow" ), Qt::CaseInsensitive ) ) )
121 {
124 res.title = QObject::tr( "North arrow is not linked to a map" );
125 const QString name = picture->displayName().toHtmlEscaped();
126 res.detailedDescription = QObject::tr( "The north arrow “%1” is not linked to a map item. The arrow orientation may be misleading." ).arg( name );
127 mResults.append( res );
128 }
129 }
130
131 return true;
132}
133
135{
136 return mResults;
137}
138
139
140//
141// QgsLayoutOverviewValidityCheck
142//
143
148
150{
151 return QStringLiteral( "layout_overview_check" );
152}
153
158
160{
162 return false;
163
164 const QgsLayoutValidityCheckContext *layoutContext = static_cast<const QgsLayoutValidityCheckContext *>( context );
165 if ( !layoutContext )
166 return false;
167
168 QList<QgsLayoutItemMap *> mapItems;
169 layoutContext->layout->layoutItems( mapItems );
170 for ( QgsLayoutItemMap *map : std::as_const( mapItems ) )
171 {
172 for ( int i = 0; i < map->overviews()->size(); ++i )
173 {
174 QgsLayoutItemMapOverview *overview = map->overviews()->overview( i );
175 if ( overview && overview->enabled() && !overview->linkedMap() )
176 {
179 res.title = QObject::tr( "Overview is not linked to a map" );
180 const QString name = map->displayName().toHtmlEscaped();
181 res.detailedDescription = QObject::tr( "The map “%1” includes an overview (“%2”) which is not linked to a map item." ).arg( name, overview->name() );
182 mResults.append( res );
183 }
184 }
185 }
186
187 return true;
188}
189
191{
192 return mResults;
193}
194
195
196//
197// QgsLayoutPictureSourceValidityCheck
198//
199
204
206{
207 return QStringLiteral( "layout_picture_source_check" );
208}
209
214
216{
218 return false;
219
220 const QgsLayoutValidityCheckContext *layoutContext = static_cast<const QgsLayoutValidityCheckContext *>( context );
221 if ( !layoutContext )
222 return false;
223
224 QList<QgsLayoutItemPicture *> pictureItems;
225 layoutContext->layout->layoutItems( pictureItems );
226 for ( QgsLayoutItemPicture *picture : std::as_const( pictureItems ) )
227 {
228 if ( picture->isMissingImage() )
229 {
232 res.title = QObject::tr( "Picture source is missing or corrupt" );
233 const QString name = picture->displayName().toHtmlEscaped();
234
235 const QUrl picUrl = QUrl::fromUserInput( picture->evaluatedPath() );
236 const bool isLocalFile = picUrl.isLocalFile();
237
238 res.detailedDescription = QObject::tr( "The source for picture “%1” could not be loaded or is corrupt:<p>%2" ).arg( name, isLocalFile ? QDir::toNativeSeparators( picture->evaluatedPath() ) : picture->evaluatedPath() );
239 mResults.append( res );
240 }
241 }
242
243 return true;
244}
245
247{
248 return mResults;
249}
250
251#ifndef WITH_QTWEBKIT
252//
253// QgsLayoutHtmlItemValidityCheck
254//
255
260
262{
263 return QStringLiteral( "layout_html_item_check" );
264}
265
270
272{
274 return false;
275
276 const QgsLayoutValidityCheckContext *layoutContext = static_cast<const QgsLayoutValidityCheckContext *>( context );
277 if ( !layoutContext )
278 return false;
279
280 const QList<QgsLayoutMultiFrame *> multiFrames = layoutContext->layout->multiFrames();
281 for ( QgsLayoutMultiFrame *multiFrame : std::as_const( multiFrames ) )
282 {
283 if ( multiFrame->type() == QgsLayoutItemRegistry::LayoutHtml && multiFrame->frameCount() > 0 )
284 {
287 res.title = QObject::tr( "HTML item cannot be rendered" );
288 res.detailedDescription = QObject::tr( "HTML items cannot be rendered because this QGIS install was built without WebKit support. These items will be missing from the export." );
289 mResults.append( res );
290 break;
291 }
292 }
293
294 return true;
295}
296
298{
299 return mResults;
300}
301#endif
@ 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
Layout HTML item validity check.
QList< QgsValidityCheckResult > runCheck(const QgsValidityCheckContext *context, QgsFeedback *feedback) override
Runs the check and returns a list of results.
QString id() const override
Returns the unique ID of the check.
QgsLayoutHtmlItemValidityCheck * 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.
int checkType() const override
Returns the type of the check.
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, ....
@ LayoutHtml
Html multiframe item.
A layout item subclass for scale bars.
Abstract base class for layout items with the ability to distribute the content to several frames (Qg...
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:121
QList< QgsLayoutMultiFrame * > multiFrames() const
Returns a list of multi frames contained in the layout.
Stores settings for use within QGIS.
Definition qgssettings.h:65
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.
QgsValidityCheckResult::Type type
Result type.
@ 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.