def getdefaults(widgets, feature, layer, canvas): defaults = {} for field, config in widgets: default = config.get("default", None) if default is None: continue if isinstance(default, dict): defaultconfig = default try: defaulttype = defaultconfig['type'] defaultprovider = defaultproviders[defaulttype] value = defaultprovider(feature, layer, field, defaultconfig, canvas) except KeyError as ex: log(ex) continue except DefaultError as ex: log(ex) value = None else: # Pass it though a series of filters to get the default value if '[%' in default and '%]' in default: # TODO Use regex default = QgsExpression.replaceExpressionText(default, feature, layer ) value = os.path.expandvars(default) log("Default value: {}".format(value)) defaults[field] = value defaults.update(featureform.loadsavedvalues(layer)) return defaults
def load_feature_form(self, feature, form, editmode, clear=True, callback=None): """ Opens the form for the given feature. """ def _sink(_): pass if not callback: callback = _sink if clear: # Clear all the other open widgets that might be open. self.clear(dontemit=True) # One capture geometry, even for sub forms? # HACK Remove me and do something smarter roam.qgisfunctions.capturegeometry = feature.geometry() # Hold a reference to the fields because QGIS will let the # go out of scope and we get crashes. Yay! layer = form.QGISLayer self.fields = feature.fields() attributes = feature.attributes() fields = [field.name().lower() for field in self.fields] # Something is strange with default values and spatilite. Just delete them for now. if layer.dataProvider().name() == 'spatialite': pkindexes = layer.dataProvider().pkAttributeIndexes() for index in pkindexes: del fields[index] del attributes[index] values = CaseInsensitiveDict(zip(fields, attributes)) defaultvalues = {} if not editmode: defaultwidgets = form.widgetswithdefaults() defaultvalues = defaults.default_values(defaultwidgets, feature, layer) defaultvalues.update(featureform.loadsavedvalues(layer)) values.update(defaultvalues) initconfig = dict(form=form, canvas=self.canvas, editmode=editmode) config = dict(editmode=editmode, layers=QgsMapLayerRegistry.instance().mapLayers(), feature=feature) self.add_widget(FeatureFormWidgetEditor, values, callback, config, initconfig=initconfig)
def load_feature_form(self, feature, form, editmode, clear=True, callback=None, cancel_callback=None): """ Opens the form for the given feature. """ def _sink(_): pass if not callback: callback = _sink if not cancel_callback: cancel_callback = _sink if clear: # Clear all the other open widgets that might be open. self.clear(dontemit=True) layer = form.QGISLayer attributes = feature.attributes() fields = [field.name().lower() for field in layer.pendingFields()] # Something is strange with default values and spatilite. Just delete them for now. if layer.dataProvider().name() == 'spatialite': pkindexes = layer.dataProvider().pkAttributeIndexes() for index in pkindexes: del fields[index] del attributes[index] values = CaseInsensitiveDict(zip(fields, attributes)) savedvalues = {} if not editmode: savedvalues = featureform.loadsavedvalues(form) values.update(savedvalues) if form.template_values: values.update(form.template_values) suppressform = form.suppressform if editmode: suppressform = False initconfig = dict(form=form, canvas=self.canvas, editmode=editmode, defaults=savedvalues, suppressform=suppressform, feature=feature) config = dict(editmode=editmode, layers=QgsMapLayerRegistry.instance().mapLayers(), feature=feature) if self.project: layertools = self.project.layer_tools(layer) config['tools'] = layertools self.add_widget(FeatureFormWidgetEditor, values, callback, config, initconfig=initconfig, cancel_callback=cancel_callback)
def load_feature_form(self, feature, form, editmode, clear=True, callback=None): """ Opens the form for the given feature. """ def _sink(_): pass if not callback: callback = _sink if clear: # Clear all the other open widgets that might be open. self.clear(dontemit=True) # One capture geometry, even for sub forms? # HACK Remove me and do something smarter roam.qgisfunctions.capturegeometry = feature.geometry() # Hold a reference to the fields because QGIS will let the # go out of scope and we get crashes. Yay! layer = form.QGISLayer self.fields = feature.fields() attributes = feature.attributes() fields = [field.name().lower() for field in self.fields] # Something is strange with default values and spatilite. Just delete them for now. if layer.dataProvider().name() == 'spatialite': pkindexes = layer.dataProvider().pkAttributeIndexes() for index in pkindexes: del fields[index] del attributes[index] values = CaseInsensitiveDict(zip(fields, attributes)) defaultvalues = {} if not editmode: defaultwidgets = form.widgetswithdefaults() defaultvalues = defaults.default_values(defaultwidgets, feature, layer) defaultvalues.update(featureform.loadsavedvalues(layer)) values.update(defaultvalues) initconfig = dict(form=form, canvas=self.canvas, editmode=editmode, defaults=defaultvalues) config = dict(editmode=editmode, layers=QgsMapLayerRegistry.instance().mapLayers(), feature=feature) if self.project: layertools = self.project.layer_tools(layer) config['tools'] = layertools self.add_widget(FeatureFormWidgetEditor, values, callback, config, initconfig=initconfig)
def load_feature_form(self, feature, form, editmode, clear=True, callback=None): """ Opens the form for the given feature. """ def _sink(_): pass if not callback: callback = _sink if clear: # Clear all the other open widgets that might be open. self.clear(dontemit=True) layer = form.QGISLayer attributes = feature.attributes() fields = [field.name().lower() for field in layer.pendingFields()] # Something is strange with default values and spatilite. Just delete them for now. if layer.dataProvider().name() == 'spatialite': pkindexes = layer.dataProvider().pkAttributeIndexes() for index in pkindexes: del fields[index] del attributes[index] values = CaseInsensitiveDict(zip(fields, attributes)) savedvalues = {} if not editmode: savedvalues = featureform.loadsavedvalues(layer) values.update(savedvalues) initconfig = dict(form=form, canvas=self.canvas, editmode=editmode, defaults=savedvalues) config = dict(editmode=editmode, layers=QgsMapLayerRegistry.instance().mapLayers(), feature=feature) if self.project: layertools = self.project.layer_tools(layer) config['tools'] = layertools self.add_widget(FeatureFormWidgetEditor, values, callback, config, initconfig=initconfig)
def openform(self, form, feature, project, editmode): """ Opens a form for the given feature. """ roam.qgisfunctions.capturegeometry = feature.geometry() defaultvalues = {} layer = form.QGISLayer if not editmode: defaultwidgets = form.widgetswithdefaults() defaultvalues = defaults.default_values(defaultwidgets, feature, layer) defaultvalues.update(featureform.loadsavedvalues(layer)) self.actionDelete.setVisible(editmode) for field, value in defaultvalues.iteritems(): feature[field] = value self.formvalidation(passed=True) self.feature = feature # Hold a reference to the fields because QGIS will let the # go out of scope and we get crashes. Yay! self.fields = self.feature.fields() self.featureform = form.create_featureform(feature, defaultvalues, canvas=self.canvas) self.featureform.editingmode = editmode self.featureform.rejected.connect(self.formrejected) self.featureform.enablesave.connect(self.actionSave.setEnabled) # Call the pre loading events for the form layers = QgsMapLayerRegistry.instance().mapLayers() self.project = project fields = [field.name().lower() for field in self.fields] attributes = feature.attributes() if layer.dataProvider().name() == 'spatialite': pkindexes = layer.dataProvider().pkAttributeIndexes() for index in pkindexes: del fields[index] del attributes[index] values = CaseInsensitiveDict(zip(fields, attributes)) try: self.featureform.load(feature, layers, values) except featureform.RejectedException as rejected: self.formrejected(rejected.message, rejected.level) return self.featureform.formvalidation.connect(self.formvalidation) self.featureform.helprequest.connect(self.helprequest.emit) self.featureform.bindvalues(values) self.featureform.showlargewidget.connect(self.setlargewidget) self.actionSave.setVisible(True) self.setwidget(self.featureform) self.featureform.loaded() RoamEvents.featureformloaded.emit(form, feature, project, editmode)