Skip to content

Commit 5c1fed5

Browse files
committed
Add saving of recent expressions. Fix #6091
1 parent 12a463d commit 5c1fed5

6 files changed

+66
-3
lines changed

src/gui/qgsexpressionbuilderdialog.cpp

+9-2
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
#include "qgsexpressionbuilderdialog.h"
1717
#include <QSettings>
1818

19-
QgsExpressionBuilderDialog::QgsExpressionBuilderDialog( QgsVectorLayer* layer, QString startText, QWidget* parent )
20-
: QDialog( parent )
19+
QgsExpressionBuilderDialog::QgsExpressionBuilderDialog( QgsVectorLayer* layer, QString startText, QWidget* parent, QString key )
20+
: QDialog( parent ), mRecentKey( key )
2121
{
2222
setupUi( this );
2323

@@ -27,6 +27,7 @@ QgsExpressionBuilderDialog::QgsExpressionBuilderDialog( QgsVectorLayer* layer, Q
2727
builder->setLayer( layer );
2828
builder->setExpressionText( startText );
2929
builder->loadFieldNames();
30+
builder->loadRecent(mRecentKey);
3031

3132
QSettings settings;
3233
restoreGeometry( settings.value( "/Windows/ExpressionBuilderDialog/geometry" ).toByteArray() );
@@ -55,6 +56,12 @@ void QgsExpressionBuilderDialog::done( int r )
5556
settings.setValue( "/Windows/ExpressionBuilderDialog/geometry", saveGeometry() );
5657
}
5758

59+
void QgsExpressionBuilderDialog::accept()
60+
{
61+
builder->saveToRecent(mRecentKey);
62+
QDialog::accept();
63+
}
64+
5865
void QgsExpressionBuilderDialog::setGeomCalculator( const QgsDistanceArea & da )
5966
{
6067
// Store in child widget only.

src/gui/qgsexpressionbuilderdialog.h

+6-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
class GUI_EXPORT QgsExpressionBuilderDialog : public QDialog, private Ui::QgsExpressionBuilderDialogBase
2727
{
2828
public:
29-
QgsExpressionBuilderDialog( QgsVectorLayer* layer, QString startText = QString(), QWidget* parent = NULL );
29+
QgsExpressionBuilderDialog(QgsVectorLayer* layer, QString startText = QString(), QWidget* parent = NULL , QString key = "generic" );
3030

3131
/** The builder widget that is used by the dialog */
3232
QgsExpressionBuilderWidget* expressionBuilder();
@@ -48,6 +48,11 @@ class GUI_EXPORT QgsExpressionBuilderDialog : public QDialog, private Ui::QgsExp
4848
* @param r result value (unused)
4949
*/
5050
virtual void done( int r );
51+
52+
virtual void accept();
53+
54+
private:
55+
QString mRecentKey;
5156
};
5257

5358
#endif

src/gui/qgsexpressionbuilderwidget.cpp

+35
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,41 @@ bool QgsExpressionBuilderWidget::isExpressionValid()
239239
return mExpressionValid;
240240
}
241241

242+
void QgsExpressionBuilderWidget::saveToRecent( QString key )
243+
{
244+
QSettings settings;
245+
QString location = QString( "/expressions/recent/%1" ).arg( key );
246+
QStringList expressions = settings.value( location ).toStringList();
247+
expressions.removeAll( this->expressionText() );
248+
249+
expressions.prepend( this->expressionText() );
250+
251+
while ( expressions.count() > 20 )
252+
{
253+
expressions.pop_back();
254+
}
255+
256+
settings.setValue( location, expressions );
257+
this->loadRecent( key );
258+
}
259+
260+
void QgsExpressionBuilderWidget::loadRecent( QString key )
261+
{
262+
QString name = tr( "Recent (%1)" ).arg( key );
263+
if ( mExpressionGroups.contains( name ) )
264+
{
265+
QgsExpressionItem* node = mExpressionGroups.value( name );
266+
node->removeRows(0, node->rowCount() );
267+
}
268+
269+
QSettings settings;
270+
QString location = QString( "/expressions/recent/%1" ).arg( key );
271+
QStringList expressions = settings.value( location ).toStringList();
272+
foreach ( QString expression, expressions ) {
273+
this->registerItem( name, expression, expression, expression );
274+
}
275+
}
276+
242277
void QgsExpressionBuilderWidget::setGeomCalculator( const QgsDistanceArea & da )
243278
{
244279
mDa = da;

src/gui/qgsexpressionbuilderwidget.h

+4
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,10 @@ class GUI_EXPORT QgsExpressionBuilderWidget : public QWidget, private Ui::QgsExp
148148

149149
bool isExpressionValid();
150150

151+
void saveToRecent(QString key);
152+
153+
void loadRecent( QString key);
154+
151155
public slots:
152156
void currentChanged( const QModelIndex &index, const QModelIndex & );
153157
void on_expressionTree_doubleClicked( const QModelIndex &index );

src/gui/qgsexpressionselectiondialog.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ QgsExpressionSelectionDialog::QgsExpressionSelectionDialog( QgsVectorLayer* laye
3939
mExpressionBuilder->setLayer( layer );
4040
mExpressionBuilder->setExpressionText( startText );
4141
mExpressionBuilder->loadFieldNames();
42+
mExpressionBuilder->loadRecent( "Selection" );
4243

4344
QSettings settings;
4445
restoreGeometry( settings.value( "/Windows/ExpressionSelectionDialog/geometry" ).toByteArray() );
@@ -90,6 +91,7 @@ void QgsExpressionSelectionDialog::on_mActionSelect_triggered()
9091
mLayer->setSelectedFeatures( newSelection );
9192

9293
delete expression;
94+
saveRecent();
9395
}
9496

9597
void QgsExpressionSelectionDialog::on_mActionAddToSelection_triggered()
@@ -117,6 +119,7 @@ void QgsExpressionSelectionDialog::on_mActionAddToSelection_triggered()
117119
mLayer->setSelectedFeatures( newSelection );
118120

119121
delete expression;
122+
saveRecent();
120123
}
121124

122125
void QgsExpressionSelectionDialog::on_mActionSelectInstersect_triggered()
@@ -153,6 +156,7 @@ void QgsExpressionSelectionDialog::on_mActionSelectInstersect_triggered()
153156
mLayer->setSelectedFeatures( newSelection );
154157

155158
delete expression;
159+
saveRecent();
156160
}
157161

158162
void QgsExpressionSelectionDialog::on_mActionRemoveFromSelection_triggered()
@@ -189,6 +193,8 @@ void QgsExpressionSelectionDialog::on_mActionRemoveFromSelection_triggered()
189193
mLayer->setSelectedFeatures( newSelection );
190194

191195
delete expression;
196+
197+
saveRecent();
192198
}
193199

194200
void QgsExpressionSelectionDialog::closeEvent( QCloseEvent *closeEvent )
@@ -209,3 +215,8 @@ void QgsExpressionSelectionDialog::done( int r )
209215
QDialog::done( r );
210216
close();
211217
}
218+
219+
void QgsExpressionSelectionDialog::saveRecent()
220+
{
221+
mExpressionBuilder->saveToRecent( "Selection" );
222+
}

src/gui/qgsexpressionselectiondialog.h

+1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ class GUI_EXPORT QgsExpressionSelectionDialog : public QDialog, private Ui::QgsE
8686
virtual void done( int r );
8787

8888
private:
89+
void saveRecent();
8990
QgsVectorLayer* mLayer;
9091
};
9192

0 commit comments

Comments
 (0)