QGIS API Documentation 3.28.0-Firenze (ed3ad0430f)
qgsactionwidgetwrapper.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsactionwidgetwrapper.cpp - QgsActionWidgetWrapper
3
4 ---------------------
5 begin : 14.8.2021
6 copyright : (C) 2021 by Alessandro Pasotti
7 email : elpaso at itopen dot it
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 ***************************************************************************/
17#include "qgsactionmanager.h"
19#include "qgspythonrunner.h"
20#include "qgsattributeform.h"
21
22#include <QLayout>
23
24QgsActionWidgetWrapper::QgsActionWidgetWrapper( QgsVectorLayer *layer, QWidget *editor, QWidget *parent )
25 : QgsWidgetWrapper( layer, editor, parent )
26{
27 connect( this, &QgsWidgetWrapper::contextChanged, [ = ]
28 {
29 const bool actionIsVisible {
30 ( context().attributeFormMode() == QgsAttributeEditorContext::Mode::SingleEditMode ) ||
31 ( context().attributeFormMode() == QgsAttributeEditorContext::Mode::AddFeatureMode ) };
32 if ( mActionButton )
33 {
34 mActionButton->setVisible( actionIsVisible );
35 }
36 } );
37}
38
40{
41 mAction = action;
42}
43
45{
46 mFeature = feature;
47}
48
50{
51 if ( valid() && layer() )
52 {
53 mActionButton->setEnabled( !mAction.isEnabledOnlyWhenEditable() || enabled );
54 }
55}
56
58{
59 return mAction.isValid() && mAction.runable();
60}
61
62QWidget *QgsActionWidgetWrapper::createWidget( QWidget *parent )
63{
64 return new QPushButton( parent );
65}
66
68{
69
70 mActionButton = qobject_cast<QPushButton *>( editor );
71
72 if ( !mActionButton )
73 return;
74
75 if ( valid() && layer() )
76 {
77 const QString shortTitle { mAction.shortTitle() }; // might be empty
78 const QString description { mAction.name() }; // mandatory
79 const QIcon icon { mAction.icon() }; // might be invalid
80
81 // Configure push button
82 if ( ! icon.isNull() )
83 {
84 mActionButton->setIcon( icon );
85 mActionButton->setToolTip( description );
86 }
87 else
88 {
89 mActionButton->setText( shortTitle.isEmpty() ? description : shortTitle );
90 if ( ! shortTitle.isEmpty() )
91 {
92 mActionButton->setToolTip( description );
93 }
94 }
95
96 if ( mAction.isEnabledOnlyWhenEditable() && !layer()->isEditable() )
97 {
98 mActionButton->setEnabled( false );
99 }
100
101 // Always connect
102 connect( mActionButton, &QPushButton::clicked, this, [ & ]
103 {
104 const QgsAttributeEditorContext attributecontext = context();
105 QgsExpressionContext expressionContext = layer()->createExpressionContext();
106 expressionContext << QgsExpressionContextUtils::formScope( mFeature, attributecontext.attributeFormModeString() );
107 expressionContext.setFeature( mFeature );
108 if ( mAction.type() == QgsAction::ActionType::GenericPython )
109 {
110 if ( QgsAttributeForm *form = qobject_cast<QgsAttributeForm *>( parent() ) )
111 {
112 const QString formCode = QStringLiteral( "locals()[\"form\"] = sip.wrapinstance( %1, qgis.gui.QgsAttributeForm )\n" )
113 .arg( ( quint64 ) form );
114 QgsAction action { mAction };
115 action.setCommand( formCode + mAction.command() );
116 action.run( layer(), mFeature, expressionContext );
117 }
118 }
119 else
120 {
121 mAction.run( layer(), mFeature, expressionContext );
122 }
123 } );
124
125 }
126
127}
128
QWidget * createWidget(QWidget *parent) override
This method should create a new widget with the provided parent.
void setFeature(const QgsFeature &feature) override
void initWidget(QWidget *editor) override
This method should initialize the editor widget with runtime data.
void setAction(const QgsAction &action)
Sets the action.
void setEnabled(bool enabled) override
bool valid() const override
Returns true if the widget has been properly initialized.
QgsActionWidgetWrapper(QgsVectorLayer *layer, QWidget *editor, QWidget *parent)
Create an action widget wrapper.
Utility class that encapsulates an action based on vector attributes.
Definition: qgsaction.h:35
QString name() const
The name of the action. This may be a longer description.
Definition: qgsaction.h:127
void run(QgsVectorLayer *layer, const QgsFeature &feature, const QgsExpressionContext &expressionContext) const
Run this action.
Definition: qgsaction.cpp:59
void setCommand(const QString &newCommand)
Sets the action command.
Definition: qgsaction.cpp:251
bool runable() const
Checks if the action is runable on the current platform.
Definition: qgsaction.cpp:42
QIcon icon() const
The icon.
Definition: qgsaction.h:150
bool isValid() const
Returns true if this action was a default constructed one.
Definition: qgsaction.h:144
ActionType type() const
The action type.
Definition: qgsaction.h:169
QString command() const
Returns the command that is executed by this action.
Definition: qgsaction.h:159
QString shortTitle() const
The short title is used to label user interface elements like buttons.
Definition: qgsaction.h:130
bool isEnabledOnlyWhenEditable() const
Returns whether only enabled in editable mode.
Definition: qgsaction.h:176
This class contains context information for attribute editor widgets.
QString attributeFormModeString() const
Returns given attributeFormMode as string.
Mode attributeFormMode() const
Returns current attributeFormMode.
static QgsExpressionContextScope * formScope(const QgsFeature &formFeature=QgsFeature(), const QString &formMode=QString())
Creates a new scope which contains functions and variables from the current attribute form/table form...
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition: qgsfeature.h:56
Represents a vector layer which manages a vector based data sets.
QgsExpressionContext createExpressionContext() const FINAL
This method needs to be reimplemented in all classes which implement this interface and return an exp...
Manages an editor widget Widget and wrapper share the same parent.
void contextChanged()
Signal when QgsAttributeEditorContext mContext changed.
const QgsAttributeEditorContext & context() const
Returns information about the context in which this widget is shown.
QgsVectorLayer * layer() const
Returns the vector layer associated with the widget.