示例#1
0
 def setUp(self):
     self.parent = QWidget()
     self.parent.setLayout(QGridLayout())
     self.layer = Mock()
     self.layer.pendingFields.return_value = []
     self.canvas = self.getCavnasWithFakeLayers()
     self.mocksettings = Mock()
     self.binder = FormBinder(self.layer,self.parent, \
                              self.canvas, self.mocksettings)
示例#2
0
    def openDialog(self, formmodule, feature, layer, forupdate, mandatory_fields=True):
        self.update = forupdate
        self.dialog = formmodule.formInstance(self.iface.mainWindow())
        self.layer = layer
        self.feature = feature

        self.settings = formmodule.settings()

        self.binder = FormBinder(layer, self.dialog, self.canvas,\
                                 self.settings, formmodule, formmodule.db())
        self.binder.beginSelectFeature.connect(self.selectingFromMap)
        self.binder.endSelectFeature.connect(self.featureSelected)
        self.binder.bindFeature(self.feature, mandatory_fields, \
                                self.update)
        self.binder.bindSelectButtons()

        buttonbox = self.dialog.findChild(QDialogButtonBox)

        if mandatory_fields:
            buttonbox.accepted.connect(self.validateForm)
        else:
            buttonbox.accepted.connect(self.dialogAccept)
            buttonbox.accepted.connect(self.accepted)

        buttonbox.rejected.connect(self.rejected)
        buttonbox.rejected.connect(self.dialog.reject)
        buttonbox.rejected.connect(self.deleteDialog)

        self.dialog.setModal(True)
        
        if self.settings.value("fullscreen", False).toBool():
            self.dialog.showFullScreen()
        self.dialog.show()
示例#3
0
    def openDialog(self, formmodule, feature, layer, forupdate, mandatory_fields=True):
        """
        Opens a form for the given feature

        @refactor: This really needs to be cleaned up.
        """
        self.update = forupdate
        self.dialog = formmodule.formInstance(self.iface.mainWindow())
        self.layer = layer
        self.feature = feature

        self.settings = formmodule.settings()

        self.binder = FormBinder(layer, self.dialog, self.canvas,\
                                 self.settings, formmodule)
        self.binder.beginSelectFeature.connect(self.selectingFromMap)
        self.binder.endSelectFeature.connect(self.featureSelected)
        self.binder.bindFeature(self.feature, mandatory_fields, \
                                self.update)
        self.binder.bindSelectButtons()

        buttonbox = self.dialog.findChild(QDialogButtonBox)
        try:
            buttonbox.accepted.disconnect()
            buttonbox.rejected.disconnect()
        except TypeError:
            # If there are no signals to disconnect then we get a type error.
            pass

        if mandatory_fields:
            buttonbox.accepted.connect(self.validateForm)
        else:
            buttonbox.accepted.connect(self.dialogAccept)
            buttonbox.accepted.connect(self.accepted)

        buttonbox.rejected.connect(self.rejected)
        buttonbox.rejected.connect(self.dialog.reject)
        buttonbox.rejected.connect(self.deleteDialog)

        self.dialog.setModal(True)
        
        if self.settings.get("fullscreen", False):
            self.dialog.showFullScreen()
        else:
            self.dialog.show()
示例#4
0
 def setUp(self):
     self.layer = Mock()
     self.layer.pendingFields.return_value = []
     self.binder = FormBinder(self.layer,None,None,None)
示例#5
0
class testFormBinderUnBinding(TestCase):
    def setUp(self):
        self.layer = Mock()
        self.layer.pendingFields.return_value = []
        self.binder = FormBinder(self.layer,None,None,None)
        
    def test_unbind_lineedit(self):
        w = QLineEdit()
        w.setText("lineedit")
        self.binder.fieldtocontrol = {0:w}
        mock_feature = Mock()
        self.binder.unbindFeature(mock_feature)
        mock_feature.changeAttribute.assert_called_once_with(0, "lineedit" )

    def test_unbind_textedit(self):
        w = QTextEdit()
        w.setText("textedit")
        self.binder.fieldtocontrol = {0:w}
        mock_feature = Mock()
        self.binder.unbindFeature(mock_feature)
        mock_feature.changeAttribute.assert_called_once_with(0, "textedit" )
        
    def test_unbind_calendar(self):
        w = QCalendarWidget()
        w.setSelectedDate(QDate.fromString("2012-06-12", Qt.ISODate ))
        self.binder.fieldtocontrol = {0:w}
        mock_feature = Mock()
        self.binder.unbindFeature(mock_feature)
        mock_feature.changeAttribute.assert_called_once_with(0, "2012-06-12" )

    def test_unbind_combobox(self):
        w = QComboBox()
        w.addItems(['', 'Hello World', 'Hello', 'World'])
        w.setCurrentIndex(1)
        self.binder.fieldtocontrol = {0:w}
        mock_feature = Mock()
        self.binder.unbindFeature(mock_feature)
        mock_feature.changeAttribute.assert_called_once_with(0, "Hello World" )

    def test_unbind_doublespin(self):
        w = QDoubleSpinBox()
        w.setValue(2.12)
        self.binder.fieldtocontrol = {0:w}
        mock_feature = Mock()
        self.binder.unbindFeature(mock_feature)
        mock_feature.changeAttribute.assert_called_once_with(0, 2.12 )

    def test_unbind_singlespin(self):
        w = QSpinBox()
        w.setValue(2)
        self.binder.fieldtocontrol = {0:w}
        mock_feature = Mock()
        self.binder.unbindFeature(mock_feature)
        mock_feature.changeAttribute.assert_called_once_with(0, 2 )

    def test_unbind_datetimeedit(self):
        w = QDateTimeEdit()
        w.setDateTime(QDateTime(2012,06,12,0,1,0,0))
        self.binder.fieldtocontrol = {0:w}
        mock_feature = Mock()
        self.binder.unbindFeature(mock_feature)
        mock_feature.changeAttribute.assert_called_once_with(0, "2012-06-12T00:01:00" )

    def test_unbind_checkbox(self):
        w = QCheckBox()
        w2 = QCheckBox()
        w.setChecked(True)
        w2.setChecked(False)
        self.binder.fieldtocontrol = {0:w, 1:w2}
        mock_feature = Mock()
        self.binder.unbindFeature(mock_feature)
        calls = [call(0,1), call(1,0)]
        mock_feature.changeAttribute.assert_has_calls(calls,any_order=True)

    def test_unbind_groupbox(self):
        w = QGroupBox()
        w2 = QGroupBox()
        w.setCheckable(True)
        w2.setCheckable(True)
        w.setChecked(True)
        w2.setChecked(False)
        self.binder.fieldtocontrol = {0:w, 1:w2}
        mock_feature = Mock()
        self.binder.unbindFeature(mock_feature)
        calls = [call(0,1), call(1,0)]
        mock_feature.changeAttribute.assert_has_calls(calls,any_order=True)
示例#6
0
class testFormBinderBinding(TestCase):

    def getCavnasWithFakeLayers(self):
        self.layer1 = Mock()
        self.layer1.name.return_value = 'layer1'
        self.layer2 = Mock()
        self.layer2.name.return_value = 'layer2'
        self.layer3 = Mock()
        self.layer3.name.return_value = 'layer3'
        self.layer4 = Mock()
        self.layer4.name.return_value = 'layer4'
        canvas = Mock()
        canvas.layers.return_value = [self.layer1,self.layer2,
                                      self.layer3, self.layer4]
        return canvas
    
    def setUp(self):
        self.parent = QWidget()
        self.parent.setLayout(QGridLayout())
        self.layer = Mock()
        self.layer.pendingFields.return_value = []
        self.canvas = self.getCavnasWithFakeLayers()
        self.mocksettings = Mock()
        self.binder = FormBinder(self.layer,self.parent, \
                                 self.canvas, self.mocksettings)

    def test_bind_list_widget(self):
        w = QListWidget()
        w.addItems([QString('Hello World'), QString('Hello'), QString('World')])
        value = QVariant('Hello')
        self.assertEqual(w.currentItem(), None)
        self.binder.bindValueToControl(w, value)
        self.assertEqual(w.currentItem().text(), value.toString())

    def test_fail_bind_list_widget(self):
        w = QListWidget()
        w.addItems([QString('Hello World')])
        value = QVariant('Hello')
        self.assertEqual(w.currentItem(), None)
        self.binder.bindValueToControl(w, value)
        self.assertEqual(w.currentItem(), None)

    def test_bind_calender_widget(self):
        w = QCalendarWidget()
        # Set the date to something other then today which is the default
        w.setSelectedDate(QDate(2012,5,04))
        value = QVariant('2012-07-04')
        expected = QDate(2012,07,04)
        self.assertNotEqual(w.selectedDate(),expected)
        self.binder.bindValueToControl(w, value)
        self.assertEqual(w.selectedDate(), expected)

    def test_bind_lineedit_widget(self):
        w = QLineEdit()
        value = QVariant('Hello World')
        expected = 'Hello World'
        self.assertNotEqual(w.text(), expected)
        self.binder.bindValueToControl(w, value)
        self.assertEqual(w.text(), expected)

    def test_bind_textedit_widget(self):
        w = QTextEdit()
        value = QVariant('Hello World')
        expected = 'Hello World'
        self.assertNotEqual(w.toPlainText(), expected)
        self.binder.bindValueToControl(w, value)
        self.assertEqual(w.toPlainText(), expected)

    def test_bind_checkbox_widget(self):
        values = [(1,True),
                  ('True',True),
                  ('true',True),
                  (0,False),
                  ('False',False),
                  ('false',False)]
        w = QCheckBox()
        for string, expected in values:
            value = QVariant(string)
            self.binder.bindValueToControl(w, value)
            self.assertEqual(w.isChecked(), expected)

    def test_bind_groupbox_widget(self):
        values = [(1,True),
                  ('True',True),
                  ('true',True),
                  (0,False),
                  ('False',False),
                  ('false',False)]
        w = QGroupBox()
        w.setCheckable(True)
        for string, expected in values:
            value = QVariant(string)
            self.binder.bindValueToControl(w, value)
            self.assertEqual(w.isChecked(),expected)
            
    def test_bind_handles_uncheckable_groupbox(self):
        w = QGroupBox()
        w.setCheckable(False)
        self.binder.bindValueToControl(w, QVariant(True))
        self.assertFalse(w.isChecked())

    def test_bind_combox_widget(self):
        self.mocksettings.value.return_value = QVariant()
        w = QComboBox()
        w.addItems([QString('Hello World'), QString('Hello'), QString('World')])
        value = QVariant('Hello')
        self.assertNotEqual(w.currentText(), value.toString())
        self.binder.bindValueToControl(w, value)
        self.assertEqual(w.currentText(), value.toString())

    def test_bind_combox_widget_from_settings(self):
        self.mocksettings.value.return_value = QVariant("Hello,World,Test")
        w = QComboBox()
        value = QVariant('Hello')
        self.assertNotEqual(w.currentText(), value.toString())
        self.binder.bindValueToControl(w, value)
        self.assertEqual(w.currentText(), value.toString())

    def test_fail_bind_combox_widget(self):
        self.mocksettings.value.return_value = QVariant()
        w = QComboBox()
        w.addItems(['', 'Hello World', 'Hello', 'World'])
        value = QVariant('balh')
        self.assertEqual(w.currentText(), '')
        self.binder.bindValueToControl(w, value)
        self.assertEqual(w.currentText(), '')

    def test_bind_doublespin_widget(self):
        w = QDoubleSpinBox()
        value = QVariant('2.13')
        self.assertNotEqual(w.value(), 2.13)
        self.binder.bindValueToControl(w, value)
        self.assertEqual(w.value(), 2.13)

    def test_fail_bind_doubledouble_widget(self):
        w = QDoubleSpinBox()
        value = QVariant('blah')
        self.assertEqual(w.value(), 0.00)
        self.binder.bindValueToControl(w, value)
        self.assertEqual(w.value(), 0.00)

    def test_bind_singlespin_widget(self):
        w = QSpinBox()
        value = QVariant('2')
        self.assertNotEqual(w.value(), 2)
        self.binder.bindValueToControl(w, value)
        self.assertEqual(w.value(), 2)

    def test_fail_bind_singlespin_widget(self):
        w = QSpinBox()
        value = QVariant('blah')
        self.assertEqual(w.value(), 0.00)
        self.binder.bindValueToControl(w, value)
        self.assertEqual(w.value(), 0.00)

    def test_bind_datetimeedit_widget(self):
        w = QDateTimeEdit()
        value = QVariant('2012-12-05T00:12:00')
        expected = QDateTime(2012,12,05,00,12,00)
        self.assertNotEqual(w.dateTime(), expected)
        self.binder.bindValueToControl(w, value)
        self.assertEqual(w.dateTime(), expected)

    @patch.object(FormBinder, 'pickDateTime')
    def test_bind_datetimeedit_picker(self, mock_method):
        widget = QWidget()
        l = QGridLayout(widget)
        b = QPushButton()
        w = QDateTimeEdit()
        b.setObjectName('testdatetime_pick')
        w.setObjectName('testdatetime')
        l.addWidget(b)
        l.addWidget(w)
        self.binder.bindValueToControl(w, QVariant())
        b.click()
        self.assertTrue(mock_method.called_with(w))

    @patch.object(FormBinder, 'pickDateTime')
    def test_bind_more_then_one_datetimeedit_picker(self, mock_method):
        widget = QWidget()
        l = QGridLayout(widget)
        b = QPushButton()
        w = QDateTimeEdit()
        b.setObjectName('testdatetime_pick')
        w.setObjectName('testdatetime')
        l.addWidget(b)
        l.addWidget(w)
        widget2 = QWidget()
        l2 = QGridLayout(widget2)
        b2 = QPushButton()
        w2 = QDateTimeEdit()
        b2.setObjectName('testdatetime2_pick')
        w2.setObjectName('testdatetime2')
        l2.addWidget(b2)
        l2.addWidget(w2)
        self.binder.bindValueToControl(w, QVariant())
        self.binder.bindValueToControl(w2, QVariant())
        b.click()
        mock_method.assert_called_with(w,"DateTime")
        b2.click()
        mock_method.assert_called_with(w2,"DateTime")

    @patch.object(FormBinder, 'loadDrawingTool')
    def test_bind_drawing_tool(self, mock_loadDrawingTool):
        button = QPushButton()
        button.setText("Drawing")
        self.binder.bindValueToControl(button, QVariant())
        button.click()
        self.assertTrue(mock_loadDrawingTool.called)

    def test_bindValueToControl_raises_exception_on_fail(self):
        w = QWidget()
        self.assertRaises(BindingError,
                         self.binder.bindValueToControl, w, QVariant())

    def test_getBuddy_returns_label(self):
        w = QLineEdit()
        w.setObjectName('test')
        l = QLabel()
        l.setObjectName('test_label')
        self.parent.layout().addWidget(w)
        self.parent.layout().addWidget(l)
        
        buddy = self.binder.getBuddy(w)
        self.assertEqual(buddy, l)

    def test_getBuddy_returns_widget_if_label_not_found(self):
        w = QLineEdit()
        w.setObjectName('test')
        self.parent.layout().addWidget(w)
        buddy = self.binder.getBuddy(w)
        self.assertEqual(buddy, w)
        
    def test_mandatory_fields_should_be_added_to_mandatory_group(self):
        w = QLineEdit()
        w.setObjectName("lineedit")
        w.setProperty("mandatory",True)
        self.parent.layout().addWidget(w)
        mock_feature = Mock()
        field = Mock()
        field.name.return_value = "lineedit"
        mock_feature.attributeMap.return_value = {0:QVariant('Hello')}
        self.binder.fields = [field]

        buddy = self.binder.bindFeature(mock_feature)
        self.assertTrue((w,w) in self.binder.mandatory_group.widgets)

    def test_mandatory_fields_should_be_added_to_mandatory_group_with_buddy(self):
        w = QLineEdit()
        w.setObjectName('lineedit')
        w.setProperty("mandatory",True)
        l = QLabel()
        l.setObjectName('lineedit_label')
        self.parent.layout().addWidget(w)
        self.parent.layout().addWidget(l)
        mock_feature = Mock()
        field = Mock()
        field.name.return_value = "lineedit"
        mock_feature.attributeMap.return_value = {0:QVariant('Hello')}
        self.binder.fields = [field]

        buddy = self.binder.bindFeature(mock_feature)
        self.assertTrue((w,l) in self.binder.mandatory_group.widgets)

    def test_nonmandatory_fields_should_not_be_added_to_mandatory_group(self):
        w = QLineEdit()
        w.setObjectName("lineedit")
        w.setProperty("mandatory",False)
        self.parent.layout().addWidget(w)
        mock_feature = Mock()
        field = Mock()
        field.name.return_value = "lineedit"
        mock_feature.attributeMap.return_value = {0:QVariant('Hello')}
        self.binder.fields = [field]

        buddy = self.binder.bindFeature(mock_feature)
        self.assertTrue(not (w,w) in self.binder.mandatory_group.widgets)

    def test_bindByName_binds_by_name(self):
        w = QLineEdit()
        w.setObjectName("lineedit")
        self.parent.layout().addWidget(w)
        self.binder.bindByName("lineedit", QVariant("Hello"))
        self.assertEqual(w.text(),"Hello")

    def test_bindByName_throws_error_on_no_control_found(self):
        w = QLineEdit()
        w.setObjectName("lineedit")
        self.parent.layout().addWidget(w)
        self.assertRaises(ControlNotFound, self.binder.bindByName, \
                          "balh", QVariant("Hello") )

    def test_getControl_raise_ControlNotFound_on_missing_control(self):
        self.assertRaises(ControlNotFound, self.binder.getControl, \
                          "balh")

    def test_getControl_returns_control(self):
        w = QLineEdit()
        w.setObjectName("lineedit")
        self.parent.layout().addWidget(w)
        self.assertEqual(self.binder.getControl("lineedit"), w)

    def test_getControl_returns_control_of_correct_type(self):
        w = QLabel()
        w.setObjectName("lineedit")
        self.parent.layout().addWidget(w)
        control = self.binder.getControl("lineedit",control_type=QLabel)
        self.assertEqual(control, w)
        self.assertTrue(type(control) is QLabel)

    def test_bindSelectButtons_enabled_if_control_with_same_name(self):
        tool = QToolButton()
        tool.setObjectName('field_mapselect')
        tool.setProperty('from_layer','layer1')
        tool.setProperty('using_column','layer1')
        l = QLineEdit()
        l.setObjectName('field')
        self.parent.layout().addWidget(tool)
        self.parent.layout().addWidget(l)
        self.binder.bindSelectButtons()
        self.assertTrue(tool.isEnabled())

    def test_bindSelectButtons_disabled_if_no_control_found(self):
        tool = QToolButton()
        tool.setObjectName('field_mapselect')
        l = QLineEdit()
        l.setObjectName('balh')
        self.parent.layout().addWidget(tool)
        self.parent.layout().addWidget(l)
        self.binder.bindSelectButtons()
        self.assertFalse(tool.isEnabled())

    def test_bindSelectButtons_disabled_if_missing_settings(self):
        """ _mapselect buttons must have following properties
         - from_layer (string)
         - using_column (string)

         Optional properties

         - message (default to 'Please select a feature in the map')
         - searchradius (default to 5)

        """
        tool = QToolButton()
        tool.setObjectName('field_mapselect')
        tool.setProperty('from_layer','')
        l = QLineEdit()
        l.setObjectName('field')
        self.parent.layout().addWidget(tool)
        self.parent.layout().addWidget(l)
        self.binder.bindSelectButtons()
        self.assertFalse(tool.isEnabled())

    def test_bindSelectButtons_enabled_if_all_settings(self):
        tool = QToolButton()
        tool.setObjectName('field_mapselect')
        tool.setProperty('from_layer','layer1')
        tool.setProperty('using_column','')
        l = QLineEdit()
        l.setObjectName('field')
        self.parent.layout().addWidget(tool)
        self.parent.layout().addWidget(l)
        self.binder.bindSelectButtons()
        self.assertTrue(tool.isEnabled())

    def test_bindSelectButtons_disabled_if_layer_not_found(self):
        tool = QToolButton()
        tool.setObjectName('field_mapselect')
        tool.setProperty('from_layer','Test')
        tool.setProperty('using_column','Test')
        l = QLineEdit()
        l.setObjectName('field')
        self.parent.layout().addWidget(tool)
        self.parent.layout().addWidget(l)
        self.binder.bindSelectButtons()
        self.assertFalse(tool.isEnabled())
        
    @patch.object(FormBinder, 'selectFeatureClicked')
    def test_map_select_tool_called_with_correct_args(self, mock_method):
        tool = QToolButton()
        tool.setObjectName('field_mapselect')
        tool.setProperty('from_layer','layer1')
        tool.setProperty('using_column','column1')
        tool.setProperty('message','test message')
        tool.setProperty('radius', 10)
        l = QLineEdit()
        l.setObjectName('field')
        self.parent.layout().addWidget(tool)
        self.parent.layout().addWidget(l)
        self.binder.bindSelectButtons()
        tool.click()
        mock_method.assert_called_with(self.layer1,'column1','test message',10,\
                                       'field')

    @patch.object(FormBinder, 'selectFeatureClicked')
    def test_map_select_tool_called_with_correct_args_defaults(self, mock_method):
        tool = QToolButton()
        tool.setObjectName('field_mapselect')
        tool.setProperty('from_layer','layer1')
        tool.setProperty('using_column','column1')
        l = QLineEdit()
        l.setObjectName('field')
        self.parent.layout().addWidget(tool)
        self.parent.layout().addWidget(l)
        self.binder.bindSelectButtons()
        tool.click()
        mock_method.assert_called_with(self.layer1,'column1', \
                                       'Please select a feature in the map', 5, \
                                       'field')

    def test_combobox_add_value_if_not_exists_in_settings_and_combo(self):
        self.mocksettings.value.return_value = QVariant("1,2,3,4,5")
        w = QComboBox()
        w.setObjectName('comboname')
        w.setEditable( True )
        w.addItems(['b', 'c', 'd'])
        newitem = 'Hello World'
        self.binder.saveComboValues(w, newitem)
        self.mocksettings.setValue.assert_called_with("comboname",'1,2,3,4,5,Hello World')

    def test_combobox_dont_add_value_if_exists_in_settings_or_combo(self):
        self.mocksettings.value.return_value = QVariant("1,2,3,4,5")
        w = QComboBox()
        w.setObjectName('comboname')
        w.setEditable( True )
        w.addItems(['b', 'c', 'd'])
        newitem = 'b'
        self.binder.saveComboValues(w, newitem)
        self.assertFalse(self.mocksettings.setValue.called)
示例#7
0
class DialogProvider(QObject):
    """
    A class to handle opening user form and creating all the required bindings

    @note: There is a little too much work in this class. Needs a bit of a clean up.
    """
    accepted = pyqtSignal()
    rejected = pyqtSignal()
    
    def __init__(self, canvas, iface):
        QObject.__init__(self)
        self.canvas = canvas
        self.iface = iface

    def openDialog(self, formmodule, feature, layer, forupdate, mandatory_fields=True):
        """
        Opens a form for the given feature

        @refactor: This really needs to be cleaned up.
        """
        self.update = forupdate
        self.dialog = formmodule.formInstance(self.iface.mainWindow())
        self.layer = layer
        self.feature = feature

        self.settings = formmodule.settings()

        self.binder = FormBinder(layer, self.dialog, self.canvas,\
                                 self.settings, formmodule)
        self.binder.beginSelectFeature.connect(self.selectingFromMap)
        self.binder.endSelectFeature.connect(self.featureSelected)
        self.binder.bindFeature(self.feature, mandatory_fields, \
                                self.update)
        self.binder.bindSelectButtons()

        buttonbox = self.dialog.findChild(QDialogButtonBox)
        try:
            buttonbox.accepted.disconnect()
            buttonbox.rejected.disconnect()
        except TypeError:
            # If there are no signals to disconnect then we get a type error.
            pass

        if mandatory_fields:
            buttonbox.accepted.connect(self.validateForm)
        else:
            buttonbox.accepted.connect(self.dialogAccept)
            buttonbox.accepted.connect(self.accepted)

        buttonbox.rejected.connect(self.rejected)
        buttonbox.rejected.connect(self.dialog.reject)
        buttonbox.rejected.connect(self.deleteDialog)

        self.dialog.setModal(True)
        
        if self.settings.get("fullscreen", False):
            self.dialog.showFullScreen()
        else:
            self.dialog.show()

    def selectingFromMap(self, message):
        """
        Put QMap in the select feature from map mode
        
        Hides the dialog and shows the user a message
        """
        self.dialog.hide()
        label = QLabel()
        label.setText(QString(message))
        label.setStyleSheet('font: 75 30pt "MS Shell Dlg 2";color: rgb(231, 175, 62);')
        self.item = self.canvas.scene().addWidget(label)
        self.disableToolbars()

    def featureSelected(self):
        """
        Called once a feature has been selected. Shows the dialog back to the user.
        """
        log('Feature selected')
        self.canvas.scene().removeItem(self.item)
        self.dialog.show()
        self.enableToolbars()

    def validateForm(self):
        """
        Validate the users form.  If there are any errors report them to the user.

        @refactor: Should really just return a bool and let the caller handle what happens next.
                   We should also consider using QValidator for validation.
        """
        controls = self.binder.mandatory_group.unchanged()
        haserrors = len(controls) > 0
        
        if haserrors:
            dlg = QDialog()
            dlg.setWindowFlags( Qt.Tool | Qt.WindowTitleHint )
            ui = Ui_Dialog()
            ui.setupUi(dlg)
            for control in controls:
                label = self.dialog.findChild(QLabel, control.objectName() + "_label")
                if not label is None:
                    name = label.text()
                elif isinstance(control, QCheckBox):
                    name = control.text()
                elif isinstance(control, QGroupBox):
                    name = control.title()

                name += " is mandatory"
                item = QListWidgetItem(name)
                item.setBackground(QBrush(QColor.fromRgb(255,221,48,150)))
                ui.errorList.addItem(item)
            dlg.exec_()
        else:
            self.dialogAccept()
            
    def dialogAccept(self):
        """
        Accept the current open dialog and save the new/updated feature 
        back to the layer.
        """
        info("Saving values back")
        feature = self.binder.unbindFeature(self.feature, self.update)
        info("New feature %s" % self.feature)
        for value in self.feature.attributeMap().values():
            info("New value %s" % value.toString())

        if self.update:
            self.layer.updateFeature( self.feature )
        else:
            self.layer.addFeature( self.feature )

        saved = self.layer.commitChanges()
        if not saved:
            for e in self.layer.commitErrors():
                error(e)

        self.canvas.refresh()

        # After we commit we have to move the drawing into the correct path.
        # TODO Use a custom field for the id name
        # Images are saved under data/{layername}/images/{id}_{fieldname}
        for image in self.binder.images.itervalues():
            curdir = os.path.dirname(__file__)
            id = self.feature.attributeMap()[self.layer.fieldNameIndex("UniqueID")].toString().toUpper()
            log(id)
            name = image.replace("drawingFor_", id + "_" )
            imagename = os.path.join(curdir, "data", str(self.layer.name()), "images", \
                                     os.path.basename(name))

            
            path = os.path.dirname(imagename)
            
            if not os.path.exists(path):
                os.makedirs(path)
            
            log(image)
            log(imagename)
            try:
                os.rename(image, imagename)
            except WindowsError, err:
                os.remove(imagename)
                os.rename(image, imagename)

        self.dialog.accept()
        self.accepted.emit()
示例#8
0
class DialogProvider(QObject):
    accepted = pyqtSignal()
    rejected = pyqtSignal()
    
    def __init__(self, canvas, iface):
        QObject.__init__(self)
        self.canvas = canvas
        self.iface = iface

    def openDialog(self, formmodule, feature, layer, forupdate, mandatory_fields=True):
        self.update = forupdate
        self.dialog = formmodule.formInstance(self.iface.mainWindow())
        self.layer = layer
        self.feature = feature

        self.settings = formmodule.settings()

        self.binder = FormBinder(layer, self.dialog, self.canvas,\
                                 self.settings, formmodule, formmodule.db())
        self.binder.beginSelectFeature.connect(self.selectingFromMap)
        self.binder.endSelectFeature.connect(self.featureSelected)
        self.binder.bindFeature(self.feature, mandatory_fields, \
                                self.update)
        self.binder.bindSelectButtons()

        buttonbox = self.dialog.findChild(QDialogButtonBox)

        if mandatory_fields:
            buttonbox.accepted.connect(self.validateForm)
        else:
            buttonbox.accepted.connect(self.dialogAccept)
            buttonbox.accepted.connect(self.accepted)

        buttonbox.rejected.connect(self.rejected)
        buttonbox.rejected.connect(self.dialog.reject)
        buttonbox.rejected.connect(self.deleteDialog)

        self.dialog.setModal(True)
        
        if self.settings.value("fullscreen", False).toBool():
            self.dialog.showFullScreen()
        self.dialog.show()

    def selectingFromMap(self, message):
        self.dialog.hide()
        label = QLabel()
        label.setText(QString(message))
        label.setStyleSheet('font: 75 30pt "MS Shell Dlg 2";color: rgb(231, 175, 62);')
        self.item = self.canvas.scene().addWidget(label)
        self.disableToolbars()

    def featureSelected(self):
        log('Feature selected')
        self.canvas.scene().removeItem(self.item)
        self.dialog.show()
        self.enableToolbars()

    def validateForm(self):
        controls = self.binder.mandatory_group.unchanged()
        haserrors = len(controls) > 0
        
        if haserrors:
            dlg = QDialog()
            dlg.setWindowFlags( Qt.Tool | Qt.WindowTitleHint )
            ui = Ui_Dialog()
            ui.setupUi(dlg)
            for control in controls:
                label = self.dialog.findChild(QLabel, control.objectName() + "_label")
                if not label is None:
                    name = label.text()
                elif isinstance(control, QCheckBox):
                    name = control.text()
                elif isinstance(control, QGroupBox):
                    name = control.title()

                name += " is mandatory"
                item = QListWidgetItem(name)
                item.setBackground(QBrush(QColor.fromRgb(255,221,48,150)))
                ui.errorList.addItem(item)
            dlg.exec_()
        else:
            self.dialogAccept()
            
    def dialogAccept(self):
        info("Saving values back")
        feature = self.binder.unbindFeature(self.feature)
        info("New feature %s" % feature)
        for value in self.feature.attributeMap().values():
            info("New value %s" % value.toString())

        if self.update:
            self.layer.updateFeature( feature )
        else:
            self.layer.addFeature( self.feature )

        
        self.layer.commitChanges()
        self.canvas.refresh()

        # After we commit we have to move the drawing into the correct path.
        # TODO Use a custom field for the id name
        # Images are saved under data/{layername}/images/{id}_{fieldname}
        for image in self.binder.images.itervalues():
            curdir = os.path.dirname(__file__)
            id = self.feature.attributeMap()[self.layer.fieldNameIndex("UniqueID")].toString().toUpper()
            log(id)
            name = image.replace("drawingFor_", id + "_" )
            imagename = os.path.join(curdir, "data", str(self.layer.name()), "images", \
                                     os.path.basename(name))

            
            path = os.path.dirname(imagename)
            
            if not os.path.exists(path):
                os.makedirs(path)
            
            log(image)
            log(imagename)
            try:
                os.rename(image, imagename)
            except WindowsError, err:
                os.remove(imagename)
                os.rename(image, imagename)

        self.dialog.accept()
        self.accepted.emit()