27 #include <QMouseEvent>
31 QIcon QgsDataDefinedButton::mIconDataDefine;
32 QIcon QgsDataDefinedButton::mIconDataDefineOn;
33 QIcon QgsDataDefinedButton::mIconDataDefineError;
34 QIcon QgsDataDefinedButton::mIconDataDefineExpression;
35 QIcon QgsDataDefinedButton::mIconDataDefineExpressionOn;
36 QIcon QgsDataDefinedButton::mIconDataDefineExpressionError;
46 if ( mIconDataDefine.
isNull() )
60 setStyleSheet(
QString(
"QToolButton{ background: none; border: 1px solid rgba(0, 0, 0, 0%);} QToolButton:focus { border: 1px solid palette(highlight); }" ) );
64 mDefineMenu =
new QMenu(
this );
65 connect( mDefineMenu, SIGNAL( aboutToShow() ),
this, SLOT( aboutToShowMenu() ) );
69 mFieldsMenu =
new QMenu(
this );
71 mActionDataTypes =
new QAction(
this );
73 mActionDataTypes->
setMenu( mFieldsMenu );
75 mActionActive =
new QAction(
this );
80 mActionDescription =
new QAction(
tr(
"Description..." ),
this );
82 mActionExpDialog =
new QAction(
tr(
"Edit..." ),
this );
83 mActionExpression = 0;
84 mActionPasteExpr =
new QAction(
tr(
"Paste" ),
this );
85 mActionCopyExpr =
new QAction(
tr(
"Copy" ),
this );
86 mActionClearExpr =
new QAction(
tr(
"Clear" ),
this );
87 mActionAssistant =
new QAction(
tr(
"Assistant..." ),
this );
88 QFont assistantFont = mActionAssistant->
font();
90 mActionAssistant->
setFont( assistantFont );
91 mDefineMenu->
addAction( mActionAssistant );
97 init( vl, datadefined, datatypes, description );
102 mEnabledWidgets.
clear();
103 mCheckedWidgets.
clear();
115 mProperty.
insert(
"active",
"0" );
116 mProperty.
insert(
"useexpr",
"0" );
117 mProperty.
insert(
"expression",
"" );
118 mProperty.
insert(
"field",
"" );
122 mProperty.
insert(
"active", datadefined->
isActive() ?
"1" :
"0" );
128 mDataTypes = datatypes;
129 mFieldNameList.
clear();
130 mFieldTypeList.
clear();
132 mInputDescription = description;
133 mFullDescription =
QString(
"" );
135 mCurrentDefinition =
QString(
"" );
138 mDataTypesString =
QString(
"" );
141 if ( mDataTypes.testFlag(
String ) )
143 ts <<
tr(
"string" );
145 if ( mDataTypes.testFlag(
Int ) )
149 if ( mDataTypes.testFlag(
Double ) )
151 ts <<
tr(
"double" );
156 mDataTypesString = ts.
join(
", " );
157 mActionDataTypes->
setText(
tr(
"Field type: " ) + mDataTypesString );
164 for (
int i = 0; i < fields.
count(); ++i )
167 bool fieldMatch =
false;
172 case QVariant::String:
173 fieldMatch = mDataTypes.testFlag(
String );
174 fieldType =
tr(
"string" );
177 fieldMatch = mDataTypes.testFlag(
Int ) || mDataTypes.testFlag(
Double );
178 fieldType =
tr(
"integer" );
180 case QVariant::Double:
181 fieldMatch = mDataTypes.testFlag(
Double );
182 fieldType =
tr(
"double" );
184 case QVariant::Invalid:
187 fieldType =
tr(
"unknown type" );
189 if ( fieldMatch || mDataTypes.testFlag(
AnyType ) )
191 mFieldNameList << f.
name();
192 mFieldTypeList << fieldType;
221 if (( event->
modifiers() & ( Qt::ControlModifier ) )
222 ||
event->button() == Qt::RightButton )
234 void QgsDataDefinedButton::aboutToShowMenu()
236 mDefineMenu->
clear();
240 QString ddTitle =
tr(
"Data defined override" );
245 ddTitleAct->
setFont( titlefont );
248 bool addActiveAction =
false;
253 addActiveAction = !exp.hasParserError();
261 if ( addActiveAction )
269 if ( !mFullDescription.
isEmpty() )
271 mDefineMenu->
addAction( mActionDescription );
276 bool fieldActive =
false;
277 if ( !mDataTypesString.
isEmpty() )
280 fieldTitleAct->
setFont( titlefont );
283 mDefineMenu->
addAction( mActionDataTypes );
285 mFieldsMenu->
clear();
287 if ( mFieldNameList.
size() > 0 )
290 for (
int j = 0; j < mFieldNameList.
count(); ++j )
292 QString fldname = mFieldNameList.
at( j );
293 QAction* act = mFieldsMenu->
addAction( fldname +
" (" + mFieldTypeList.
at( j ) +
")" );
316 exprTitleAct->
setFont( titlefont );
322 if ( expString.
length() > 35 )
325 expString.
append(
"..." );
330 if ( !mActionExpression )
332 mActionExpression =
new QAction( expString,
this );
337 mActionExpression->
setText( expString );
339 mDefineMenu->
addAction( mActionExpression );
342 mDefineMenu->
addAction( mActionExpDialog );
343 mDefineMenu->
addAction( mActionCopyExpr );
344 mDefineMenu->
addAction( mActionPasteExpr );
345 mDefineMenu->
addAction( mActionClearExpr );
349 mDefineMenu->
addAction( mActionExpDialog );
350 mDefineMenu->
addAction( mActionPasteExpr );
353 if ( mAssistant.
data() )
356 mDefineMenu->
addAction( mActionAssistant );
360 void QgsDataDefinedButton::menuActionTriggered(
QAction* action )
362 if ( action == mActionActive )
367 else if ( action == mActionDescription )
369 showDescriptionDialog();
371 else if ( action == mActionExpDialog )
373 showExpressionDialog();
375 else if ( action == mActionExpression )
381 else if ( action == mActionCopyExpr )
385 else if ( action == mActionPasteExpr )
396 else if ( action == mActionClearExpr )
407 else if ( action == mActionAssistant )
411 else if ( mFieldsMenu->
actions().contains( action ) )
426 void QgsDataDefinedButton::showDescriptionDialog()
434 void QgsDataDefinedButton::showAssistant()
436 if ( !mAssistant.
data() )
439 if ( mAssistant->exec() == QDialog::Accepted )
453 void QgsDataDefinedButton::showExpressionDialog()
456 if ( d.exec() == QDialog::Accepted )
458 QString newExp = d.expressionText();
460 bool hasExp = !newExp.
isEmpty();
469 void QgsDataDefinedButton::updateGui()
471 QString oldDef = mCurrentDefinition;
490 icon =
isActive() ? mIconDataDefineExpressionOn : mIconDataDefineExpression;
494 if ( exp.hasParserError() )
497 icon = mIconDataDefineExpressionError;
498 deftip =
tr(
"Parse error: %1" ).
arg( exp.parserErrorString() );
504 icon =
isActive() ? mIconDataDefineOn : mIconDataDefine;
510 icon = mIconDataDefineError;
519 if ( newDef != oldDef )
521 mCurrentDefinition = newDef;
526 mFullDescription =
tr(
"<b><u>Data defined override</u></b><br>" );
528 mFullDescription +=
tr(
"<b>Active: </b>%1 <i>(ctrl|right-click toggles)</i><br>" ).
arg(
isActive() ?
tr(
"yes" ) :
tr(
"no" ) );
532 mFullDescription +=
tr(
"<b>Usage:</b><br>%1<br>" ).
arg( mUsageInfo );
535 if ( !mInputDescription.
isEmpty() )
537 mFullDescription +=
tr(
"<b>Expected input:</b><br>%1<br>" ).
arg( mInputDescription );
540 if ( !mDataTypesString.
isEmpty() )
542 mFullDescription +=
tr(
"<b>Valid input types:</b><br>%1<br>" ).
arg( mDataTypesString );
546 if ( deftip !=
tr(
"undefined" ) )
552 if ( deftip.
length() > 75 )
558 mFullDescription +=
tr(
"<b>Current definition %1:</b><br>%2" ).
arg( deftype ).
arg( deftip );
568 mProperty.
insert(
"active", active ?
"1" :
"0" );
575 for (
int i = 0; i < wdgts.
size(); ++i )
584 if ( !mEnabledWidgets.
contains( wdgtP ) )
586 mEnabledWidgets.
append( wdgtP );
593 for (
int i = 0; i < mEnabledWidgets.
size(); ++i )
595 wdgtList << mEnabledWidgets.
at( i );
602 for (
int i = 0; i < mEnabledWidgets.
size(); ++i )
604 mEnabledWidgets.
at( i )->setDisabled( disable );
610 for (
int i = 0; i < wdgts.
size(); ++i )
619 if ( !mCheckedWidgets.
contains( wdgtP ) )
621 mCheckedWidgets.
append( wdgtP );
628 for (
int i = 0; i < mCheckedWidgets.
size(); ++i )
630 wdgtList << mCheckedWidgets.
at( i );
637 mActionAssistant->
setText( title.
isEmpty() ?
tr(
"Assistant..." ) : title );
638 mAssistant.
reset( assistant );
639 mAssistant.
data()->setParent(
this, Qt::Dialog );
649 for (
int i = 0; i < mCheckedWidgets.
size(); ++i )
668 return tr(
"string " );
673 return tr(
"single character" );
678 return tr(
"bool [<b>1</b>=True|<b>0</b>=False]" );
683 return tr(
"string of variable length" );
688 return tr(
"int [<= 0 =>]" );
693 return tr(
"int [>= 0]" );
698 return tr(
"int [>= 1]" );
703 return tr(
"double [<= 0.0 =>]" );
708 return tr(
"double [>= 0.0]" );
713 return tr(
"double [0.0-1.0]" );
718 return tr(
"double coord [<b>X,Y</b>] as <= 0.0 =>" );
723 return tr(
"double [-180.0 - 180.0]" );
728 return tr(
"int [0-100]" );
733 return trString() +
"[<b>MM</b>|<b>MapUnit</b>]";
738 return trString() +
"[<b>MM</b>|<b>MapUnit</b>|<b>Percent</b>]";
743 return tr(
"string [<b>r,g,b</b>] as int 0-255" );
748 return tr(
"string [<b>r,g,b,a</b>] as int 0-255" );
753 return trString() +
"[<b>Left</b>|<b>Center</b>|<b>Right</b>]";
758 return trString() +
"[<b>Bottom</b>|<b>Middle</b>|<b>Top</b>]";
763 return trString() +
"[<b>bevel</b>|<b>miter</b>|<b>round</b>]";
768 return trString() +
QString(
"[<b>Normal</b>|<b>Lighten</b>|<b>Screen</b>|<b>Dodge</b>|<br>"
769 "<b>Addition</b>|<b>Darken</b>|<b>Multiply</b>|<b>Burn</b>|<b>Overlay</b>|<br>"
770 "<b>SoftLight</b>|<b>HardLight</b>|<b>Difference</b>|<b>Subtract</b>]" );
776 "<b>''</b>=empty|absolute|search-paths-relative|<br>"
777 "project-relative|URL" );
782 return tr(
"string [<b>filepath</b>]" );
787 return trString() +
QString(
"[<b>A5</b>|<b>A4</b>|<b>A3</b>|<b>A2</b>|<b>A1</b>|<b>A0</b>"
788 "<b>B5</b>|<b>B4</b>|<b>B3</b>|<b>B2</b>|<b>B1</b>|<b>B0</b>"
789 "<b>Legal</b>|<b>Ansi A</b>|<b>Ansi B</b>|<b>Ansi C</b>|<b>Ansi D</b>|<b>Ansi E</b>"
790 "<b>Arch A</b>|<b>Arch B</b>|<b>Arch C</b>|<b>Arch D</b>|<b>Arch E</b>|<b>Arch E1</b>]"
801 return trString() +
QString(
"[<b>left</b>|<b>center</b>|<b>right</b>]" );
806 return trString() +
QString(
"[<b>top</b>|<b>center</b>|<b>bottom</b>]" );
811 return trString() +
QString(
"[<b>linear</b>|<b>radial</b>|<b>conical</b>]" );
821 return trString() +
QString(
"[<b>pad</b>|<b>repeat</b>|<b>reflect</b>]" );
826 return trString() +
QString(
"[<b>no</b>|<b>solid</b>|<b>dash</b>|<b>dot</b>|<b>dash dot</b>|<b>dash dot dot</b>]" );
831 return trString() +
QString(
"[<b>square</b>|<b>flat</b>|<b>round</b>]" );
836 return trString() +
QString(
"[<b>solid</b>|<b>horizontal</b>|<b>vertical</b>|<b>cross</b>|<b>b_diagonal</b>|<b>f_diagonal"
837 "</b>|<b>diagonal_x</b>|<b>dense1</b>|<b>dense2</b>|<b>dense3</b>|<b>dense4</b>|<b>dense5"
838 "</b>|<b>dense6</b>|<b>dense7</b>|<b>no]" );
843 return trString() +
QString(
"[<b>circle</b>|<b>rectangle</b>|<b>cross</b>|<b>triangle</b>]" );
848 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").
const QString & name() const
Gets the name of the field.
void setActive(bool active)
An assistant (wizard) dialog, accessible from a QgsDataDefinedButton.
QString & append(QChar ch)
void truncate(int position)
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
Container of fields for a vector layer.
QString expressionString() const
QString join(const QString &separator) const
QString tr(const char *sourceText, const char *disambiguation, int n)
void setBold(bool enable)
void setMessageAsHtml(const QString &msg)
void setUseExpression(bool use)
int count(const T &value) const
void append(const T &value)
void setChecked(bool checked)
void setField(const QString &field)
int count() const
Return number of items.
Encapsulate a field in an attribute table or data source.
const QgsField & at(int i) const
Get field at particular index (must be in range 0..N-1)
bool useExpression() const
void setData(const QVariant &userData)
bool contains(const T &value) const
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)
const QgsFields & pendingFields() const
returns field list in the to-be-committed state
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.
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
void setExpressionString(const QString &expr)
A generic dialog for building expression strings.
QVariant::Type type() const
Gets variant type of the field as it will be retrieved from data source.