QGIS API Documentation 4.1.0-Master (5bf3c20f3c9)
Loading...
Searching...
No Matches
qgslayoutpdfexportoptionsdialog.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgslayoutpdfexportoptionsdialog.cpp
3 -------------------------------------
4 begin : August 2019
5 copyright : (C) 2019 by 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 "qgis.h"
22#include "qgsgui.h"
23#include "qgshelp.h"
24#include "qgslayertree.h"
26#include "qgsproject.h"
27#include "qgssettings.h"
28
29#include <QCheckBox>
30#include <QMenu>
31#include <QPushButton>
32#include <QString>
33
34#include "moc_qgslayoutpdfexportoptionsdialog.cpp"
35
36using namespace Qt::StringLiterals;
37
39 QWidget *parent, bool allowGeospatialPdfExport, const QString &geospatialPdfReason, const QStringList &geospatialPdfLayerOrder, Qt::WindowFlags flags
40)
41 : QDialog( parent, flags )
42{
43 setupUi( this );
44
45 mGeospatialPdfStructureTreeMenu = new QMenu( this );
46
47 mTextRenderFormatComboBox->addItem( tr( "Always Export Text as Paths (Recommended)" ), static_cast<int>( Qgis::TextRenderFormat::AlwaysOutlines ) );
48 mTextRenderFormatComboBox->addItem( tr( "Always Export Text as Text Objects" ), static_cast<int>( Qgis::TextRenderFormat::AlwaysText ) );
49 mTextRenderFormatComboBox->addItem( tr( "Prefer Exporting Text as Text Objects" ), static_cast<int>( Qgis::TextRenderFormat::PreferText ) );
50
51 mGeospatialPdfAvailable = allowGeospatialPdfExport && QgsAbstractGeospatialPdfExporter::geospatialPDFCreationAvailable();
52 mGeospatialPDFGroupBox->setEnabled( mGeospatialPdfAvailable );
53 mGeospatialPDFGroupBox->setChecked( false );
54 if ( !mGeospatialPdfAvailable )
55 {
56 mGeospatialPDFOptionsStackedWidget->setCurrentIndex( 0 );
57 mGeospatialPdfUnavailableReason->setText( geospatialPdfReason.isEmpty() ? QgsAbstractGeospatialPdfExporter::geospatialPDFAvailabilityExplanation() : geospatialPdfReason );
58 // avoid showing reason in disabled text color - we want it to stand out
59 QPalette p = mGeospatialPdfUnavailableReason->palette();
60 p.setColor( QPalette::Disabled, QPalette::WindowText, QPalette::WindowText );
61 mGeospatialPdfUnavailableReason->setPalette( p );
62 mGeospatialPDFOptionsStackedWidget->removeWidget( mGeospatialPDFOptionsStackedWidget->widget( 1 ) );
63 }
64 else
65 {
66 mGeospatialPDFOptionsStackedWidget->setCurrentIndex( 1 );
67 }
68
69 mComboImageCompression->addItem( tr( "Lossy (JPEG)" ), false );
70 mComboImageCompression->addItem( tr( "Lossless" ), true );
71
72 const QStringList themes = QgsProject::instance()->mapThemeCollection()->mapThemes();
73 for ( const QString &theme : themes )
74 {
75 QListWidgetItem *item = new QListWidgetItem( theme );
76 item->setFlags( item->flags() | Qt::ItemIsUserCheckable );
77 item->setCheckState( Qt::Unchecked );
78 mThemesList->addItem( item );
79 }
80
81 QList<QgsMapLayer *> order = QgsProject::instance()->layerTreeRoot()->layerOrder();
82 for ( auto it = geospatialPdfLayerOrder.rbegin(); it != geospatialPdfLayerOrder.rend(); ++it )
83 {
84 for ( int i = 0; i < order.size(); ++i )
85 {
86 if ( order.at( i )->id() == *it )
87 {
88 order.move( i, 0 );
89 break;
90 }
91 }
92 }
93 mGeospatialPdfStructureModel = new QgsGeospatialPdfLayerTreeModel( order, this );
94 mGeospatialPdfStructureProxyModel = new QgsGeospatialPdfLayerFilteredTreeModel( mGeospatialPdfStructureModel, this );
95 mGeospatialPdfStructureTree->setModel( mGeospatialPdfStructureProxyModel );
96 mGeospatialPdfStructureTree->resizeColumnToContents( 0 );
97 mGeospatialPdfStructureTree->header()->show();
98 mGeospatialPdfStructureTree->setSelectionMode( QAbstractItemView::SingleSelection );
99 mGeospatialPdfStructureTree->setSelectionBehavior( QAbstractItemView::SelectRows );
100
101 mGeospatialPdfStructureTree->setDragEnabled( true );
102 mGeospatialPdfStructureTree->setAcceptDrops( true );
103 mGeospatialPdfStructureTree->setDragDropMode( QAbstractItemView::InternalMove );
104 mGeospatialPdfStructureTree->setDefaultDropAction( Qt::MoveAction );
105
106 mGeospatialPdfStructureTree->setContextMenuPolicy( Qt::CustomContextMenu );
107 connect( mGeospatialPdfStructureTree, &QTreeView::customContextMenuRequested, this, [this]( const QPoint &point ) {
108 const QModelIndex index = mGeospatialPdfStructureTree->indexAt( point );
109 if ( index.isValid() )
110 showContextMenuForGeospatialPdfStructure( point, mGeospatialPdfStructureProxyModel->mapToSource( index ) );
111 } );
112
113 connect( mHelpButtonBox, &QDialogButtonBox::helpRequested, this, &QgsLayoutPdfExportOptionsDialog::showHelp );
115}
116
118{
119 mTextRenderFormatComboBox->setCurrentIndex( mTextRenderFormatComboBox->findData( static_cast<int>( format ) ) );
120}
121
123{
124 return static_cast<Qgis::TextRenderFormat>( mTextRenderFormatComboBox->currentData().toInt() );
125}
126
128{
129 mForceVectorCheckBox->setChecked( force );
130}
131
133{
134 return mForceVectorCheckBox->isChecked();
135}
136
138{
139 mAppendGeoreferenceCheckbox->setEnabled( enabled );
140}
141
143{
144 mAppendGeoreferenceCheckbox->setChecked( enabled );
145}
146
148{
149 return mAppendGeoreferenceCheckbox->isChecked();
150}
151
153{
154 mIncludeMetadataCheckbox->setChecked( enabled );
155}
156
158{
159 return mIncludeMetadataCheckbox->isChecked();
160}
161
163{
164 mDisableRasterTilingCheckBox->setChecked( disabled );
165}
166
168{
169 return mDisableRasterTilingCheckBox->isChecked();
170}
171
173{
174 mSimplifyGeometriesCheckbox->setChecked( enabled );
175}
176
178{
179 return mSimplifyGeometriesCheckbox->isChecked();
180}
181
183{
184 mComboImageCompression->setCurrentIndex( mComboImageCompression->findData( enabled ) );
185}
186
188{
189 return mComboImageCompression->currentData().toBool();
190}
191
193{
194 if ( !mGeospatialPdfAvailable )
195 return;
196
197 mGeospatialPDFGroupBox->setChecked( enabled );
198}
199
201{
202 if ( !mGeospatialPdfAvailable )
203 return false;
204
205 return mGeospatialPDFGroupBox->isChecked();
206}
207
209{
210 if ( !mGeospatialPdfAvailable )
211 return;
212
213 mIncludeMapThemesCheck->setChecked( !themes.isEmpty() );
214 for ( int i = 0; i < mThemesList->count(); ++i )
215 {
216 QListWidgetItem *item = mThemesList->item( i );
217 item->setCheckState( themes.contains( item->text() ) ? Qt::Checked : Qt::Unchecked );
218 }
219}
220
222{
223 QStringList res;
224 if ( !mGeospatialPdfAvailable )
225 return res;
226
227 if ( !mIncludeMapThemesCheck || !mIncludeMapThemesCheck->isChecked() )
228 return res;
229
230 res.reserve( mThemesList->count() );
231 for ( int i = 0; i < mThemesList->count(); ++i )
232 {
233 QListWidgetItem *item = mThemesList->item( i );
234 if ( item->checkState() == Qt::Checked )
235 res << item->text();
236 }
237 return res;
238}
239
241{
242 QStringList order;
243 for ( int row = 0; row < mGeospatialPdfStructureProxyModel->rowCount(); ++row )
244 {
245 order << mGeospatialPdfStructureProxyModel->data( mGeospatialPdfStructureProxyModel->index( row, 0 ), static_cast<int>( QgsMapLayerModel::CustomRole::LayerId ) ).toString();
246 }
247 return order;
248}
249
251{
252 // we don't explicitly expose a "group order" widget in the dialog -- rather
253 // we use the ordering of the layers, and build the group ordering based
254 // on grouped layers which appear first
255 QStringList groupOrder;
256 for ( int row = 0; row < mGeospatialPdfStructureProxyModel->rowCount(); ++row )
257 {
258 const QString group = mGeospatialPdfStructureProxyModel->data( mGeospatialPdfStructureProxyModel->index( row, QgsGeospatialPdfLayerTreeModel::GroupColumn ), Qt::DisplayRole ).toString().trimmed();
259 if ( !group.isEmpty() && !groupOrder.contains( group ) )
260 groupOrder << group;
261 }
262 return groupOrder;
263}
264
266{
267 mOpenAfterExportingCheckBox->setChecked( enabled );
268}
269
271{
272 return mOpenAfterExportingCheckBox->isChecked();
273}
274
275void QgsLayoutPdfExportOptionsDialog::showHelp()
276{
277 QgsHelp::openHelp( u"print_composer/create_output.html"_s );
278}
279
280void QgsLayoutPdfExportOptionsDialog::showContextMenuForGeospatialPdfStructure( QPoint point, const QModelIndex &index )
281{
282 mGeospatialPdfStructureTreeMenu->clear();
283
284 switch ( index.column() )
285 {
288 {
289 QAction *selectAll = new QAction( tr( "Select All" ), mGeospatialPdfStructureTreeMenu );
290 mGeospatialPdfStructureTreeMenu->addAction( selectAll );
291 connect( selectAll, &QAction::triggered, this, [this, index] { mGeospatialPdfStructureModel->checkAll( true, QModelIndex(), index.column() ); } );
292 QAction *deselectAll = new QAction( tr( "Deselect All" ), mGeospatialPdfStructureTreeMenu );
293 mGeospatialPdfStructureTreeMenu->addAction( deselectAll );
294 connect( deselectAll, &QAction::triggered, this, [this, index] { mGeospatialPdfStructureModel->checkAll( false, QModelIndex(), index.column() ); } );
295 break;
296 }
297
298 default:
299 break;
300 }
301
302 if ( !mGeospatialPdfStructureTreeMenu->actions().empty() )
303 {
304 mGeospatialPdfStructureTreeMenu->exec( mGeospatialPdfStructureTree->mapToGlobal( point ) );
305 }
306}
TextRenderFormat
Options for rendering text.
Definition qgis.h:2923
@ PreferText
Render text as text objects, unless doing so results in rendering artifacts or poor quality rendering...
Definition qgis.h:2930
@ AlwaysOutlines
Always render text using path objects (AKA outlines/curves). This setting guarantees the best quality...
Definition qgis.h:2924
@ AlwaysText
Always render text as text objects. While this mode preserves text objects as text for post-processin...
Definition qgis.h:2927
static QString geospatialPDFAvailabilityExplanation()
Returns a user-friendly, translated string explaining why Geospatial PDF export support is not availa...
static bool geospatialPDFCreationAvailable()
Returns true if the current QGIS build is capable of Geospatial PDF support.
Layer tree model for Geo-PDF layers.
@ InitiallyVisible
Initial visibility state.
static void enableAutoGeometryRestore(QWidget *widget, const QString &key=QString())
Register the widget to allow its position to be automatically saved and restored when open and closed...
Definition qgsgui.cpp:224
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
Definition qgshelp.cpp:41
QList< QgsMapLayer * > layerOrder() const
The order in which layers will be rendered on the canvas.
void setExportGeospatialPdf(bool enabled)
Sets whether to export a Geospatial PDF.
void setOpenAfterExporting(bool enabled)
Sets whether to open the pdf after exporting it.
QStringList exportThemes() const
Returns the list of export themes.
bool geometriesSimplified() const
Returns whether geometry simplification is enabled.
bool losslessImageExport() const
Returns whether lossless image compression is enabled.
void setLosslessImageExport(bool enabled)
Sets whether to use lossless image compression.
bool exportGeospatialPdf() const
Returns whether Geospatial PDF export is enabled.
bool openAfterExporting() const
Returns whether the pdf should be opened after exporting it.
bool georeferencingEnabled() const
Returns whether georeferencing is enabled.
void setRasterTilingDisabled(bool disabled)
Sets whether to disable raster tiling.
bool forceVector() const
Returns whether vector output is being forced.
void setGeometriesSimplified(bool enabled)
Sets whether to simplify geometries.
bool metadataEnabled() const
Returns whether metadata is enabled.
void setGeoreferencingEnabled(bool enabled)
Sets whether to enable georeferencing.
void setMetadataEnabled(bool enabled)
Sets whether to enable metadata.
void enableGeoreferencingOptions(bool enabled)
Sets whether to enable georeferencing options.
QStringList geospatialPdfGroupOrder() const
Returns a list of groups in the desired order they should appear in a generated Geospatial PDF file.
QgsLayoutPdfExportOptionsDialog(QWidget *parent=nullptr, bool allowGeospatialPdfExport=true, const QString &geospatialPdfReason=QString(), const QStringList &geospatialPdfLayerOrder=QStringList(), Qt::WindowFlags flags=Qt::WindowFlags())
Constructor for QgsLayoutPdfExportOptionsDialog.
QStringList geospatialPdfLayerOrder() const
Returns a list of map layer IDs in the desired order they should appear in a generated Geospatial PDF...
void setTextRenderFormat(Qgis::TextRenderFormat format)
Sets the text render format.
Qgis::TextRenderFormat textRenderFormat() const
Returns the current text render format.
bool rasterTilingDisabled() const
Returns whether raster tiling is disabled.
void setForceVector(bool force)
Set whether to force vector output.
void setExportThemes(const QStringList &themes)
Sets the list of export themes.
@ LayerId
Stores the map layer ID.
static QgsProject * instance()
Returns the QgsProject singleton instance.
QgsMapThemeCollection * mapThemeCollection
Definition qgsproject.h:122
QgsLayerTree * layerTreeRoot() const
Returns pointer to the root (invisible) node of the project's layer tree.