QGIS API Documentation 3.99.0-Master (21b3aa880ba)
Loading...
Searching...
No Matches
qgsprocessingrastercalculatorexpressionlineedit.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsprocessingrastercalculatorexpressionlineedit.cpp
3 ---------------------
4 begin : July 2023
5 copyright : (C) 2023 by Alexander Bruy
6 email : alexander dot bruy at gmail dot com
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 "qgsfilterlineedit.h"
22#include "qgsgui.h"
23#include "qgsmaplayer.h"
24
25#include <QHBoxLayout>
26#include <QListWidgetItem>
27#include <QToolButton>
28
29#include "moc_qgsprocessingrastercalculatorexpressionlineedit.cpp"
30
32
33QgsProcessingRasterCalculatorExpressionLineEdit::QgsProcessingRasterCalculatorExpressionLineEdit( QWidget *parent )
34 : QWidget( parent )
35{
36 mLineEdit = new QgsFilterLineEdit();
37 mLineEdit->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum );
38
39 mButton = new QToolButton();
40 mButton->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum );
41 mButton->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mIconExpression.svg" ) ) );
42 connect( mButton, &QAbstractButton::clicked, this, &QgsProcessingRasterCalculatorExpressionLineEdit::editExpression );
43
44 QHBoxLayout *layout = new QHBoxLayout();
45 layout->setContentsMargins( 0, 0, 0, 0 );
46 layout->addWidget( mLineEdit );
47 layout->addWidget( mButton );
48 setLayout( layout );
49
50 setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum );
51 setFocusProxy( mLineEdit );
52 connect( mLineEdit, &QLineEdit::textChanged, this, static_cast<void ( QgsProcessingRasterCalculatorExpressionLineEdit::* )( const QString & )>( &QgsProcessingRasterCalculatorExpressionLineEdit::expressionEdited ) );
53
54 setExpression( expression() );
55}
56
57QgsProcessingRasterCalculatorExpressionLineEdit::~QgsProcessingRasterCalculatorExpressionLineEdit() = default;
58
59void QgsProcessingRasterCalculatorExpressionLineEdit::setLayers( const QVariantList &layers )
60{
61 mLayers = layers;
62}
63
64QString QgsProcessingRasterCalculatorExpressionLineEdit::expression() const
65{
66 if ( mLineEdit )
67 return mLineEdit->text();
68
69 return QString();
70}
71
72void QgsProcessingRasterCalculatorExpressionLineEdit::setExpression( const QString &newExpression )
73{
74 if ( mLineEdit )
75 mLineEdit->setText( newExpression );
76}
77
78void QgsProcessingRasterCalculatorExpressionLineEdit::editExpression()
79{
80 const QString currentExpression = expression();
81 QgsProcessingRasterCalculatorExpressionDialog dlg( mLayers );
82 dlg.setExpression( currentExpression );
83
84 if ( dlg.exec() )
85 {
86 const QString newExpression = dlg.expression();
87 setExpression( newExpression );
88 }
89}
90
91void QgsProcessingRasterCalculatorExpressionLineEdit::expressionEdited()
92{
93 emit expressionChanged( expression() );
94}
95
96void QgsProcessingRasterCalculatorExpressionLineEdit::expressionEdited( const QString &expression )
97{
98 emit expressionChanged( expression );
99}
100
101
102QgsProcessingRasterCalculatorExpressionDialog::QgsProcessingRasterCalculatorExpressionDialog( const QVariantList &layers, const QString &startExpression, QWidget *parent )
103 : QDialog( parent )
104 , mLayers( layers )
105 , mInitialText( startExpression )
106{
107 setupUi( this );
109
110 populateLayers();
111
112 connect( mLayersList, &QListWidget::itemDoubleClicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mLayersList_itemDoubleClicked );
113
114 connect( mBtnPlus, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnPlus_clicked );
115 connect( mBtnMinus, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnMinus_clicked );
116 connect( mBtnMultiply, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnMultiply_clicked );
117 connect( mBtnDivide, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnDivide_clicked );
118 connect( mBtnPower, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnPower_clicked );
119 connect( mBtnSqrt, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnSqrt_clicked );
120 connect( mBtnOpenBracket, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnOpenBracket_clicked );
121 connect( mBtnCloseBracket, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnCloseBracket_clicked );
122 connect( mBtnGreater, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnGreater_clicked );
123 connect( mBtnGreaterEqual, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnGreaterEqual_clicked );
124 connect( mBtnLess, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnLess_clicked );
125 connect( mBtnLessEqual, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnLessEqual_clicked );
126 connect( mBtnEqual, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnEqual_clicked );
127 connect( mBtnNotEqual, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnNotEqual_clicked );
128 connect( mBtnAnd, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnAnd_clicked );
129 connect( mBtnOr, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnOr_clicked );
130 connect( mBtnIf, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnIf_clicked );
131 connect( mBtnMin, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnMin_clicked );
132 connect( mBtnMax, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnMax_clicked );
133 connect( mBtnAbs, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnAbs_clicked );
134 connect( mBtnSin, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnSin_clicked );
135 connect( mBtnCos, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnCos_clicked );
136 connect( mBtnTan, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnTan_clicked );
137 connect( mBtnLog, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnLog_clicked );
138 connect( mBtnAsin, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnAsin_clicked );
139 connect( mBtnAcos, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnAcos_clicked );
140 connect( mBtnAtan, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnAtan_clicked );
141 connect( mBtnLn, &QPushButton::clicked, this, &QgsProcessingRasterCalculatorExpressionDialog::mBtnLn_clicked );
142
143 mExpressionTextEdit->setPlainText( mInitialText );
144}
145
146void QgsProcessingRasterCalculatorExpressionDialog::setExpression( const QString &text )
147{
148 mExpressionTextEdit->setPlainText( text );
149}
150
151QString QgsProcessingRasterCalculatorExpressionDialog::expression()
152{
153 return mExpressionTextEdit->toPlainText();
154}
155
156void QgsProcessingRasterCalculatorExpressionDialog::populateLayers()
157{
158 if ( mLayers.isEmpty() )
159 {
160 return;
161 }
162
163 for ( const QVariant &layer : mLayers )
164 {
165 QListWidgetItem *item = new QListWidgetItem( layer.toString(), mLayersList );
166 mLayersList->addItem( item );
167 }
168}
169
170QString QgsProcessingRasterCalculatorExpressionDialog::quoteBandEntry( const QString &layerName )
171{
172 // '"' -> '\\"'
173 QString quotedName = layerName;
174 quotedName.replace( '\"', QLatin1String( "\\\"" ) );
175 quotedName.append( '\"' );
176 quotedName.prepend( '\"' );
177 return quotedName;
178}
179
180void QgsProcessingRasterCalculatorExpressionDialog::mLayersList_itemDoubleClicked( QListWidgetItem *item )
181{
182 mExpressionTextEdit->insertPlainText( quoteBandEntry( QStringLiteral( "%1@1" ).arg( item->text() ) ) );
183}
184
185void QgsProcessingRasterCalculatorExpressionDialog::mBtnPlus_clicked()
186{
187 mExpressionTextEdit->insertPlainText( QStringLiteral( " + " ) );
188}
189
190void QgsProcessingRasterCalculatorExpressionDialog::mBtnMinus_clicked()
191{
192 mExpressionTextEdit->insertPlainText( QStringLiteral( " - " ) );
193}
194
195void QgsProcessingRasterCalculatorExpressionDialog::mBtnMultiply_clicked()
196{
197 mExpressionTextEdit->insertPlainText( QStringLiteral( " * " ) );
198}
199
200void QgsProcessingRasterCalculatorExpressionDialog::mBtnDivide_clicked()
201{
202 mExpressionTextEdit->insertPlainText( QStringLiteral( " / " ) );
203}
204
205void QgsProcessingRasterCalculatorExpressionDialog::mBtnPower_clicked()
206{
207 mExpressionTextEdit->insertPlainText( QStringLiteral( " ^ " ) );
208}
209
210void QgsProcessingRasterCalculatorExpressionDialog::mBtnSqrt_clicked()
211{
212 mExpressionTextEdit->insertPlainText( QStringLiteral( " sqrt ( " ) );
213}
214
215void QgsProcessingRasterCalculatorExpressionDialog::mBtnOpenBracket_clicked()
216{
217 mExpressionTextEdit->insertPlainText( QStringLiteral( " ( " ) );
218}
219
220void QgsProcessingRasterCalculatorExpressionDialog::mBtnCloseBracket_clicked()
221{
222 mExpressionTextEdit->insertPlainText( QStringLiteral( " ) " ) );
223}
224
225void QgsProcessingRasterCalculatorExpressionDialog::mBtnGreater_clicked()
226{
227 mExpressionTextEdit->insertPlainText( QStringLiteral( " > " ) );
228}
229
230void QgsProcessingRasterCalculatorExpressionDialog::mBtnGreaterEqual_clicked()
231{
232 mExpressionTextEdit->insertPlainText( QStringLiteral( " >= " ) );
233}
234
235void QgsProcessingRasterCalculatorExpressionDialog::mBtnLess_clicked()
236{
237 mExpressionTextEdit->insertPlainText( QStringLiteral( " < " ) );
238}
239
240void QgsProcessingRasterCalculatorExpressionDialog::mBtnLessEqual_clicked()
241{
242 mExpressionTextEdit->insertPlainText( QStringLiteral( " <= " ) );
243}
244
245void QgsProcessingRasterCalculatorExpressionDialog::mBtnEqual_clicked()
246{
247 mExpressionTextEdit->insertPlainText( QStringLiteral( " = " ) );
248}
249
250void QgsProcessingRasterCalculatorExpressionDialog::mBtnNotEqual_clicked()
251{
252 mExpressionTextEdit->insertPlainText( QStringLiteral( " != " ) );
253}
254
255void QgsProcessingRasterCalculatorExpressionDialog::mBtnAnd_clicked()
256{
257 mExpressionTextEdit->insertPlainText( QStringLiteral( " AND " ) );
258}
259
260void QgsProcessingRasterCalculatorExpressionDialog::mBtnOr_clicked()
261{
262 mExpressionTextEdit->insertPlainText( QStringLiteral( " OR " ) );
263}
264
265void QgsProcessingRasterCalculatorExpressionDialog::mBtnIf_clicked()
266{
267 mExpressionTextEdit->insertPlainText( QStringLiteral( " if ( " ) );
268}
269
270void QgsProcessingRasterCalculatorExpressionDialog::mBtnMin_clicked()
271{
272 mExpressionTextEdit->insertPlainText( QStringLiteral( " MIN ( " ) );
273}
274
275void QgsProcessingRasterCalculatorExpressionDialog::mBtnMax_clicked()
276{
277 mExpressionTextEdit->insertPlainText( QStringLiteral( " MAX ( " ) );
278}
279
280void QgsProcessingRasterCalculatorExpressionDialog::mBtnAbs_clicked()
281{
282 mExpressionTextEdit->insertPlainText( QStringLiteral( " ABS ( " ) );
283}
284
285void QgsProcessingRasterCalculatorExpressionDialog::mBtnSin_clicked()
286{
287 mExpressionTextEdit->insertPlainText( QStringLiteral( " sin ( " ) );
288}
289
290void QgsProcessingRasterCalculatorExpressionDialog::mBtnCos_clicked()
291{
292 mExpressionTextEdit->insertPlainText( QStringLiteral( " cos ( " ) );
293}
294
295void QgsProcessingRasterCalculatorExpressionDialog::mBtnTan_clicked()
296{
297 mExpressionTextEdit->insertPlainText( QStringLiteral( " tan ( " ) );
298}
299
300void QgsProcessingRasterCalculatorExpressionDialog::mBtnLog_clicked()
301{
302 mExpressionTextEdit->insertPlainText( QStringLiteral( " log10 ( " ) );
303}
304
305void QgsProcessingRasterCalculatorExpressionDialog::mBtnAsin_clicked()
306{
307 mExpressionTextEdit->insertPlainText( QStringLiteral( " asin ( " ) );
308}
309
310void QgsProcessingRasterCalculatorExpressionDialog::mBtnAcos_clicked()
311{
312 mExpressionTextEdit->insertPlainText( QStringLiteral( " acos ( " ) );
313}
314
315void QgsProcessingRasterCalculatorExpressionDialog::mBtnAtan_clicked()
316{
317 mExpressionTextEdit->insertPlainText( QStringLiteral( " atan ( " ) );
318}
319
320void QgsProcessingRasterCalculatorExpressionDialog::mBtnLn_clicked()
321{
322 mExpressionTextEdit->insertPlainText( QStringLiteral( " ln ( " ) );
323}
324
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
QLineEdit subclass with built in support for clearing the widget's value and handling custom null val...
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:221