Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsaction.cpp - QgsAction 3 : : 4 : : --------------------- 5 : : begin : 18.4.2016 6 : : copyright : (C) 2016 by Matthias Kuhn 7 : : email : matthias@opengis.ch 8 : : *************************************************************************** 9 : : * * 10 : : * This program is free software; you can redistribute it and/or modify * 11 : : * it under the terms of the GNU General Public License as published by * 12 : : * the Free Software Foundation; either version 2 of the License, or * 13 : : * (at your option) any later version. * 14 : : * * 15 : : ***************************************************************************/ 16 : : 17 : : #include "qgsaction.h" 18 : : 19 : : #include <QDesktopServices> 20 : : #include <QFileInfo> 21 : : #include <QUrl> 22 : : 23 : : #include "qgspythonrunner.h" 24 : : #include "qgsrunprocess.h" 25 : : #include "qgsexpressioncontext.h" 26 : : #include "qgsvectorlayer.h" 27 : : #include "qgslogger.h" 28 : : #include "qgsexpressioncontextutils.h" 29 : : 30 : 0 : bool QgsAction::runable() const 31 : : { 32 : 0 : return mType == Generic || 33 : 0 : mType == GenericPython || 34 : 0 : mType == OpenUrl || 35 : : #if defined(Q_OS_WIN) 36 : : mType == Windows 37 : : #elif defined(Q_OS_MAC) 38 : : mType == Mac 39 : : #else 40 : 0 : mType == Unix 41 : : #endif 42 : : ; 43 : : } 44 : : 45 : 0 : void QgsAction::run( QgsVectorLayer *layer, const QgsFeature &feature, const QgsExpressionContext &expressionContext ) const 46 : : { 47 : 0 : QgsExpressionContext actionContext( expressionContext ); 48 : : 49 : 0 : actionContext << QgsExpressionContextUtils::layerScope( layer ); 50 : 0 : actionContext.setFeature( feature ); 51 : : 52 : 0 : run( actionContext ); 53 : 0 : } 54 : : 55 : 0 : void QgsAction::run( const QgsExpressionContext &expressionContext ) const 56 : : { 57 : 0 : if ( !isValid() ) 58 : : { 59 : 0 : QgsDebugMsg( QStringLiteral( "Invalid action cannot be run" ) ); 60 : 0 : return; 61 : : } 62 : : 63 : 0 : QgsExpressionContextScope *scope = new QgsExpressionContextScope( mExpressionContextScope ); 64 : 0 : QgsExpressionContext context( expressionContext ); 65 : 0 : context << scope; 66 : : 67 : 0 : QString expandedAction = QgsExpression::replaceExpressionText( mCommand, &context ); 68 : : 69 : 0 : if ( mType == QgsAction::OpenUrl ) 70 : : { 71 : 0 : QFileInfo finfo( expandedAction ); 72 : 0 : if ( finfo.exists() && finfo.isFile() ) 73 : 0 : QDesktopServices::openUrl( QUrl::fromLocalFile( expandedAction ) ); 74 : : else 75 : 0 : QDesktopServices::openUrl( QUrl( expandedAction, QUrl::TolerantMode ) ); 76 : 0 : } 77 : 0 : else if ( mType == QgsAction::GenericPython ) 78 : : { 79 : : // TODO: capture output from QgsPythonRunner (like QgsRunProcess does) 80 : 0 : QgsPythonRunner::run( expandedAction ); 81 : 0 : } 82 : : else 83 : : { 84 : : // The QgsRunProcess instance created by this static function 85 : : // deletes itself when no longer needed. 86 : 0 : QgsRunProcess::create( expandedAction, mCaptureOutput ); 87 : : } 88 : 0 : } 89 : : 90 : 0 : QSet<QString> QgsAction::actionScopes() const 91 : : { 92 : 0 : return mActionScopes; 93 : : } 94 : : 95 : 0 : void QgsAction::setActionScopes( const QSet<QString> &actionScopes ) 96 : : { 97 : 0 : mActionScopes = actionScopes; 98 : 0 : } 99 : : 100 : 0 : void QgsAction::readXml( const QDomNode &actionNode ) 101 : : { 102 : 0 : QDomElement actionElement = actionNode.toElement(); 103 : 0 : QDomNodeList actionScopeNodes = actionElement.elementsByTagName( QStringLiteral( "actionScope" ) ); 104 : : 105 : 0 : if ( actionScopeNodes.isEmpty() ) 106 : : { 107 : 0 : mActionScopes 108 : 0 : << QStringLiteral( "Canvas" ) 109 : 0 : << QStringLiteral( "Field" ) 110 : 0 : << QStringLiteral( "Feature" ); 111 : 0 : } 112 : : else 113 : : { 114 : 0 : for ( int j = 0; j < actionScopeNodes.length(); ++j ) 115 : : { 116 : 0 : QDomElement actionScopeElem = actionScopeNodes.item( j ).toElement(); 117 : 0 : mActionScopes << actionScopeElem.attribute( QStringLiteral( "id" ) ); 118 : 0 : } 119 : : } 120 : : 121 : 0 : mType = static_cast< QgsAction::ActionType >( actionElement.attributeNode( QStringLiteral( "type" ) ).value().toInt() ); 122 : 0 : mDescription = actionElement.attributeNode( QStringLiteral( "name" ) ).value(); 123 : 0 : mCommand = actionElement.attributeNode( QStringLiteral( "action" ) ).value(); 124 : 0 : mIcon = actionElement.attributeNode( QStringLiteral( "icon" ) ).value(); 125 : 0 : mCaptureOutput = actionElement.attributeNode( QStringLiteral( "capture" ) ).value().toInt() != 0; 126 : 0 : mShortTitle = actionElement.attributeNode( QStringLiteral( "shortTitle" ) ).value(); 127 : 0 : mNotificationMessage = actionElement.attributeNode( QStringLiteral( "notificationMessage" ) ).value(); 128 : 0 : mIsEnabledOnlyWhenEditable = actionElement.attributeNode( QStringLiteral( "isEnabledOnlyWhenEditable" ) ).value().toInt() != 0; 129 : 0 : mId = QUuid( actionElement.attributeNode( QStringLiteral( "id" ) ).value() ); 130 : 0 : if ( mId.isNull() ) 131 : 0 : mId = QUuid::createUuid(); 132 : 0 : } 133 : : 134 : 0 : void QgsAction::writeXml( QDomNode &actionsNode ) const 135 : : { 136 : 0 : QDomElement actionSetting = actionsNode.ownerDocument().createElement( QStringLiteral( "actionsetting" ) ); 137 : 0 : actionSetting.setAttribute( QStringLiteral( "type" ), mType ); 138 : 0 : actionSetting.setAttribute( QStringLiteral( "name" ), mDescription ); 139 : 0 : actionSetting.setAttribute( QStringLiteral( "shortTitle" ), mShortTitle ); 140 : 0 : actionSetting.setAttribute( QStringLiteral( "icon" ), mIcon ); 141 : 0 : actionSetting.setAttribute( QStringLiteral( "action" ), mCommand ); 142 : 0 : actionSetting.setAttribute( QStringLiteral( "capture" ), mCaptureOutput ); 143 : 0 : actionSetting.setAttribute( QStringLiteral( "notificationMessage" ), mNotificationMessage ); 144 : 0 : actionSetting.setAttribute( QStringLiteral( "isEnabledOnlyWhenEditable" ), mIsEnabledOnlyWhenEditable ); 145 : 0 : actionSetting.setAttribute( QStringLiteral( "id" ), mId.toString() ); 146 : : 147 : 0 : const auto constMActionScopes = mActionScopes; 148 : 0 : for ( const QString &scope : constMActionScopes ) 149 : : { 150 : 0 : QDomElement actionScopeElem = actionsNode.ownerDocument().createElement( QStringLiteral( "actionScope" ) ); 151 : 0 : actionScopeElem.setAttribute( QStringLiteral( "id" ), scope ); 152 : 0 : actionSetting.appendChild( actionScopeElem ); 153 : 0 : } 154 : : 155 : 0 : actionsNode.appendChild( actionSetting ); 156 : 0 : } 157 : : 158 : 0 : void QgsAction::setExpressionContextScope( const QgsExpressionContextScope &scope ) 159 : : { 160 : 0 : mExpressionContextScope = scope; 161 : 0 : } 162 : : 163 : 0 : QgsExpressionContextScope QgsAction::expressionContextScope() const 164 : : { 165 : 0 : return mExpressionContextScope; 166 : : };