QGIS API Documentation 4.1.0-Master (5bf3c20f3c9)
Loading...
Searching...
No Matches
qgsprojecttrustdialog.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsprojecttrustdialog.cpp
3 -------------------
4 begin : October 2025
5 copyright : (C) 2025 by Mathieu Pellerin
6 email : mathieu at opengis dot ch
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
19
20#include "qgsapplication.h"
21#include "qgsgui.h"
22#include "qgshelp.h"
23#include "qgsprojectstorage.h"
25#include "qgssettings.h"
28
29#include <QFileInfo>
30#include <QPushButton>
31#include <QString>
32#include <QSvgRenderer>
33
34#include "moc_qgsprojecttrustdialog.cpp"
35
36using namespace Qt::StringLiterals;
37
38QgsProjectTrustDialog::QgsProjectTrustDialog( QgsProject *project, QWidget *parent, Qt::WindowFlags fl )
39 : QDialog( parent, fl )
40{
41 setupUi( this );
43
44 mButtonBox->button( QDialogButtonBox::StandardButton::YesToAll )->setText( tr( "Always Trust" ) );
45 mButtonBox->button( QDialogButtonBox::StandardButton::Yes )->setText( tr( "Trust" ) );
46 mButtonBox->button( QDialogButtonBox::StandardButton::No )->setText( tr( "Deny" ) );
47 mButtonBox->button( QDialogButtonBox::StandardButton::NoToAll )->setText( tr( "Always Deny" ) );
48
49 connect( mButtonBox, &QDialogButtonBox::clicked, this, &QgsProjectTrustDialog::buttonBoxClicked );
50
51 connect( mScriptPreviewList, &QListWidget::itemDoubleClicked, this, [this]( QListWidgetItem *item ) {
52 const int row = mScriptPreviewList->row( item );
53 if ( row >= 0 && row < mEmbeddedScriptsVisitor.embeddedScripts().size() )
54 {
55 mScriptPreviewEditor->setText( mEmbeddedScriptsVisitor.embeddedScripts()[row].script() );
56 mScriptPreviewStackedWidget->setCurrentIndex( 1 );
57 }
58 } );
59
60 connect( mScriptPreviewBackButton, &QAbstractButton::clicked, this, [this] { mScriptPreviewStackedWidget->setCurrentIndex( 0 ); } );
61
62 mScriptPreviewEditor->setReadOnly( true );
63 mScriptPreviewEditor->setLineNumbersVisible( false );
64
65 QSvgRenderer svg( u":/images/themes/default/mIconPythonFile.svg"_s );
66 if ( svg.isValid() )
67 {
68 const double maxLength = 64.0;
69 QSizeF size( maxLength, maxLength );
70 const QRectF viewBox = svg.viewBoxF();
71 if ( viewBox.height() > viewBox.width() )
72 {
73 size.setWidth( maxLength * viewBox.width() / viewBox.height() );
74 }
75 else
76 {
77 size.setHeight( maxLength * viewBox.height() / viewBox.width() );
78 }
79
80 QPixmap pixmap( static_cast<int>( maxLength ), static_cast<int>( maxLength ) );
81 pixmap.fill( Qt::transparent );
82
83 QPainter painter;
84 painter.begin( &pixmap );
85 painter.setRenderHint( QPainter::SmoothPixmapTransform );
86 painter.translate( ( maxLength - size.width() ) / 2, ( maxLength - size.height() ) / 2 );
87 svg.render( &painter, QRectF( 0, 0, size.width(), size.height() ) );
88 painter.end();
89
90 mIconLabel->setPixmap( pixmap );
91 }
92
93 if ( project )
94 {
96 if ( storage )
97 {
98 if ( !storage->filePath( project->fileName() ).isEmpty() )
99 {
100 QFileInfo projectFileInfo( storage->filePath( project->fileName() ) );
101 mProjectAbsoluteFilePath = projectFileInfo.absoluteFilePath();
102 mProjectAbsolutePath = projectFileInfo.absolutePath();
103 mProjectIsFile = true;
104 }
105 else
106 {
107 mProjectAbsolutePath = project->fileName();
108 mProjectIsFile = false;
109 }
110 }
111 else
112 {
113 QFileInfo projectFileInfo( project->fileName() );
114 mProjectAbsoluteFilePath = projectFileInfo.absoluteFilePath();
115 mProjectAbsolutePath = projectFileInfo.absolutePath();
116 mProjectIsFile = true;
117 }
118
119 if ( mProjectIsFile )
120 {
121 mProjectDetailsLabel->setText( tr( "The current project file path is ’%1’." ).arg( u"<b>%1</b>"_s.arg( mProjectAbsoluteFilePath ) ) );
122 QDir dir( mProjectAbsolutePath );
123 mTrustProjectFolderCheckBox->setText( tr( "Apply decision to all projects in folder ’%1’" ).arg( u"%1"_s.arg( dir.dirName() ) ) );
124 }
125 else
126 {
127 mProjectDetailsLabel->setText( tr( "The current project URI is ’%1’." ).arg( u"<b>%1</b>"_s.arg( mProjectAbsoluteFilePath ) ) );
128 mTrustProjectFolderCheckBox->setVisible( false );
129 }
130
131 project->accept( &mEmbeddedScriptsVisitor, QgsObjectVisitorContext() );
132 }
133
134 for ( const QgsEmbeddedScriptEntity &scriptDetails : mEmbeddedScriptsVisitor.embeddedScripts() )
135 {
136 QListWidgetItem *newItem = new QListWidgetItem( mScriptPreviewList );
137 switch ( scriptDetails.type() )
138 {
140 newItem->setIcon( QgsApplication::getThemeIcon( u"/mIconPythonFile.svg"_s ) );
141 break;
142
144 newItem->setIcon( QgsApplication::getThemeIcon( u"/mIconExpression.svg"_s ) );
145 break;
146
148 newItem->setIcon( QgsApplication::getThemeIcon( u"/mAction.svg"_s ) );
149 break;
150
152 newItem->setIcon( QgsApplication::getThemeIcon( u"/mActionFormView.svg"_s ) );
153 break;
154 }
155 newItem->setText( scriptDetails.name() );
156 newItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
157 mScriptPreviewList->addItem( newItem );
158 }
159}
160
161void QgsProjectTrustDialog::buttonBoxClicked( QAbstractButton *button )
162{
163 QDialogButtonBox::StandardButton buttonType = mButtonBox->standardButton( button );
164 if ( buttonType == QDialogButtonBox::StandardButton::Help )
165 {
166 showHelp();
167 return;
168 }
169
170 bool accepted = false;
171 QString path = !mProjectIsFile || mTrustProjectFolderCheckBox->isChecked() ? mProjectAbsolutePath : mProjectAbsoluteFilePath;
172 if ( !path.isEmpty() )
173 {
175 trustedProjectsFolders.removeAll( path );
177 untrustedProjectsFolders.removeAll( path );
178
179 QStringList temporarilyTrustedProjectsFolders = QgsApplication::temporarilyTrustedProjectsFolders();
180 temporarilyTrustedProjectsFolders.removeAll( path );
181 QStringList temporarilyUntrustedProjectsFolders = QgsApplication::temporarilyUntrustedProjectsFolders();
182 temporarilyUntrustedProjectsFolders.removeAll( path );
183
184 if ( buttonType == QDialogButtonBox::StandardButton::YesToAll )
185 {
186 trustedProjectsFolders << path;
187 accepted = true;
188 }
189 else if ( buttonType == QDialogButtonBox::StandardButton::Yes )
190 {
191 temporarilyTrustedProjectsFolders << path;
192 accepted = true;
193 }
194 else if ( buttonType == QDialogButtonBox::StandardButton::NoToAll )
195 {
196 untrustedProjectsFolders << path;
197 accepted = false;
198 }
199 else if ( buttonType == QDialogButtonBox::StandardButton::No )
200 {
201 temporarilyUntrustedProjectsFolders << path;
202 accepted = false;
203 }
204
205 trustedProjectsFolders.sort();
206 untrustedProjectsFolders.sort();
207 temporarilyTrustedProjectsFolders.sort();
208 temporarilyUntrustedProjectsFolders.sort();
209
212
213 QgsApplication::setTemporarilyTrustedProjectsFolders( temporarilyTrustedProjectsFolders );
214 QgsApplication::setTemporarilyUntrustedProjectsFolders( temporarilyUntrustedProjectsFolders );
215 }
216
217 done( accepted ? QDialog::Accepted : QDialog::Rejected );
218}
219
220void QgsProjectTrustDialog::showHelp()
221{
222 QgsHelp::openHelp( u"introduction/getting_started.html"_s );
223}
@ Action
Expression functions.
Definition qgis.h:466
@ FormInitCode
Map layers' action.
Definition qgis.h:467
@ ExpressionFunction
Project macros.
Definition qgis.h:465
static void setTemporarilyUntrustedProjectsFolders(const QStringList &untrustedProjectsFolders)
Sets the list of projects and folders that have been temporarily determined as untrusted by the user.
static QgsProjectStorageRegistry * projectStorageRegistry()
Returns registry of available project storage implementations.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
static QStringList temporarilyTrustedProjectsFolders()
Returns the list of projects and folders that have been temporarily determined as trusted by the user...
static QStringList temporarilyUntrustedProjectsFolders()
Returns the list of projects and folders that have been temporarily determined as untrusted by the us...
static void setTemporarilyTrustedProjectsFolders(const QStringList &trustedProjectsFolders)
Sets the list of projects and folders that have been temporarily determined as trusted by the user.
A embedded script entity for QgsObjectEntityVisitorInterface.
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
A QgsObjectEntityVisitorInterface context object.
QgsProjectStorage * projectStorageFromUri(const QString &uri)
Returns storage implementation if the URI matches one. Returns nullptr otherwise (it is a normal file...
Abstract interface for project storage - to be implemented by various backends and registered in QgsP...
virtual QString filePath(const QString &uri)
Extracts and returns the file path from a storage backend uri, filesystem-based storage backends shou...
QgsProjectTrustDialog(QgsProject *project, QWidget *parent=nullptr, Qt::WindowFlags fl=QgsGuiUtils::ModalDialogFlags)
Constructor for QgsProjectTrustDialog using the specified project instance.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
Definition qgsproject.h:113
QString fileName
Definition qgsproject.h:117
bool accept(QgsStyleEntityVisitorInterface *visitor) const
Accepts the specified style entity visitor, causing it to visit all style entities associated with th...
T value(const QString &dynamicKeyPart=QString()) const
Returns settings value.
bool setValue(const T &value, const QString &dynamicKeyPart=QString()) const
Set settings value.
static const QgsSettingsEntryStringList * settingsCodeExecutionTrustedProjectsFolders
Settings entry for projects and folders that are allowed execution of embedded scripts across session...
static const QgsSettingsEntryStringList * settingsCodeExecutionUntrustedProjectsFolders
Settings entry for projects and folders that are denied execution of embedded scripts across sessions...