419 changes: 103 additions & 316 deletions src/app/qgsfieldcalculator.cpp

Large diffs are not rendered by default.

35 changes: 5 additions & 30 deletions src/app/qgsfieldcalculator.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,35 +34,10 @@ class QgsFieldCalculator: public QDialog, private Ui::QgsFieldCalculatorBase
public slots:
void accept();

void on_mUpdateExistingFieldCheckBox_stateChanged( int state );
void on_mFieldsListWidget_itemDoubleClicked( QListWidgetItem * item );
void on_mValueListWidget_itemDoubleClicked( QListWidgetItem * item );
void on_mPlusPushButton_clicked();
void on_mMinusPushButton_clicked();
void on_mMultiplyPushButton_clicked();
void on_mDividePushButton_clicked();
void on_mSqrtButton_clicked();
void on_mExpButton_clicked();
void on_mSinButton_clicked();
void on_mCosButton_clicked();
void on_mTanButton_clicked();
void on_mASinButton_clicked();
void on_mACosButton_clicked();
void on_mATanButton_clicked();
void on_mOpenBracketPushButton_clicked();
void on_mCloseBracketPushButton_clicked();
void on_mToRealButton_clicked();
void on_mToIntButton_clicked();
void on_mToStringButton_clicked();
void on_mLengthButton_clicked();
void on_mAreaButton_clicked();
void on_mRowNumButton_clicked();
void on_mConcatButton_clicked();
void on_mAllPushButton_clicked();
void on_mNewFieldGroupBox_toggled( bool on );
void on_mUpdateExistingGroupBox_toggled( bool on );
void on_mOutputFieldNameLineEdit_textChanged( const QString& text );
void on_mExpressionTextEdit_textChanged();
void on_mOutputFieldTypeComboBox_activated( int index );
void on_mFieldsListWidget_currentItemChanged( QListWidgetItem * current, QListWidgetItem * previous );

void on_mButtonBox_helpRequested() { QgsContextHelp::run( metaObject()->className() ); }

Expand All @@ -73,9 +48,7 @@ class QgsFieldCalculator: public QDialog, private Ui::QgsFieldCalculatorBase
void populateFields();
/**Inserts the types supported by the provider into the combo box*/
void populateOutputFieldTypes();
/**Gets field values and inserts them into mValueListWidget
@limit 0: get all feature, != 0 stop after getting limit values*/
void getFieldValues( int limit );

/**Sets the ok button enabled / disabled*/
void setOkButtonState();

Expand All @@ -85,6 +58,8 @@ class QgsFieldCalculator: public QDialog, private Ui::QgsFieldCalculatorBase

/**idx of changed attribute*/
int mAttributeId;

bool mExpressionVaild;
};

#endif // QGSFIELDCALCULATOR_H
11 changes: 11 additions & 0 deletions src/gui/qgsexpressionbuilderwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ QgsExpressionBuilderWidget::QgsExpressionBuilderWidget( QWidget *parent )
expressionTree->setModel( mProxyModel );

expressionTree->setContextMenuPolicy( Qt::CustomContextMenu );
connect( this, SIGNAL( expressionParsed( bool ) ), this, SLOT( setExpressionState ) );
connect( expressionTree, SIGNAL( customContextMenuRequested( const QPoint & ) ), this, SLOT( showContextMenu( const QPoint & ) ) );

foreach( QPushButton* button, this->mOperatorsGroupBox->findChildren<QPushButton *>() )
Expand Down Expand Up @@ -213,6 +214,11 @@ void QgsExpressionBuilderWidget::registerItem( QString group,
}
}

bool QgsExpressionBuilderWidget::isExpressionVaild()
{
return mExpressionVaild;
}

QString QgsExpressionBuilderWidget::getExpressionString()
{
return txtExpressionString->toPlainText();
Expand Down Expand Up @@ -362,6 +368,11 @@ void QgsExpressionBuilderWidget::loadAllValues()
fillFieldValues( fieldIndex, -1 );
}

void QgsExpressionBuilderWidget::setExpressionState( bool state )
{
mExpressionVaild = state;
}

QString QgsExpressionBuilderWidget::loadFunctionHelp( QgsExpressionItem* functionName )
{
if ( functionName == NULL )
Expand Down
5 changes: 5 additions & 0 deletions src/gui/qgsexpressionbuilderwidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ class GUI_EXPORT QgsExpressionBuilderWidget : public QWidget, private Ui::QgsExp
QString helpText = "",
QgsExpressionItem::ItemType type = QgsExpressionItem::ExpressionNode );

bool isExpressionVaild();

public slots:
void on_expressionTree_clicked( const QModelIndex &index );
Expand All @@ -153,6 +154,9 @@ class GUI_EXPORT QgsExpressionBuilderWidget : public QWidget, private Ui::QgsExp
void loadSampleValues();
void loadAllValues();

private slots:
void setExpressionState( bool state );

signals:
/** Emited when the user changes the expression in the widget.
* Users of this widget should connect to this signal to decide if to let the user
Expand All @@ -171,6 +175,7 @@ class GUI_EXPORT QgsExpressionBuilderWidget : public QWidget, private Ui::QgsExp
QMap<QString, QgsExpressionItem*> mExpressionGroups;
QgsFeature mFeature;
QgsExpressionHighlighter* highlighter;
bool mExpressionVaild;
};

#endif // QGSEXPRESSIONBUILDER_H
152 changes: 76 additions & 76 deletions src/ui/qgsexpressionbuilder.ui
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,77 @@
</layout>
</widget>
</item>
<item row="3" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="spacing">
<number>3</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Output preview is generated &lt;br&gt; using the first feature from the layer.</string>
</property>
<property name="text">
<string>Output preview: </string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lblPreview">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<weight>50</weight>
<italic>true</italic>
<bold>false</bold>
<underline>false</underline>
</font>
</property>
<property name="toolTip">
<string>Output preview is generated &lt;br&gt; using the first feature from the layer.</string>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<property name="midLineWidth">
<number>0</number>
</property>
<property name="text">
<string/>
</property>
<property name="scaledContents">
<bool>false</bool>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0">
<widget class="QGroupBox" name="groupBox">
<property name="sizePolicy">
Expand Down Expand Up @@ -420,29 +491,29 @@
</widget>
</item>
<item row="2" column="1">
<layout class="QVBoxLayout" name="verticalLayout">
<layout class="QVBoxLayout" name="opensaveLayout">
<property name="spacing">
<number>3</number>
</property>
<item>
<widget class="QPushButton" name="btnOpen">
<widget class="QPushButton" name="btnSave">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/gis/mActionFileOpen.png</normaloff>:/images/themes/gis/mActionFileOpen.png</iconset>
<normaloff>:/images/themes/default/mActionFileSave.png</normaloff>:/images/themes/default/mActionFileSave.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnSave">
<widget class="QPushButton" name="btnOpen">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/mActionFileSave.png</normaloff>:/images/themes/default/mActionFileSave.png</iconset>
<normaloff>:/images/themes/gis/mActionFileOpen.png</normaloff>:/images/themes/gis/mActionFileOpen.png</iconset>
</property>
</widget>
</item>
Expand All @@ -464,77 +535,6 @@
</layout>
</widget>
</item>
<item row="3" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="spacing">
<number>3</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Output preview is generated &lt;br&gt; using the first feature from the layer.</string>
</property>
<property name="text">
<string>Output preview: </string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lblPreview">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<weight>50</weight>
<italic>true</italic>
<bold>false</bold>
<underline>false</underline>
</font>
</property>
<property name="toolTip">
<string>Output preview is generated &lt;br&gt; using the first feature from the layer.</string>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<property name="midLineWidth">
<number>0</number>
</property>
<property name="text">
<string/>
</property>
<property name="scaledContents">
<bool>false</bool>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources>
Expand Down
352 changes: 71 additions & 281 deletions src/ui/qgsfieldcalculatorbase.ui
Original file line number Diff line number Diff line change
Expand Up @@ -6,40 +6,60 @@
<rect>
<x>0</x>
<y>0</y>
<width>689</width>
<height>538</height>
<width>681</width>
<height>624</height>
</rect>
</property>
<property name="windowTitle">
<string>Field calculator</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QCheckBox" name="mOnlyUpdateSelectedCheckBox">
<property name="text">
<string>Only update selected features</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="mUpdateExistingFieldCheckBox">
<property name="text">
<string>Update existing field</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QComboBox" name="mExistingFieldComboBox"/>
</item>
<item row="1" column="0" colspan="3">
<item row="1" column="0">
<widget class="QGroupBox" name="mNewFieldGroupBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>New field</string>
<string>Create a new field</string>
</property>
<property name="flat">
<bool>true</bool>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
<layout class="QGridLayout">
<property name="sizeConstraint">
<enum>QLayout::SetMinimumSize</enum>
</property>
<property name="leftMargin">
<number>3</number>
</property>
<property name="topMargin">
<number>3</number>
</property>
<property name="rightMargin">
<number>3</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="verticalSpacing">
<number>3</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="mFieldNameLabel">
<property name="text">
Expand Down Expand Up @@ -109,190 +129,44 @@
</layout>
</widget>
</item>
<item row="4" column="0" colspan="3">
<widget class="QGroupBox" name="mOperatorsGroupBox">
<item row="1" column="1">
<widget class="QGroupBox" name="mUpdateExistingGroupBox">
<property name="title">
<string>Operators</string>
<string>Update existing field</string>
</property>
<layout class="QGridLayout" name="gridLayout_1">
<property name="topMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item row="0" column="0">
<widget class="QPushButton" name="mPlusPushButton">
<property name="text">
<string>+</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="mMultiplyPushButton">
<property name="text">
<string>*</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="mSqrtButton">
<property name="text">
<string>sqrt</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QPushButton" name="mSinButton">
<property name="text">
<string>sin</string>
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="QPushButton" name="mTanButton">
<property name="text">
<string>tan</string>
</property>
</widget>
</item>
<item row="0" column="5">
<widget class="QPushButton" name="mACosButton">
<property name="text">
<string>acos</string>
</property>
</widget>
</item>
<item row="0" column="6">
<widget class="QPushButton" name="mOpenBracketPushButton">
<property name="text">
<string>(</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QPushButton" name="mMinusPushButton">
<property name="text">
<string>-</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="mDividePushButton">
<property name="text">
<string>/</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="mExpButton">
<property name="text">
<string>^</string>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QPushButton" name="mCosButton">
<property name="text">
<string>cos</string>
</property>
</widget>
</item>
<item row="1" column="4">
<widget class="QPushButton" name="mASinButton">
<property name="text">
<string>asin</string>
</property>
</widget>
</item>
<item row="1" column="5">
<widget class="QPushButton" name="mATanButton">
<property name="text">
<string>atan</string>
</property>
</widget>
</item>
<item row="1" column="6">
<widget class="QPushButton" name="mCloseBracketPushButton">
<property name="text">
<string>)</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QPushButton" name="mToRealButton">
<property name="text">
<string>to real</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="mToIntButton">
<property name="text">
<string>to int</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QPushButton" name="mToStringButton">
<property name="text">
<string>to string</string>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QPushButton" name="mLengthButton">
<property name="text">
<string>length</string>
</property>
</widget>
</item>
<item row="2" column="4">
<widget class="QPushButton" name="mAreaButton">
<property name="text">
<string>area</string>
</property>
</widget>
</item>
<item row="2" column="5">
<widget class="QPushButton" name="mRowNumButton">
<property name="text">
<string>rownum</string>
</property>
</widget>
</item>
<item row="2" column="6">
<widget class="QPushButton" name="mConcatButton">
<property name="text">
<string>||</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="mFieldCalculatorExpressionLabel">
<property name="text">
<string>Field calculator expression</string>
<property name="flat">
<bool>true</bool>
</property>
<property name="buddy">
<cstring>mExpressionTextEdit</cstring>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QComboBox" name="mExistingFieldComboBox"/>
</item>
</layout>
</widget>
</item>
<item row="6" column="0" colspan="3">
<widget class="QTextEdit" name="mExpressionTextEdit">
<property name="minimumSize">
<size>
<width>0</width>
<height>32</height>
</size>
<item row="2" column="0" colspan="2">
<widget class="QgsExpressionBuilderWidget" name="builder" native="true">
<property name="autoFillBackground">
<bool>false</bool>
</property>
<zorder>mButtonBox</zorder>
<zorder>mButtonBox</zorder>
</widget>
</item>
<item row="7" column="2">
<item row="3" column="0" colspan="2">
<widget class="QDialogButtonBox" name="mButtonBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>3</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
Expand All @@ -301,105 +175,21 @@
</property>
</widget>
</item>
<item row="3" column="0" colspan="3">
<widget class="QFrame" name="frame">
<layout class="QGridLayout" name="gridLayout_3">
<item row="1" column="1" rowspan="2" colspan="2">
<widget class="QFrame" name="mValuesFrame">
<layout class="QGridLayout">
<property name="leftMargin">
<number>9</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>6</number>
</property>
<item row="2" column="2">
<widget class="QPushButton" name="mAllPushButton">
<property name="text">
<string>All</string>
</property>
</widget>
</item>
<item row="0" column="1" rowspan="3">
<widget class="QListWidget" name="mValueListWidget">
<property name="minimumSize">
<size>
<width>0</width>
<height>48</height>
</size>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="1" column="0">
<widget class="QListWidget" name="mFieldsListWidget">
<property name="minimumSize">
<size>
<width>0</width>
<height>48</height>
</size>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Fields</string>
</property>
<property name="textFormat">
<enum>Qt::AutoText</enum>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Values</string>
</property>
</widget>
</item>
</layout>
<zorder>mValuesFrame</zorder>
<zorder>mFieldsListWidget</zorder>
<zorder>label</zorder>
<zorder>label_2</zorder>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>QgsExpressionBuilderWidget</class>
<extends>QWidget</extends>
<header>qgsexpressionbuilderwidget.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>mOutputFieldNameLineEdit</tabstop>
<tabstop>mOutputFieldTypeComboBox</tabstop>
<tabstop>mOuputFieldWidthSpinBox</tabstop>
<tabstop>mOutputFieldPrecisionSpinBox</tabstop>
<tabstop>mValueListWidget</tabstop>
<tabstop>mAllPushButton</tabstop>
<tabstop>mPlusPushButton</tabstop>
<tabstop>mMultiplyPushButton</tabstop>
<tabstop>mSqrtButton</tabstop>
<tabstop>mSinButton</tabstop>
<tabstop>mTanButton</tabstop>
<tabstop>mACosButton</tabstop>
<tabstop>mOpenBracketPushButton</tabstop>
<tabstop>mMinusPushButton</tabstop>
<tabstop>mDividePushButton</tabstop>
<tabstop>mExpButton</tabstop>
<tabstop>mCosButton</tabstop>
<tabstop>mASinButton</tabstop>
<tabstop>mATanButton</tabstop>
<tabstop>mCloseBracketPushButton</tabstop>
<tabstop>mToRealButton</tabstop>
<tabstop>mToIntButton</tabstop>
<tabstop>mToStringButton</tabstop>
<tabstop>mLengthButton</tabstop>
<tabstop>mAreaButton</tabstop>
<tabstop>mRowNumButton</tabstop>
<tabstop>mExpressionTextEdit</tabstop>
<tabstop>mButtonBox</tabstop>
</tabstops>
<resources/>
Expand Down