1 /***************************************************************************
2                         qgsexpressionlocatorfilters.cpp
3                         ----------------------------
4    begin                : May 2017
5    copyright            : (C) 2017 by Nyall Dawson
6    email                : nyall dot dawson 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 
18 #include "qgsexpressioncalculatorlocatorfilter.h"
19 #include "qgsexpressioncontext.h"
20 #include "qgsexpressioncontextutils.h"
21 #include "qgsproject.h"
22 #include "qgisapp.h"
23 
24 #include <QClipboard>
25 
26 
27 
QgsExpressionCalculatorLocatorFilter(QObject * parent)28 QgsExpressionCalculatorLocatorFilter::QgsExpressionCalculatorLocatorFilter( QObject *parent )
29   : QgsLocatorFilter( parent )
30 {
31   setUseWithoutPrefix( false );
32 }
33 
clone() const34 QgsExpressionCalculatorLocatorFilter *QgsExpressionCalculatorLocatorFilter::clone() const
35 {
36   return new QgsExpressionCalculatorLocatorFilter();
37 }
38 
fetchResults(const QString & string,const QgsLocatorContext &,QgsFeedback *)39 void QgsExpressionCalculatorLocatorFilter::fetchResults( const QString &string, const QgsLocatorContext &, QgsFeedback * )
40 {
41   QgsExpressionContext context;
42   context << QgsExpressionContextUtils::globalScope()
43           << QgsExpressionContextUtils::projectScope( QgsProject::instance() )
44           << QgsExpressionContextUtils::layerScope( QgisApp::instance()->activeLayer() );
45 
46   QString error;
47   if ( QgsExpression::checkExpression( string, &context, error ) )
48   {
49     QgsExpression exp( string );
50     const QString resultString = exp.evaluate( &context ).toString();
51     if ( !resultString.isEmpty() )
52     {
53       QgsLocatorResult result;
54       result.filter = this;
55       result.displayString = tr( "Copy “%1” to clipboard" ).arg( resultString );
56       result.userData = resultString;
57       result.score = 1;
58       emit resultFetched( result );
59     }
60   }
61 }
62 
triggerResult(const QgsLocatorResult & result)63 void QgsExpressionCalculatorLocatorFilter::triggerResult( const QgsLocatorResult &result )
64 {
65   QApplication::clipboard()->setText( result.userData.toString() );
66 }
67