QGIS API Documentation 3.41.0-Master (02257426e5a)
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#include "moc_qgslayoutpdfexportoptionsdialog.cpp"
19#include "qgis.h"
20#include "qgssettings.h"
21#include "qgsgui.h"
22#include "qgshelp.h"
24#include "qgsproject.h"
27#include "qgslayertree.h"
28
29#include <QCheckBox>
30#include <QPushButton>
31#include <QMenu>
32
33QgsLayoutPdfExportOptionsDialog::QgsLayoutPdfExportOptionsDialog( QWidget *parent, bool allowGeospatialPdfExport, const QString &geospatialPdfReason, const QStringList &geospatialPdfLayerOrder, Qt::WindowFlags flags )
34 : QDialog( parent, flags )
35{
36 setupUi( this );
37
38 mGeospatialPdfStructureTreeMenu = new QMenu( this );
39
40 mTextRenderFormatComboBox->addItem( tr( "Always Export Text as Paths (Recommended)" ), static_cast<int>( Qgis::TextRenderFormat::AlwaysOutlines ) );
41 mTextRenderFormatComboBox->addItem( tr( "Always Export Text as Text Objects" ), static_cast<int>( Qgis::TextRenderFormat::AlwaysText ) );
42 mTextRenderFormatComboBox->addItem( tr( "Prefer Exporting Text as Text Objects" ), static_cast<int>( Qgis::TextRenderFormat::PreferText ) );
43
44 mGeospatialPdfAvailable = allowGeospatialPdfExport && QgsAbstractGeospatialPdfExporter::geospatialPDFCreationAvailable();
45 mGeospatialPDFGroupBox->setEnabled( mGeospatialPdfAvailable );
46 mGeospatialPDFGroupBox->setChecked( false );
47 if ( !mGeospatialPdfAvailable )
48 {
49 mGeospatialPDFOptionsStackedWidget->setCurrentIndex( 0 );
50 mGeospatialPdfUnavailableReason->setText( geospatialPdfReason.isEmpty() ? QgsAbstractGeospatialPdfExporter::geospatialPDFAvailabilityExplanation() : geospatialPdfReason );
51 // avoid showing reason in disabled text color - we want it to stand out
52 QPalette p = mGeospatialPdfUnavailableReason->palette();
53 p.setColor( QPalette::Disabled, QPalette::WindowText, QPalette::WindowText );
54 mGeospatialPdfUnavailableReason->setPalette( p );
55 mGeospatialPDFOptionsStackedWidget->removeWidget( mGeospatialPDFOptionsStackedWidget->widget( 1 ) );
56 }
57 else
58 {
59 mGeospatialPDFOptionsStackedWidget->setCurrentIndex( 1 );
60 }
61
62 mComboImageCompression->addItem( tr( "Lossy (JPEG)" ), false );
63 mComboImageCompression->addItem( tr( "Lossless" ), true );
64
65 const QStringList themes = QgsProject::instance()->mapThemeCollection()->mapThemes();
66 for ( const QString &theme : themes )
67 {
68 QListWidgetItem *item = new QListWidgetItem( theme );
69 item->setFlags( item->flags() | Qt::ItemIsUserCheckable );
70 item->setCheckState( Qt::Unchecked );
71 mThemesList->addItem( item );
72 }
73
74 QList<QgsMapLayer *> order = QgsProject::instance()->layerTreeRoot()->layerOrder();
75 for ( auto it = geospatialPdfLayerOrder.rbegin(); it != geospatialPdfLayerOrder.rend(); ++it )
76 {
77 for ( int i = 0; i < order.size(); ++i )
78 {
79 if ( order.at( i )->id() == *it )
80 {
81 order.move( i, 0 );
82 break;
83 }
84 }
85 }
86 mGeospatialPdfStructureModel = new QgsGeospatialPdfLayerTreeModel( order, this );
87 mGeospatialPdfStructureProxyModel = new QgsGeospatialPdfLayerFilteredTreeModel( mGeospatialPdfStructureModel, this );
88 mGeospatialPdfStructureTree->setModel( mGeospatialPdfStructureProxyModel );
89 mGeospatialPdfStructureTree->resizeColumnToContents( 0 );
90 mGeospatialPdfStructureTree->header()->show();
91 mGeospatialPdfStructureTree->setSelectionMode( QAbstractItemView::SingleSelection );
92 mGeospatialPdfStructureTree->setSelectionBehavior( QAbstractItemView::SelectRows );
93
94 mGeospatialPdfStructureTree->setDragEnabled( true );
95 mGeospatialPdfStructureTree->setAcceptDrops( true );
96 mGeospatialPdfStructureTree->setDragDropMode( QAbstractItemView::InternalMove );
97 mGeospatialPdfStructureTree->setDefaultDropAction( Qt::MoveAction );
98
99 mGeospatialPdfStructureTree->setContextMenuPolicy( Qt::CustomContextMenu );
100 connect( mGeospatialPdfStructureTree, &QTreeView::customContextMenuRequested, this, [=]( const QPoint &point ) {
101 const QModelIndex index = mGeospatialPdfStructureTree->indexAt( point );
102 if ( index.isValid() )
103 showContextMenuForGeospatialPdfStructure( point, mGeospatialPdfStructureProxyModel->mapToSource( index ) );
104 } );
105
106 connect( mHelpButtonBox, &QDialogButtonBox::helpRequested, this, &QgsLayoutPdfExportOptionsDialog::showHelp );
108}
109
111{
112 mTextRenderFormatComboBox->setCurrentIndex( mTextRenderFormatComboBox->findData( static_cast<int>( format ) ) );
113}
114
116{
117 return static_cast<Qgis::TextRenderFormat>( mTextRenderFormatComboBox->currentData().toInt() );
118}
119
121{
122 mForceVectorCheckBox->setChecked( force );
123}
124
126{
127 return mForceVectorCheckBox->isChecked();
128}
129
131{
132 mAppendGeoreferenceCheckbox->setEnabled( enabled );
133}
134
136{
137 mAppendGeoreferenceCheckbox->setChecked( enabled );
138}
139
141{
142 return mAppendGeoreferenceCheckbox->isChecked();
143}
144
146{
147 mIncludeMetadataCheckbox->setChecked( enabled );
148}
149
151{
152 return mIncludeMetadataCheckbox->isChecked();
153}
154
156{
157 mDisableRasterTilingCheckBox->setChecked( disabled );
158}
159
161{
162 return mDisableRasterTilingCheckBox->isChecked();
163}
164
166{
167 mSimplifyGeometriesCheckbox->setChecked( enabled );
168}
169
171{
172 return mSimplifyGeometriesCheckbox->isChecked();
173}
174
176{
177 mComboImageCompression->setCurrentIndex( mComboImageCompression->findData( enabled ) );
178}
179
181{
182 return mComboImageCompression->currentData().toBool();
183}
184
186{
187 if ( !mGeospatialPdfAvailable )
188 return;
189
190 mGeospatialPDFGroupBox->setChecked( enabled );
191}
192
194{
195 if ( !mGeospatialPdfAvailable )
196 return false;
197
198 return mGeospatialPDFGroupBox->isChecked();
199}
200
202{
203 if ( !mGeospatialPdfAvailable )
204 return;
205
206 mIncludeMapThemesCheck->setChecked( !themes.isEmpty() );
207 for ( int i = 0; i < mThemesList->count(); ++i )
208 {
209 QListWidgetItem *item = mThemesList->item( i );
210 item->setCheckState( themes.contains( item->text() ) ? Qt::Checked : Qt::Unchecked );
211 }
212}
213
215{
216 QStringList res;
217 if ( !mGeospatialPdfAvailable )
218 return res;
219
220 if ( !mIncludeMapThemesCheck || !mIncludeMapThemesCheck->isChecked() )
221 return res;
222
223 res.reserve( mThemesList->count() );
224 for ( int i = 0; i < mThemesList->count(); ++i )
225 {
226 QListWidgetItem *item = mThemesList->item( i );
227 if ( item->checkState() == Qt::Checked )
228 res << item->text();
229 }
230 return res;
231}
232
234{
235 QStringList order;
236 for ( int row = 0; row < mGeospatialPdfStructureProxyModel->rowCount(); ++row )
237 {
238 order << mGeospatialPdfStructureProxyModel->data( mGeospatialPdfStructureProxyModel->index( row, 0 ), static_cast<int>( QgsMapLayerModel::CustomRole::LayerId ) ).toString();
239 }
240 return order;
241}
242
244{
245 // we don't explicitly expose a "group order" widget in the dialog -- rather
246 // we use the ordering of the layers, and build the group ordering based
247 // on grouped layers which appear first
248 QStringList groupOrder;
249 for ( int row = 0; row < mGeospatialPdfStructureProxyModel->rowCount(); ++row )
250 {
251 const QString group = mGeospatialPdfStructureProxyModel->data( mGeospatialPdfStructureProxyModel->index( row, QgsGeospatialPdfLayerTreeModel::GroupColumn ), Qt::DisplayRole ).toString().trimmed();
252 if ( !group.isEmpty() && !groupOrder.contains( group ) )
253 groupOrder << group;
254 }
255 return groupOrder;
256}
257
259{
260 mOpenAfterExportingCheckBox->setChecked( enabled );
261}
262
264{
265 return mOpenAfterExportingCheckBox->isChecked();
266}
267
268void QgsLayoutPdfExportOptionsDialog::showHelp()
269{
270 QgsHelp::openHelp( QStringLiteral( "print_composer/create_output.html" ) );
271}
272
273void QgsLayoutPdfExportOptionsDialog::showContextMenuForGeospatialPdfStructure( QPoint point, const QModelIndex &index )
274{
275 mGeospatialPdfStructureTreeMenu->clear();
276
277 switch ( index.column() )
278 {
281 {
282 QAction *selectAll = new QAction( tr( "Select All" ), mGeospatialPdfStructureTreeMenu );
283 mGeospatialPdfStructureTreeMenu->addAction( selectAll );
284 connect( selectAll, &QAction::triggered, this, [=] {
285 mGeospatialPdfStructureModel->checkAll( true, QModelIndex(), index.column() );
286 } );
287 QAction *deselectAll = new QAction( tr( "Deselect All" ), mGeospatialPdfStructureTreeMenu );
288 mGeospatialPdfStructureTreeMenu->addAction( deselectAll );
289 connect( deselectAll, &QAction::triggered, this, [=] {
290 mGeospatialPdfStructureModel->checkAll( false, QModelIndex(), index.column() );
291 } );
292 break;
293 }
294
295 default:
296 break;
297 }
298
299 if ( !mGeospatialPdfStructureTreeMenu->actions().empty() )
300 {
301 mGeospatialPdfStructureTreeMenu->exec( mGeospatialPdfStructureTree->mapToGlobal( point ) );
302 }
303}
TextRenderFormat
Options for rendering text.
Definition qgis.h:2687
@ PreferText
Render text as text objects, unless doing so results in rendering artifacts or poor quality rendering...
@ AlwaysOutlines
Always render text using path objects (AKA outlines/curves). This setting guarantees the best quality...
@ AlwaysText
Always render text as text objects. While this mode preserves text objects as text for post-processin...
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.
void checkAll(bool checked, const QModelIndex &parent=QModelIndex(), int column=IncludeVectorAttributes)
Checks (or unchecks) all rows and children from the specified parent index.
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:210
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
Definition qgshelp.cpp:39
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:115
QgsLayerTree * layerTreeRoot() const
Returns pointer to the root (invisible) node of the project's layer tree.