27 #include <QMouseEvent>    34     const DataTypes& datatypes,
    37     , mExpressionContextCallback( nullptr )
    38     , mExpressionContextCallbackContext( nullptr )
    41   if ( mIconDataDefine.
isNull() )
    55   setStyleSheet( 
QString( 
"QToolButton{ background: none; border: 1px solid rgba(0, 0, 0, 0%);} QToolButton:focus { border: 1px solid palette(highlight); }" ) );
    59   mDefineMenu = 
new QMenu( 
this );
    60   connect( mDefineMenu, SIGNAL( aboutToShow() ), 
this, SLOT( aboutToShowMenu() ) );
    64   mFieldsMenu = 
new QMenu( 
this );
    65   mActionDataTypes = 
new QAction( 
this );
    67   mActionDataTypes->
setMenu( mFieldsMenu );
    69   mActionVariables = 
new QAction( 
tr( 
"Variable" ), 
this );
    70   mVariablesMenu = 
new QMenu( 
this );
    71   mActionVariables->
setMenu( mVariablesMenu );
    73   mActionActive = 
new QAction( 
this );
    78   mActionDescription = 
new QAction( 
tr( 
"Description..." ), 
this );
    80   mActionExpDialog = 
new QAction( 
tr( 
"Edit..." ), 
this );
    81   mActionExpression = 
nullptr;
    82   mActionPasteExpr = 
new QAction( 
tr( 
"Paste" ), 
this );
    83   mActionCopyExpr = 
new QAction( 
tr( 
"Copy" ), 
this );
    84   mActionClearExpr = 
new QAction( 
tr( 
"Clear" ), 
this );
    85   mActionAssistant = 
new QAction( 
tr( 
"Assistant..." ), 
this );
    86   QFont assistantFont = mActionAssistant->
font();
    88   mActionAssistant->
setFont( assistantFont );
    89   mDefineMenu->
addAction( mActionAssistant );
    95   init( vl, datadefined, datatypes, description );
   100   mEnabledWidgets.
clear();
   101   mCheckedWidgets.
clear();
   104 void QgsDataDefinedButton::updateFieldLists()
   106   mFieldNameList.
clear();
   107   mFieldTypeList.
clear();
   114       bool fieldMatch = 
false;
   119         case QVariant::String:
   120           fieldMatch = mDataTypes.testFlag( 
String );
   121           fieldType = 
tr( 
"string" );
   124           fieldMatch = mDataTypes.testFlag( 
Int ) || mDataTypes.testFlag( 
Double );
   125           fieldType = 
tr( 
"integer" );
   127         case QVariant::Double:
   128           fieldMatch = mDataTypes.testFlag( 
Double );
   129           fieldType = 
tr( 
"double" );
   131         case QVariant::Invalid:
   134           fieldType = 
tr( 
"unknown type" );
   136       if ( fieldMatch || mDataTypes.testFlag( 
AnyType ) )
   138         mFieldNameList << f.
name();
   139         mFieldTypeList << fieldType;
   147                                  const DataTypes& datatypes,
   154     mProperty.
insert( 
"active", 
"0" );
   155     mProperty.
insert( 
"useexpr", 
"0" );
   161     mProperty.
insert( 
"active", datadefined->
isActive() ? 
"1" : 
"0" );
   167   mDataTypes = datatypes;
   168   mFieldNameList.
clear();
   169   mFieldTypeList.
clear();
   171   mInputDescription = description;
   172   mFullDescription.
clear();
   174   mCurrentDefinition.
clear();
   177   mDataTypesString.
clear();
   180   if ( mDataTypes.testFlag( 
String ) )
   182     ts << 
tr( 
"string" );
   184   if ( mDataTypes.testFlag( 
Int ) )
   188   if ( mDataTypes.testFlag( 
Double ) )
   190     ts << 
tr( 
"double" );
   195     mDataTypesString = ts.
join( 
", " );
   196     mActionDataTypes->
setText( 
tr( 
"Field type: " ) + mDataTypesString );
   225   if (( event->
modifiers() & ( Qt::ControlModifier ) )
   226       || 
event->button() == Qt::RightButton )
   238 void QgsDataDefinedButton::aboutToShowMenu()
   240   mDefineMenu->
clear();
   246   QString ddTitle = 
tr( 
"Data defined override" );
   251   ddTitleAct->
setFont( titlefont );
   254   bool addActiveAction = 
false;
   267   if ( addActiveAction )
   275   if ( !mFullDescription.
isEmpty() )
   277     mDefineMenu->
addAction( mActionDescription );
   282   bool fieldActive = 
false;
   283   if ( !mDataTypesString.
isEmpty() )
   286     fieldTitleAct->
setFont( titlefont );
   289     mDefineMenu->
addAction( mActionDataTypes );
   291     mFieldsMenu->
clear();
   293     if ( !mFieldNameList.
isEmpty() )
   296       for ( 
int j = 0; j < mFieldNameList.
count(); ++j )
   298         QString fldname = mFieldNameList.
at( j );
   299         QAction* act = mFieldsMenu->
addAction( fldname + 
"    (" + mFieldTypeList.
at( j ) + 
')' );
   322   exprTitleAct->
setFont( titlefont );
   325   mVariablesMenu->
clear();
   326   bool variableActive = 
false;
   327   if ( mExpressionContextCallback )
   331     Q_FOREACH ( 
const QString& variable, variables )
   345         variableActive = 
true;
   350   if ( mVariablesMenu->
actions().isEmpty() )
   356   mDefineMenu->
addAction( mActionVariables );
   363     if ( expString.
length() > 35 )
   366       expString.
append( 
"..." );
   371     if ( !mActionExpression )
   373       mActionExpression = 
new QAction( expString, 
this );
   378       mActionExpression->
setText( expString );
   380     mDefineMenu->
addAction( mActionExpression );
   383     mDefineMenu->
addAction( mActionExpDialog );
   384     mDefineMenu->
addAction( mActionCopyExpr );
   385     mDefineMenu->
addAction( mActionPasteExpr );
   386     mDefineMenu->
addAction( mActionClearExpr );
   390     mDefineMenu->
addAction( mActionExpDialog );
   391     mDefineMenu->
addAction( mActionPasteExpr );
   394   if ( mAssistant.
data() )
   397     mDefineMenu->
addAction( mActionAssistant );
   401 void QgsDataDefinedButton::menuActionTriggered( 
QAction* action )
   403   if ( action == mActionActive )
   408   else if ( action == mActionDescription )
   410     showDescriptionDialog();
   412   else if ( action == mActionExpDialog )
   414     showExpressionDialog();
   416   else if ( action == mActionExpression )
   422   else if ( action == mActionCopyExpr )
   426   else if ( action == mActionPasteExpr )
   437   else if ( action == mActionClearExpr )
   448   else if ( action == mActionAssistant )
   452   else if ( mFieldsMenu->
actions().contains( action ) )  
   465   else if ( mVariablesMenu->
actions().contains( action ) )  
   477 void QgsDataDefinedButton::showDescriptionDialog()
   485 void QgsDataDefinedButton::showAssistant()
   487   if ( !mAssistant.
data() )
   490   if ( mAssistant->exec() == QDialog::Accepted )
   504 void QgsDataDefinedButton::showExpressionDialog()
   509   if ( d.
exec() == QDialog::Accepted )
   513     bool hasExp = !newExp.
isEmpty();
   522 void QgsDataDefinedButton::updateGui()
   524   QString oldDef = mCurrentDefinition;
   543     icon = 
isActive() ? mIconDataDefineExpressionOn : mIconDataDefineExpression;
   550       icon = mIconDataDefineExpressionError;
   557     icon = 
isActive() ? mIconDataDefineOn : mIconDataDefine;
   563       icon = mIconDataDefineError;
   572   if ( newDef != oldDef )
   574     mCurrentDefinition = newDef;
   579   mFullDescription = 
tr( 
"<b><u>Data defined override</u></b><br>" );
   581   mFullDescription += 
tr( 
"<b>Active: </b>%1   <i>(ctrl|right-click toggles)</i><br>" ).
arg( 
isActive() ? 
tr( 
"yes" ) : 
tr( 
"no" ) );
   585     mFullDescription += 
tr( 
"<b>Usage:</b><br>%1<br>" ).
arg( mUsageInfo );
   588   if ( !mInputDescription.
isEmpty() )
   590     mFullDescription += 
tr( 
"<b>Expected input:</b><br>%1<br>" ).
arg( mInputDescription );
   593   if ( !mDataTypesString.
isEmpty() )
   595     mFullDescription += 
tr( 
"<b>Valid input types:</b><br>%1<br>" ).
arg( mDataTypesString );
   599   if ( deftip != 
tr( 
"undefined" ) )
   605   if ( deftip.
length() > 75 )
   611   mFullDescription += 
tr( 
"<b>Current definition %1:</b><br>%2" ).
arg( deftype, deftip );
   621     mProperty.
insert( 
"active", active ? 
"1" : 
"0" );
   628   for ( 
int i = 0; i < wdgts.
size(); ++i )
   637   if ( !mEnabledWidgets.
contains( wdgtP ) )
   639     mEnabledWidgets.
append( wdgtP );
   647   for ( 
int i = 0; i < mEnabledWidgets.
size(); ++i )
   649     wdgtList << mEnabledWidgets.
at( i );
   656   for ( 
int i = 0; i < mEnabledWidgets.
size(); ++i )
   658     mEnabledWidgets.
at( i )->setDisabled( disable );
   664   for ( 
int i = 0; i < wdgts.
size(); ++i )
   673   if ( !mCheckedWidgets.
contains( wdgtP ) )
   675     mCheckedWidgets.
append( wdgtP );
   683   for ( 
int i = 0; i < mCheckedWidgets.
size(); ++i )
   685     wdgtList << mCheckedWidgets.
at( i );
   692   mExpressionContextCallback = fnGetExpressionContext;
   693   mExpressionContextCallbackContext = context;
   698   mActionAssistant->
setText( title.
isEmpty() ? 
tr( 
"Assistant..." ) : title );
   699   mAssistant.
reset( assistant );
   700   mAssistant.
data()->setParent( 
this, Qt::Dialog );
   705   return mAssistant.
data();
   715   for ( 
int i = 0; i < mCheckedWidgets.
size(); ++i )
   734   return tr( 
"string " );
   739   return tr( 
"single character" );
   744   return tr( 
"bool [<b>1</b>=True|<b>0</b>=False]" );
   749   return tr( 
"string of variable length" );
   754   return tr( 
"int [<= 0 =>]" );
   759   return tr( 
"int [>= 0]" );
   764   return tr( 
"int [>= 1]" );
   769   return tr( 
"double [<= 0.0 =>]" );
   774   return tr( 
"double [>= 0.0]" );
   779   return tr( 
"double [0.0-1.0]" );
   784   return tr( 
"double coord [<b>X,Y</b>] as <= 0.0 =>" );
   789   return tr( 
"double [-180.0 - 180.0]" );
   794   return tr( 
"int [0-100]" );
   799   return trString() + 
"[<b>MM</b>|<b>MapUnit</b>]";
   804   return trString() + 
"[<b>MM</b>|<b>MapUnit</b>|<b>Percent</b>]";
   809   return tr( 
"string [<b>r,g,b</b>] as int 0-255" );
   814   return tr( 
"string [<b>r,g,b,a</b>] as int 0-255" );
   819   return trString() + 
"[<b>Left</b>|<b>Center</b>|<b>Right</b>]";
   824   return trString() + 
"[<b>Bottom</b>|<b>Middle</b>|<b>Top</b>]";
   829   return trString() + 
"[<b>bevel</b>|<b>miter</b>|<b>round</b>]";
   835                                      "<b>Addition</b>|<b>Darken</b>|<b>Multiply</b>|<b>Burn</b>|<b>Overlay</b>|<br>"   836                                      "<b>SoftLight</b>|<b>HardLight</b>|<b>Difference</b>|<b>Subtract</b>]" );
   842                                      "<b>''</b>=empty|absolute|search-paths-relative|<br>"   843                                      "project-relative|URL" );
   848   return tr( 
"string [<b>filepath</b>]" );
   854                                      "<b>B5</b>|<b>B4</b>|<b>B3</b>|<b>B2</b>|<b>B1</b>|<b>B0</b>"   855                                      "<b>Legal</b>|<b>Ansi A</b>|<b>Ansi B</b>|<b>Ansi C</b>|<b>Ansi D</b>|<b>Ansi E</b>"   856                                      "<b>Arch A</b>|<b>Arch B</b>|<b>Arch C</b>|<b>Arch D</b>|<b>Arch E</b>|<b>Arch E1</b>]"   892   return trString() + 
QLatin1String( 
"[<b>no</b>|<b>solid</b>|<b>dash</b>|<b>dot</b>|<b>dash dot</b>|<b>dash dot dot</b>]" );
   902   return trString() + 
QLatin1String( 
"[<b>solid</b>|<b>horizontal</b>|<b>vertical</b>|<b>cross</b>|<b>b_diagonal</b>|<b>f_diagonal"   903                                      "</b>|<b>diagonal_x</b>|<b>dense1</b>|<b>dense2</b>|<b>dense3</b>|<b>dense4</b>|<b>dense5"   904                                      "</b>|<b>dense6</b>|<b>dense7</b>|<b>no]" );
   909   return trString() + 
QLatin1String( 
"[<b>circle</b>|<b>rectangle</b>|<b>diamond</b>|<b>cross</b>|<b>triangle"   910                                      "</b>|<b>right_half_triangle</b>|<b>left_half_triangle</b>|<b>semi_circle</b>]" );
   915   return tr( 
"[<b><dash>;<space></b>] e.g. '8;2;1;2'" );
 void setText(const QString &text)
Class for parsing and evaluation of expressions (formerly called "search strings"). 
bool hasParserError() const
Returns true if an error occurred when parsing the input expression. 
void setActive(bool active)
An assistant (wizard) dialog, accessible from a QgsDataDefinedButton. 
QString & append(QChar ch)
void truncate(int position)
bool isReadOnly(const QString &name) const
Returns whether a variable is read only, and should not be modifiable by users. 
A container class for data source field mapping or expression. 
QString & prepend(QChar ch)
static QIcon getThemeIcon(const QString &theName)
Helper to get a theme icon. 
const T & at(int i) const
bool contains(const QString &str, Qt::CaseSensitivity cs) const
QString join(const QString &separator) const
QString parserErrorString() const
Returns parser error. 
QString tr(const char *sourceText, const char *disambiguation, int n)
bool useExpression() const
Returns if the field or the expression part is active. 
QgsFields fields() const
Returns the list of fields of this layer. 
void setBold(bool enable)
void setMessageAsHtml(const QString &msg)
void setUseExpression(bool use)
Controls if the field or the expression part is active. 
int count(const T &value) const
void append(const T &value)
void setChecked(bool checked)
void setField(const QString &field)
Set the field name which this QgsDataDefined represents. 
QString expressionString() const
Returns the expression string of this QgsDataDefined. 
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
bool startsWith(const QString &s, Qt::CaseSensitivity cs) const
Encapsulate a field in an attribute table or data source. 
QStringList variableNames() const
Returns a list of variables names set by all scopes in the context. 
void setData(const QVariant &userData)
bool contains(const T &value) const
QString field() const
Get the field which this QgsDataDefined represents. 
void setItalic(bool enable)
QString text(Mode mode) const
A generic message view for displaying QGIS messages. 
iterator insert(const Key &key, const T &value)
void setText(const QString &text, Mode mode)
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
Represents a vector layer which manages a vector based data sets. 
QVariant::Type type() const
Gets variant type of the field as it will be retrieved from data source. 
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
void setExpressionString(const QString &expr)
Sets the expression for this QgsDataDefined. 
A generic dialog for building expression strings.