def testRelations(self):
        """ check that layers are shown in widget model"""
        p = QgsProject.instance()

        # not valid, but doesn't matter for test....
        rel = QgsRelation()
        rel.setId('rel1')
        rel.setName('Relation Number One')
        rel.setReferencingLayer(self.referencingLayer.id())
        rel.setReferencedLayer(self.referencedLayer.id())
        rel.addFieldPair('foreignkey', 'y')

        rel2 = QgsRelation()
        rel2.setId('rel2')
        rel2.setName('Relation Number Two')
        rel2.setReferencingLayer(self.referencingLayer.id())
        rel2.setReferencedLayer(self.referencedLayer.id())
        rel2.addFieldPair('foreignkey', 'y')

        p.relationManager().addRelation(rel)
        p.relationManager().addRelation(rel2)

        w = QgsExpressionBuilderWidget()
        m = w.model()

        # check that relations are shown
        items = m.findItems('Relation Number One', Qt.MatchRecursive)
        self.assertEqual(len(items), 1)
        items = m.findItems('Relation Number Two', Qt.MatchRecursive)
        self.assertEqual(len(items), 1)
    def testLayers(self):
        """ check that layers are shown in widget model"""
        p = QgsProject.instance()
        layer = QgsVectorLayer("Point", "layer1", "memory")
        layer2 = QgsVectorLayer("Point", "layer2", "memory")
        p.addMapLayers([layer, layer2])

        w = QgsExpressionBuilderWidget()
        m = w.model()

        # check that layers are shown
        items = m.findItems('layer1', Qt.MatchRecursive)
        self.assertEqual(len(items), 1)
        items = m.findItems('layer2', Qt.MatchRecursive)
        self.assertEqual(len(items), 1)

        # change project
        p2 = QgsProject()
        layer3 = QgsVectorLayer("Point", "layer3", "memory")
        p2.addMapLayers([layer3])
        w.setProject(p2)
        m = w.model()
        items = m.findItems('layer1', Qt.MatchRecursive)
        self.assertEqual(len(items), 0)
        items = m.findItems('layer2', Qt.MatchRecursive)
        self.assertEqual(len(items), 0)
        items = m.findItems('layer3', Qt.MatchRecursive)
        self.assertEqual(len(items), 1)
 def testFunctionPresent(self):
     """ check through widget model to ensure it is initially populated with functions """
     w = QgsExpressionBuilderWidget()
     m = w.model()
     # check that some standard expression functions are shown
     items = m.findItems('lower', Qt.MatchRecursive)
     self.assertEqual(len(items), 1)
     items = m.findItems('upper', Qt.MatchRecursive)
     self.assertEqual(len(items), 1)
     items = m.findItems('asdasdasda#$@#$', Qt.MatchRecursive)
     self.assertEqual(len(items), 0)
    def testVariables(self):
        """ check through widget model to ensure it is populated with variables """
        w = QgsExpressionBuilderWidget()
        m = w.model()

        s = QgsExpressionContextScope()
        s.setVariable('my_var1', 'x')
        s.setVariable('my_var2', 'y')
        c = QgsExpressionContext()
        c.appendScope(s)

        # check that variables are added when setting context
        w.setExpressionContext(c)
        items = m.findItems('my_var1', Qt.MatchRecursive)
        self.assertEqual(len(items), 1)
        items = m.findItems('my_var2', Qt.MatchRecursive)
        self.assertEqual(len(items), 1)
        items = m.findItems('not_my_var', Qt.MatchRecursive)
        self.assertEqual(len(items), 0)
        # double check that functions are still only there once
        items = m.findItems('lower', Qt.MatchRecursive)
        self.assertEqual(len(items), 1)
        items = m.findItems('upper', Qt.MatchRecursive)
        self.assertEqual(len(items), 1)
    def testVariables(self):
        """ check through widget model to ensure it is populated with variables """
        w = QgsExpressionBuilderWidget()
        m = w.model()

        s = QgsExpressionContextScope()
        s.setVariable('my_var1', 'x')
        s.setVariable('my_var2', 'y')
        c = QgsExpressionContext()
        c.appendScope(s)

        # check that variables are added when setting context
        w.setExpressionContext(c)
        items = m.findItems('my_var1', Qt.MatchRecursive)
        self.assertEqual(len(items), 1)
        items = m.findItems('my_var2', Qt.MatchRecursive)
        self.assertEqual(len(items), 1)
        items = m.findItems('not_my_var', Qt.MatchRecursive)
        self.assertEqual(len(items), 0)
        # double check that functions are still only there once
        items = m.findItems('lower', Qt.MatchRecursive)
        self.assertEqual(len(items), 1)
        items = m.findItems('upper', Qt.MatchRecursive)
        self.assertEqual(len(items), 1)
    def setupUi(self, FieldsCalculator):
        FieldsCalculator.setObjectName(_fromUtf8("FieldsCalculator"))
        FieldsCalculator.resize(681, 681)
        self.gridLayout = QtGui.QGridLayout(FieldsCalculator)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.mNewFieldGroupBox = QtGui.QGroupBox(FieldsCalculator)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.mNewFieldGroupBox.sizePolicy().hasHeightForWidth())
        self.mNewFieldGroupBox.setSizePolicy(sizePolicy)
        self.mNewFieldGroupBox.setFlat(True)
        self.mNewFieldGroupBox.setCheckable(True)
        self.mNewFieldGroupBox.setChecked(True)
        self.mNewFieldGroupBox.setObjectName(_fromUtf8("mNewFieldGroupBox"))
        self.gridlayout = QtGui.QGridLayout(self.mNewFieldGroupBox)
        self.gridlayout.setSizeConstraint(QtGui.QLayout.SetMinimumSize)
        self.gridlayout.setContentsMargins(3, 3, 3, 0)
        self.gridlayout.setVerticalSpacing(3)
        self.gridlayout.setObjectName(_fromUtf8("gridlayout"))
        self.mFieldNameLabel = QtGui.QLabel(self.mNewFieldGroupBox)
        self.mFieldNameLabel.setObjectName(_fromUtf8("mFieldNameLabel"))
        self.gridlayout.addWidget(self.mFieldNameLabel, 0, 0, 1, 1)
        self.mOutputFieldNameLineEdit = QtGui.QLineEdit(self.mNewFieldGroupBox)
        self.mOutputFieldNameLineEdit.setObjectName(_fromUtf8("mOutputFieldNameLineEdit"))
        self.gridlayout.addWidget(self.mOutputFieldNameLineEdit, 0, 1, 1, 3)
        self.mOutputFieldTypeLabel = QtGui.QLabel(self.mNewFieldGroupBox)
        self.mOutputFieldTypeLabel.setObjectName(_fromUtf8("mOutputFieldTypeLabel"))
        self.gridlayout.addWidget(self.mOutputFieldTypeLabel, 1, 0, 1, 1)
        self.mOutputFieldTypeComboBox = QtGui.QComboBox(self.mNewFieldGroupBox)
        self.mOutputFieldTypeComboBox.setObjectName(_fromUtf8("mOutputFieldTypeComboBox"))
        self.gridlayout.addWidget(self.mOutputFieldTypeComboBox, 1, 1, 1, 3)
        self.mOutputFieldWidthLabel = QtGui.QLabel(self.mNewFieldGroupBox)
        self.mOutputFieldWidthLabel.setObjectName(_fromUtf8("mOutputFieldWidthLabel"))
        self.gridlayout.addWidget(self.mOutputFieldWidthLabel, 2, 0, 1, 1)
        self.mOutputFieldWidthSpinBox = QtGui.QSpinBox(self.mNewFieldGroupBox)
        self.mOutputFieldWidthSpinBox.setMinimum(0)
        self.mOutputFieldWidthSpinBox.setProperty("value", 15)
        self.mOutputFieldWidthSpinBox.setObjectName(_fromUtf8("mOutputFieldWidthSpinBox"))
        self.gridlayout.addWidget(self.mOutputFieldWidthSpinBox, 2, 1, 1, 1)
        self.mOutputFieldPrecisionLabel = QtGui.QLabel(self.mNewFieldGroupBox)
        self.mOutputFieldPrecisionLabel.setObjectName(_fromUtf8("mOutputFieldPrecisionLabel"))
        self.gridlayout.addWidget(self.mOutputFieldPrecisionLabel, 2, 2, 1, 1)
        self.mOutputFieldPrecisionSpinBox = QtGui.QSpinBox(self.mNewFieldGroupBox)
        self.mOutputFieldPrecisionSpinBox.setProperty("value", 2)
        self.mOutputFieldPrecisionSpinBox.setObjectName(_fromUtf8("mOutputFieldPrecisionSpinBox"))
        self.gridlayout.addWidget(self.mOutputFieldPrecisionSpinBox, 2, 3, 1, 1)
        self.gridLayout.addWidget(self.mNewFieldGroupBox, 2, 0, 1, 1)
        self.mButtonBox = QtGui.QDialogButtonBox(FieldsCalculator)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(3)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.mButtonBox.sizePolicy().hasHeightForWidth())
        self.mButtonBox.setSizePolicy(sizePolicy)
        self.mButtonBox.setOrientation(QtCore.Qt.Horizontal)
        self.mButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
        self.mButtonBox.setObjectName(_fromUtf8("mButtonBox"))
        self.gridLayout.addWidget(self.mButtonBox, 5, 0, 1, 2)
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.label = QtGui.QLabel(FieldsCalculator)
        self.label.setObjectName(_fromUtf8("label"))
        self.horizontalLayout.addWidget(self.label)
        self.cmbInputLayer = QtGui.QComboBox(FieldsCalculator)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.cmbInputLayer.sizePolicy().hasHeightForWidth())
        self.cmbInputLayer.setSizePolicy(sizePolicy)
        self.cmbInputLayer.setObjectName(_fromUtf8("cmbInputLayer"))
        self.horizontalLayout.addWidget(self.cmbInputLayer)
        self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 1, 2)
        self.mUpdateExistingGroupBox = QtGui.QGroupBox(FieldsCalculator)
        self.mUpdateExistingGroupBox.setFlat(True)
        self.mUpdateExistingGroupBox.setCheckable(True)
        self.mUpdateExistingGroupBox.setChecked(False)
        self.mUpdateExistingGroupBox.setObjectName(_fromUtf8("mUpdateExistingGroupBox"))
        self.verticalLayout = QtGui.QVBoxLayout(self.mUpdateExistingGroupBox)
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.mExistingFieldComboBox = QtGui.QComboBox(self.mUpdateExistingGroupBox)
        self.mExistingFieldComboBox.setObjectName(_fromUtf8("mExistingFieldComboBox"))
        self.verticalLayout.addWidget(self.mExistingFieldComboBox)
        self.gridLayout.addWidget(self.mUpdateExistingGroupBox, 2, 1, 1, 1)
        self.builder = QgsExpressionBuilderWidget(FieldsCalculator)
        self.builder.setAutoFillBackground(False)
        self.builder.setObjectName(_fromUtf8("builder"))
        self.gridLayout.addWidget(self.builder, 3, 0, 1, 2)
        self.horizontalLayout_2 = QtGui.QHBoxLayout()
        self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
        self.label_2 = QtGui.QLabel(FieldsCalculator)
        self.label_2.setObjectName(_fromUtf8("label_2"))
        self.horizontalLayout_2.addWidget(self.label_2)
        self.leOutputFile = QtGui.QLineEdit(FieldsCalculator)
        self.leOutputFile.setObjectName(_fromUtf8("leOutputFile"))
        self.horizontalLayout_2.addWidget(self.leOutputFile)
        self.btnBrowse = QtGui.QToolButton(FieldsCalculator)
        self.btnBrowse.setObjectName(_fromUtf8("btnBrowse"))
        self.horizontalLayout_2.addWidget(self.btnBrowse)
        self.gridLayout.addLayout(self.horizontalLayout_2, 1, 0, 1, 2)
        self.progressBar = QtGui.QProgressBar(FieldsCalculator)
        self.progressBar.setProperty("value", 0)
        self.progressBar.setObjectName(_fromUtf8("progressBar"))
        self.gridLayout.addWidget(self.progressBar, 4, 0, 1, 2)
        self.mFieldNameLabel.setBuddy(self.mOutputFieldNameLineEdit)
        self.mOutputFieldTypeLabel.setBuddy(self.mOutputFieldTypeComboBox)
        self.mOutputFieldWidthLabel.setBuddy(self.mOutputFieldWidthSpinBox)
        self.mOutputFieldPrecisionLabel.setBuddy(self.mOutputFieldPrecisionSpinBox)

        self.retranslateUi(FieldsCalculator)
        QtCore.QObject.connect(self.mButtonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), FieldsCalculator.accept)
        QtCore.QObject.connect(self.mButtonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), FieldsCalculator.reject)
        QtCore.QMetaObject.connectSlotsByName(FieldsCalculator)
        FieldsCalculator.setTabOrder(self.mOutputFieldNameLineEdit, self.mOutputFieldTypeComboBox)
        FieldsCalculator.setTabOrder(self.mOutputFieldTypeComboBox, self.mOutputFieldWidthSpinBox)
        FieldsCalculator.setTabOrder(self.mOutputFieldWidthSpinBox, self.mOutputFieldPrecisionSpinBox)
        FieldsCalculator.setTabOrder(self.mOutputFieldPrecisionSpinBox, self.mButtonBox)
    def setupUi(self, FieldsCalculator):
        FieldsCalculator.setObjectName(_fromUtf8("FieldsCalculator"))
        FieldsCalculator.resize(681, 681)
        self.gridLayout = QtGui.QGridLayout(FieldsCalculator)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.mNewFieldGroupBox = QtGui.QGroupBox(FieldsCalculator)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,
                                       QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.mNewFieldGroupBox.sizePolicy().hasHeightForWidth())
        self.mNewFieldGroupBox.setSizePolicy(sizePolicy)
        self.mNewFieldGroupBox.setFlat(True)
        self.mNewFieldGroupBox.setCheckable(True)
        self.mNewFieldGroupBox.setChecked(True)
        self.mNewFieldGroupBox.setObjectName(_fromUtf8("mNewFieldGroupBox"))
        self.gridlayout = QtGui.QGridLayout(self.mNewFieldGroupBox)
        self.gridlayout.setSizeConstraint(QtGui.QLayout.SetMinimumSize)
        self.gridlayout.setContentsMargins(3, 3, 3, 0)
        self.gridlayout.setVerticalSpacing(3)
        self.gridlayout.setObjectName(_fromUtf8("gridlayout"))
        self.mFieldNameLabel = QtGui.QLabel(self.mNewFieldGroupBox)
        self.mFieldNameLabel.setObjectName(_fromUtf8("mFieldNameLabel"))
        self.gridlayout.addWidget(self.mFieldNameLabel, 0, 0, 1, 1)
        self.mOutputFieldNameLineEdit = QtGui.QLineEdit(self.mNewFieldGroupBox)
        self.mOutputFieldNameLineEdit.setObjectName(
            _fromUtf8("mOutputFieldNameLineEdit"))
        self.gridlayout.addWidget(self.mOutputFieldNameLineEdit, 0, 1, 1, 3)
        self.mOutputFieldTypeLabel = QtGui.QLabel(self.mNewFieldGroupBox)
        self.mOutputFieldTypeLabel.setObjectName(
            _fromUtf8("mOutputFieldTypeLabel"))
        self.gridlayout.addWidget(self.mOutputFieldTypeLabel, 1, 0, 1, 1)
        self.mOutputFieldTypeComboBox = QtGui.QComboBox(self.mNewFieldGroupBox)
        self.mOutputFieldTypeComboBox.setObjectName(
            _fromUtf8("mOutputFieldTypeComboBox"))
        self.gridlayout.addWidget(self.mOutputFieldTypeComboBox, 1, 1, 1, 3)
        self.mOutputFieldWidthLabel = QtGui.QLabel(self.mNewFieldGroupBox)
        self.mOutputFieldWidthLabel.setObjectName(
            _fromUtf8("mOutputFieldWidthLabel"))
        self.gridlayout.addWidget(self.mOutputFieldWidthLabel, 2, 0, 1, 1)
        self.mOutputFieldWidthSpinBox = QtGui.QSpinBox(self.mNewFieldGroupBox)
        self.mOutputFieldWidthSpinBox.setMinimum(0)
        self.mOutputFieldWidthSpinBox.setProperty("value", 15)
        self.mOutputFieldWidthSpinBox.setObjectName(
            _fromUtf8("mOutputFieldWidthSpinBox"))
        self.gridlayout.addWidget(self.mOutputFieldWidthSpinBox, 2, 1, 1, 1)
        self.mOutputFieldPrecisionLabel = QtGui.QLabel(self.mNewFieldGroupBox)
        self.mOutputFieldPrecisionLabel.setObjectName(
            _fromUtf8("mOutputFieldPrecisionLabel"))
        self.gridlayout.addWidget(self.mOutputFieldPrecisionLabel, 2, 2, 1, 1)
        self.mOutputFieldPrecisionSpinBox = QtGui.QSpinBox(
            self.mNewFieldGroupBox)
        self.mOutputFieldPrecisionSpinBox.setProperty("value", 2)
        self.mOutputFieldPrecisionSpinBox.setObjectName(
            _fromUtf8("mOutputFieldPrecisionSpinBox"))
        self.gridlayout.addWidget(self.mOutputFieldPrecisionSpinBox, 2, 3, 1,
                                  1)
        self.gridLayout.addWidget(self.mNewFieldGroupBox, 2, 0, 1, 1)
        self.mButtonBox = QtGui.QDialogButtonBox(FieldsCalculator)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
                                       QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(3)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.mButtonBox.sizePolicy().hasHeightForWidth())
        self.mButtonBox.setSizePolicy(sizePolicy)
        self.mButtonBox.setOrientation(QtCore.Qt.Horizontal)
        self.mButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel
                                           | QtGui.QDialogButtonBox.Ok)
        self.mButtonBox.setObjectName(_fromUtf8("mButtonBox"))
        self.gridLayout.addWidget(self.mButtonBox, 5, 0, 1, 2)
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.label = QtGui.QLabel(FieldsCalculator)
        self.label.setObjectName(_fromUtf8("label"))
        self.horizontalLayout.addWidget(self.label)
        self.cmbInputLayer = QtGui.QComboBox(FieldsCalculator)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
                                       QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.cmbInputLayer.sizePolicy().hasHeightForWidth())
        self.cmbInputLayer.setSizePolicy(sizePolicy)
        self.cmbInputLayer.setObjectName(_fromUtf8("cmbInputLayer"))
        self.horizontalLayout.addWidget(self.cmbInputLayer)
        self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 1, 2)
        self.mUpdateExistingGroupBox = QtGui.QGroupBox(FieldsCalculator)
        self.mUpdateExistingGroupBox.setFlat(True)
        self.mUpdateExistingGroupBox.setCheckable(True)
        self.mUpdateExistingGroupBox.setChecked(False)
        self.mUpdateExistingGroupBox.setObjectName(
            _fromUtf8("mUpdateExistingGroupBox"))
        self.verticalLayout = QtGui.QVBoxLayout(self.mUpdateExistingGroupBox)
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.mExistingFieldComboBox = QtGui.QComboBox(
            self.mUpdateExistingGroupBox)
        self.mExistingFieldComboBox.setObjectName(
            _fromUtf8("mExistingFieldComboBox"))
        self.verticalLayout.addWidget(self.mExistingFieldComboBox)
        self.gridLayout.addWidget(self.mUpdateExistingGroupBox, 2, 1, 1, 1)
        self.builder = QgsExpressionBuilderWidget(FieldsCalculator)
        self.builder.setAutoFillBackground(False)
        self.builder.setObjectName(_fromUtf8("builder"))
        self.gridLayout.addWidget(self.builder, 3, 0, 1, 2)
        self.horizontalLayout_2 = QtGui.QHBoxLayout()
        self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
        self.label_2 = QtGui.QLabel(FieldsCalculator)
        self.label_2.setObjectName(_fromUtf8("label_2"))
        self.horizontalLayout_2.addWidget(self.label_2)
        self.leOutputFile = QtGui.QLineEdit(FieldsCalculator)
        self.leOutputFile.setObjectName(_fromUtf8("leOutputFile"))
        self.horizontalLayout_2.addWidget(self.leOutputFile)
        self.btnBrowse = QtGui.QToolButton(FieldsCalculator)
        self.btnBrowse.setObjectName(_fromUtf8("btnBrowse"))
        self.horizontalLayout_2.addWidget(self.btnBrowse)
        self.gridLayout.addLayout(self.horizontalLayout_2, 1, 0, 1, 2)
        self.progressBar = QtGui.QProgressBar(FieldsCalculator)
        self.progressBar.setProperty("value", 0)
        self.progressBar.setObjectName(_fromUtf8("progressBar"))
        self.gridLayout.addWidget(self.progressBar, 4, 0, 1, 2)
        self.mFieldNameLabel.setBuddy(self.mOutputFieldNameLineEdit)
        self.mOutputFieldTypeLabel.setBuddy(self.mOutputFieldTypeComboBox)
        self.mOutputFieldWidthLabel.setBuddy(self.mOutputFieldWidthSpinBox)
        self.mOutputFieldPrecisionLabel.setBuddy(
            self.mOutputFieldPrecisionSpinBox)

        self.retranslateUi(FieldsCalculator)
        QtCore.QObject.connect(self.mButtonBox,
                               QtCore.SIGNAL(_fromUtf8("accepted()")),
                               FieldsCalculator.accept)
        QtCore.QObject.connect(self.mButtonBox,
                               QtCore.SIGNAL(_fromUtf8("rejected()")),
                               FieldsCalculator.reject)
        QtCore.QMetaObject.connectSlotsByName(FieldsCalculator)
        FieldsCalculator.setTabOrder(self.mOutputFieldNameLineEdit,
                                     self.mOutputFieldTypeComboBox)
        FieldsCalculator.setTabOrder(self.mOutputFieldTypeComboBox,
                                     self.mOutputFieldWidthSpinBox)
        FieldsCalculator.setTabOrder(self.mOutputFieldWidthSpinBox,
                                     self.mOutputFieldPrecisionSpinBox)
        FieldsCalculator.setTabOrder(self.mOutputFieldPrecisionSpinBox,
                                     self.mButtonBox)
Example #8
0
# coding: utf-8
from PyQt4.QtGui import QWidget
from qgis.gui import QgsExpressionBuilderWidget

w = QWidget()
expression_builder_widget = QgsExpressionBuilderWidget(w)

w.show()
    def testStoredExpressions(self):
        """Check that expressions can be stored and retrieved"""

        w = QgsExpressionBuilderWidget()

        w.saveToUserExpressions('Stored Expression Number One', '"field_one" = 123', "An humble expression")
        items = w.findExpressions('Stored Expression Number One')
        self.assertEqual(len(items), 1)
        exp = items[0]
        self.assertEqual(exp.getExpressionText(), '"field_one" = 123')

        # Add another one with the same name (overwrite)
        w.saveToUserExpressions('Stored Expression Number One', '"field_two" = 456', "An even more humble expression")
        items = w.findExpressions('Stored Expression Number One')
        self.assertEqual(len(items), 1)
        exp = items[0]
        self.assertEqual(exp.getExpressionText(), '"field_two" = 456')

        # Reload by creating a new widget
        w = QgsExpressionBuilderWidget()
        items = w.findExpressions('Stored Expression Number One')
        self.assertEqual(len(items), 1)
        exp = items[0]
        self.assertEqual(exp.getExpressionText(), '"field_two" = 456')

        # Test removal
        w.removeFromUserExpressions('Stored Expression Number One')
        items = w.findExpressions('Stored Expression Number One')
        self.assertEqual(len(items), 0)
    def testValuesList(self):
        """
        Test the content of values list widget
        """

        w = QgsExpressionBuilderWidget()

        valuesList = w.findChild(QListView, 'mValuesListView')
        self.assertTrue(valuesList)

        valuesModel = valuesList.model()
        self.assertTrue(valuesModel)

        layer = QgsVectorLayer(
            "None?field=myarray:string[]&field=mystr:string&field=myint:integer&field=myintarray:int[]&field=mydoublearray:double[]",
            "arraylayer", "memory")

        self.assertTrue(layer.isValid())

        # add some features, one has invalid geometry
        pr = layer.dataProvider()
        f1 = QgsFeature(1)
        f1.setAttributes([["one 'item'", 'B'], "another 'item'", 0, [1, 2], [1.1, 2.1]])
        f2 = QgsFeature(2)
        f2.setAttributes([['C'], "", 1, [3, 4], [-0.1, 2.0]])
        f3 = QgsFeature(3)
        f3.setAttributes([[], "test", 2, [], []])
        f4 = QgsFeature(4)
        self.assertTrue(pr.addFeatures([f1, f2, f3, f4]))

        w.setLayer(layer)

        # test string array
        items = w.expressionTree().findExpressions("myarray")
        self.assertEqual(len(items), 1)
        currentIndex = w.expressionTree().model().mapFromSource(items[0].index())
        self.assertTrue(currentIndex.isValid())
        w.expressionTree().setCurrentIndex(currentIndex)
        self.assertTrue(w.expressionTree().currentItem())

        w.loadAllValues()

        datas = sorted([(valuesModel.data(valuesModel.index(i, 0), Qt.DisplayRole), valuesModel.data(valuesModel.index(i, 0), Qt.UserRole + 1)) for i in range(4)])
        self.assertEqual(datas, [(" [array()]", "array()"),
                                 ("C [array('C')]", "array('C')"),
                                 ("NULL [NULL]", "NULL"),
                                 ("one 'item', B [array('one ''item''', 'B')]", "array('one ''item''', 'B')")])

        # test string
        items = w.expressionTree().findExpressions("mystr")
        self.assertEqual(len(items), 1)
        currentIndex = w.expressionTree().model().mapFromSource(items[0].index())
        self.assertTrue(currentIndex.isValid())
        w.expressionTree().setCurrentIndex(currentIndex)
        self.assertTrue(w.expressionTree().currentItem())

        w.loadAllValues()

        datas = sorted([(valuesModel.data(valuesModel.index(i, 0), Qt.DisplayRole), valuesModel.data(valuesModel.index(i, 0), Qt.UserRole + 1)) for i in range(4)])

        self.assertEqual(datas, [("", "''"),
                                 ("NULL [NULL]", "NULL"),
                                 ("another 'item'", "'another ''item'''"),
                                 ("test", "'test'")])

        # test int
        items = w.expressionTree().findExpressions("myint")
        self.assertEqual(len(items), 1)
        currentIndex = w.expressionTree().model().mapFromSource(items[0].index())
        self.assertTrue(currentIndex.isValid())
        w.expressionTree().setCurrentIndex(currentIndex)
        self.assertTrue(w.expressionTree().currentItem())

        w.loadAllValues()

        datas = sorted([(valuesModel.data(valuesModel.index(i, 0), Qt.DisplayRole), valuesModel.data(valuesModel.index(i, 0), Qt.UserRole + 1)) for i in range(4)])

        self.assertEqual(datas, [("0", "0"),
                                 ("1", "1"),
                                 ("2", "2"),
                                 ("NULL [NULL]", "NULL")])

        # test int array
        items = w.expressionTree().findExpressions("myintarray")
        self.assertEqual(len(items), 1)
        currentIndex = w.expressionTree().model().mapFromSource(items[0].index())
        self.assertTrue(currentIndex.isValid())
        w.expressionTree().setCurrentIndex(currentIndex)
        self.assertTrue(w.expressionTree().currentItem())

        w.loadAllValues()

        datas = sorted([(valuesModel.data(valuesModel.index(i, 0), Qt.DisplayRole), valuesModel.data(valuesModel.index(i, 0), Qt.UserRole + 1)) for i in range(4)])
        self.assertEqual(datas, [(" [array()]", "array()"),
                                 ("1, 2 [array(1, 2)]", "array(1, 2)"),
                                 ("3, 4 [array(3, 4)]", "array(3, 4)"),
                                 ("NULL [NULL]", "NULL"),
                                 ])

        # test double array
        items = w.expressionTree().findExpressions("mydoublearray")
        self.assertEqual(len(items), 1)
        currentIndex = w.expressionTree().model().mapFromSource(items[0].index())
        self.assertTrue(currentIndex.isValid())
        w.expressionTree().setCurrentIndex(currentIndex)
        self.assertTrue(w.expressionTree().currentItem())

        w.loadAllValues()

        datas = sorted([(valuesModel.data(valuesModel.index(i, 0), Qt.DisplayRole), valuesModel.data(valuesModel.index(i, 0), Qt.UserRole + 1)) for i in range(4)])
        self.assertEqual(datas, [(" [array()]", "array()"),
                                 ("-0.1, 2 [array(-0.1, 2)]", "array(-0.1, 2)"),
                                 ("1.1, 2.1 [array(1.1, 2.1)]", "array(1.1, 2.1)"),
                                 ("NULL [NULL]", "NULL"),
                                 ])