def bindvalues(self, values, update=False): """ Bind the values to the form. """ if not update: self.bindingvalues = CaseInsensitiveDict(values) else: for key, value in values.iteritems(): try: self.bindingvalues[key] = value except KeyError: continue for field, value in values.iteritems(): value = nullcheck(value) try: wrapper = self.boundwidgets[field] if hasattr(wrapper, 'savetofile') and wrapper.savetofile: if value and not os.path.exists(value): value = os.path.join(self.form.project.image_folder, value) self.boundwidgets[field].setvalue(value) except KeyError: utils.debug("Can't find control for field {}. Ignoring".format(field)) self.validateall() if self.geomwidget and self.feature: self.geomwidget.set_geometry(self.feature.geometry())
def bindvalues(self, values, update=False): """ Bind the values to the form. """ if not update: self.bindingvalues = CaseInsensitiveDict(values) else: for key, value in values.items(): try: self.bindingvalues[key] = value except KeyError: continue for field, value in values.items(): value = nullcheck(value) try: wrapper = self.boundwidgets[field] if hasattr(wrapper, 'savetofile') and wrapper.savetofile: if value and not os.path.exists(value): value = os.path.join(self.form.project.image_folder, value) self.boundwidgets[field].setvalue(value) except KeyError: utils.debug( "Can't find control for field {}. Ignoring".format(field)) self.validateall() if self.geomwidget and self.feature: self.geomwidget.set_geometry(self.feature.geometry())
def save(self, update_version=False, save_forms=True, reset_save_point=False): """ Save the project config to disk. :param update_version Updates the version in the project file. """ if update_version: self.increament_version() if reset_save_point: self.reset_save_version() else: self.increament_save_version() writefolderconfig(self.settings, self.folder, configname='project') if save_forms: # Clear the form cache formsstorage = self.settings.setdefault("forms", []) if not hasattr(formsstorage, 'iteritems'): for form in self.forms: debug("Saving {}".format(form.name)) debug(form.settings) form.save() self.projectUpdated.emit(self)
def _selectImage(self): # Show the file picker defaultlocation = os.path.expandvars(self.defaultlocation) image = QFileDialog.getOpenFileName(self.widget, "Select Image", defaultlocation) utils.debug(image) if image is None or not image: return self.widget.loadImage(image)
def save(self): """ Save the project config to disk. """ writefolderconfig(self.settings, self.folder, configname='project') formsstorage = self.settings.setdefault("forms", []) if not hasattr(formsstorage, 'iteritems'): for form in self.forms: debug("Saving {}".format(form.name)) debug(form.settings) form.save()
def save(self, update_version=True): """ Save the project config to disk. """ self.increament_version() writefolderconfig(self.settings, self.folder, configname='project') formsstorage = self.settings.setdefault("forms", []) if not hasattr(formsstorage, 'iteritems'): for form in self.forms: debug("Saving {}".format(form.name)) debug(form.settings) form.save() self.projectUpdated.emit(self)
def _selectImage(self): # Show the file picker defaultlocation = os.path.expandvars(self.defaultlocation) image = QFileDialog.getOpenFileName(self.widget, "Select Image", defaultlocation) utils.debug(image) if image is None or not image: return image = QPixmap(image) image = resize_image(image, self.image_size) self.widget.loadImage(image) self.modified = True self._updateImageGPSData()
def addformconfig(self, name, config): forms = self.settings.setdefault("forms", []) folder = os.path.join(self.folder, name) if hasattr(forms, 'iteritems'): forms[name] = config else: forms.append(name) Form.saveconfig(config, folder) self.settings['forms'] = forms self._forms = [] form = [form for form in self.forms if form.name == name][0] debug(config) return form
def bindvalues(self, values, update=False): """ Bind the values to the form. """ if not update: self.bindingvalues = CaseInsensitiveDict(values) else: for key, value in values.iteritems(): try: self.bindingvalues[key] = value except KeyError: continue for field, value in values.iteritems(): value = nullcheck(value) try: self.boundwidgets[field].setvalue(value) except KeyError: utils.debug("Can't find control for field {}. Ignoring".format(field)) self.validateall()
def setupui(self): """ Setup the widget in the form """ self.geomwidget = self.findcontrol("__geomwidget") widgetsconfig = copy.deepcopy(self.formconfig['widgets']) try: widgetsconfig = self.get_widgets(widgetsconfig) except AttributeError: pass layer = self.form.QGISLayer # Crash in QGIS if you lookup a field that isn't found. # We just make a dict with all fields lower because QgsFields is case sensitive. fields = { field.name().lower(): field for field in layer.fields().toList() } # Build a lookup for events self.events = collections.defaultdict(list) for event in self.form.events: self.events[event['source']].append(event) widgetsconfig = copy.deepcopy(widgetsconfig) self.sectionwidgets = {} currentsection = None for config in widgetsconfig: widgettype = config['widget'] if widgettype == "Section": name = config['name'] currentsection = name self.sectionwidgets[name] = [] continue field = config['field'] if not field: utils.info("Skipping widget. No field defined") continue field = field.lower() if field in self.boundwidgets: utils.warning( "Can't bind the same field ({}) twice.".format(field)) continue widget = self.findcontrol(field) if widget is None: widget = roam.editorwidgets.core.createwidget(widgettype) config['hidden'] = True utils.info( "No widget named {} found so we have made one.".format( field)) label = self.findcontrol("{}_label".format(field)) if label is None: utils.debug("No label found for {}".format(field)) widgetconfig = config.get('config', {}) widgetconfig['formwidget'] = self try: qgsfield = fields[field] except KeyError: utils.log("No field for ({}) found".format(field)) continue context = dict(project=self.form.project, form=self.form, featureform=self) try: widgetwrapper = roam.editorwidgets.core.widgetwrapper( widgettype=widgettype, layer=self.form.QGISLayer, field=qgsfield, widget=widget, label=label, config=widgetconfig, context=context, main_config=config) except EditorWidgetException as ex: utils.exception(ex) continue widgetwrapper.default_events = config.get('default_events', ['capture']) readonlyrules = config.get('read-only-rules', []) if self.editingmode and 'editing' in readonlyrules: widgetwrapper.readonly = True elif 'insert' in readonlyrules or 'always' in readonlyrules: widgetwrapper.readonly = True widgetwrapper.hidden = config.get('hidden', False) widgetwrapper.newstyleform = self.formconfig.get("newstyle", False) widgetwrapper.required = config.get('required', False) # Only connect widgets that have events if widgetwrapper.id in self.events: widgetwrapper.valuechanged.connect( partial(self.check_for_update_events, widgetwrapper)) widgetwrapper.valuechanged.connect(self.updaterequired) try: changedslot = getattr(self, "widget_{}_changed".format(field)) widgetwrapper.valuechanged.connect(changedslot) except AttributeError: pass widgetwrapper.largewidgetrequest.connect( RoamEvents.show_widget.emit) self._bindsavebutton(field) self.boundwidgets[field] = widgetwrapper try: self.widgetidlookup[config['_id']] = widgetwrapper except KeyError: pass if currentsection: self.sectionwidgets[currentsection].append(widgetwrapper)
def setupui(self): """ Setup the widget in the form """ self.geomwidget = self.findcontrol("__geomwidget") widgetsconfig = self.formconfig['widgets'] layer = self.form.QGISLayer # Crash in QGIS if you lookup a field that isn't found. # We just make a dict with all fields lower because QgsFields is case sensitive. fields = { field.name().lower(): field for field in layer.pendingFields().toList() } for config in widgetsconfig: widgettype = config['widget'] field = config['field'] if not field: utils.info("Skipping widget. No field defined") continue field = field.lower() if field in self.boundwidgets: utils.warning( "Can't bind the same field ({}) twice.".format(field)) continue widget = self.findcontrol(field) if widget is None: widget = roam.editorwidgets.core.createwidget(widgettype) config['hidden'] = True utils.info( "No widget named {} found so we have made one.".format( field)) label = self.findcontrol("{}_label".format(field)) if label is None: utils.debug("No label found for {}".format(field)) widgetconfig = config.get('config', {}) qgsfield = fields[field] try: widgetwrapper = roam.editorwidgets.core.widgetwrapper( widgettype=widgettype, layer=self.form.QGISLayer, field=qgsfield, widget=widget, label=label, config=widgetconfig) except EditorWidgetException as ex: utils.exception(ex) continue readonlyrules = config.get('read-only-rules', []) if self.editingmode and 'editing' in readonlyrules: widgetwrapper.readonly = True elif 'insert' in readonlyrules or 'always' in readonlyrules: widgetwrapper.readonly = True widgetwrapper.hidden = config.get('hidden', False) widgetwrapper.required = config.get('required', False) widgetwrapper.valuechanged.connect(self.updaterequired) widgetwrapper.largewidgetrequest.connect( RoamEvents.show_widget.emit) self._bindsavebutton(field) self.boundwidgets[field] = widgetwrapper
def setupui(self): """ Setup the widget in the form """ widgetsconfig = self.formconfig['widgets'] layer = self.form.QGISLayer # Crash in QGIS if you lookup a field that isn't found. # We just make a dict with all fields lower because QgsFields is case sensitive. fields = {field.name().lower():field for field in layer.pendingFields().toList()} for config in widgetsconfig: widgettype = config['widget'] field = config['field'] if not field: utils.info("Skipping widget. No field defined") continue field = field.lower() if field in self.boundwidgets: utils.warning("Sorry you can't bind the same field ({}) twice.".format(field)) utils.warning("{} for field {} has been ignored in setup".format(widget, field)) continue widget = self.findcontrol(field) if widget is None: widget = roam.editorwidgets.core.createwidget(widgettype) config['hidden'] = True utils.info("No widget named {} found so we have made one.".format(field)) label = self.findcontrol("{}_label".format(field)) if label is None: utils.debug("No label found for {}".format(field)) widgetconfig = config.get('config', {}) qgsfield = fields[field] try: widgetwrapper = roam.editorwidgets.core.widgetwrapper(widgettype=widgettype, layer=self.form.QGISLayer, field=qgsfield, widget=widget, label=label, config=widgetconfig) except EditorWidgetException as ex: utils.exception(ex) continue readonlyrules = config.get('read-only-rules', []) if self.editingmode and 'editing' in readonlyrules: widgetwrapper.readonly = True elif 'insert' in readonlyrules or 'always' in readonlyrules: widgetwrapper.readonly = True widgetwrapper.hidden = config.get('hidden', False) widgetwrapper.required = config.get('required', False) widgetwrapper.valuechanged.connect(self.updaterequired) widgetwrapper.largewidgetrequest.connect(RoamEvents.show_widget.emit) self._bindsavebutton(field) self.boundwidgets[field] = widgetwrapper
def setupui(self): """ Setup the widget in the form """ self.geomwidget = self.findcontrol("__geomwidget") widgetsconfig = copy.deepcopy(self.formconfig['widgets']) try: widgetsconfig = self.get_widgets(widgetsconfig) except AttributeError: pass layer = self.form.QGISLayer # Crash in QGIS if you lookup a field that isn't found. # We just make a dict with all fields lower because QgsFields is case sensitive. fields = {field.name().lower():field for field in layer.pendingFields().toList()} # Build a lookup for events self.events = collections.defaultdict(list) for event in self.form.events: self.events[event['source']].append(event) widgetsconfig = copy.deepcopy(widgetsconfig) self.sectionwidgets = {} currentsection = None for config in widgetsconfig: widgettype = config['widget'] if widgettype == "Section": name = config['name'] currentsection = name self.sectionwidgets[name] = [] continue field = config['field'] if not field: utils.info("Skipping widget. No field defined") continue field = field.lower() if field in self.boundwidgets: utils.warning("Can't bind the same field ({}) twice.".format(field)) continue widget = self.findcontrol(field) if widget is None: widget = roam.editorwidgets.core.createwidget(widgettype) config['hidden'] = True utils.info("No widget named {} found so we have made one.".format(field)) label = self.findcontrol("{}_label".format(field)) if label is None: utils.debug("No label found for {}".format(field)) widgetconfig = config.get('config', {}) widgetconfig['formwidget'] = self try: qgsfield = fields[field] except KeyError: utils.log("No field for ({}) found".format(field)) context = dict(project=self.form.project, form=self.form, featureform=self) try: widgetwrapper = roam.editorwidgets.core.widgetwrapper(widgettype=widgettype, layer=self.form.QGISLayer, field=qgsfield, widget=widget, label=label, config=widgetconfig, context=context) except EditorWidgetException as ex: utils.exception(ex) continue widgetwrapper.default_events = config.get('default_events', ['capture']) readonlyrules = config.get('read-only-rules', []) if self.editingmode and 'editing' in readonlyrules: widgetwrapper.readonly = True elif 'insert' in readonlyrules or 'always' in readonlyrules: widgetwrapper.readonly = True widgetwrapper.hidden = config.get('hidden', False) widgetwrapper.newstyleform = self.formconfig.get("newstyle", False) widgetwrapper.required = config.get('required', False) widgetwrapper.id = config.get('_id', '') # Only connect widgets that have events if widgetwrapper.id in self.events: widgetwrapper.valuechanged.connect(partial(self.check_for_update_events, widgetwrapper)) widgetwrapper.valuechanged.connect(self.updaterequired) try: changedslot = getattr(self, "widget_{}_changed".format(field)) widgetwrapper.valuechanged.connect(changedslot) except AttributeError: pass widgetwrapper.largewidgetrequest.connect(RoamEvents.show_widget.emit) self._bindsavebutton(field) self.boundwidgets[field] = widgetwrapper try: self.widgetidlookup[config['_id']] = widgetwrapper except KeyError: pass if currentsection: self.sectionwidgets[currentsection].append(widgetwrapper)