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