def testPositionConstrainedToParent(self): """ test that floating widget will be placed inside parent when possible """ main_frame = QWidget() gl = QGridLayout() main_frame.setLayout(gl) main_frame.setMinimumSize(800, 600) anchor_widget = QWidget(main_frame) anchor_widget.setFixedSize(300, 200) main_frame.layout().addWidget(anchor_widget, 1, 1) gl.setColumnStretch(0, 1) gl.setColumnStretch(1, 0) gl.setColumnStretch(2, 1) gl.setRowStretch(0, 1) gl.setRowStretch(1, 0) gl.setRowStretch(2, 1) main_frame.setAttribute(103) main_frame.show() fw = qgis.gui.QgsFloatingWidget(main_frame) fw.setMinimumSize(300, 50) fw.setAnchorWidget(anchor_widget) fw.setAnchorPoint(QgsFloatingWidget.TopRight) fw.setAnchorWidgetPoint(QgsFloatingWidget.TopLeft) # x-position should be 0, not -50 self.assertEqual(fw.pos().x(), 0) fw.setAnchorPoint(QgsFloatingWidget.TopLeft) fw.setAnchorWidgetPoint(QgsFloatingWidget.TopRight) # x-position should be 500, not 600 self.assertEqual(fw.pos().x(), 500)
def testAnchor(self): """ test setting anchor point for widget """ main_frame = QWidget() gl = QGridLayout() main_frame.setLayout(gl) main_frame.setMinimumSize(800, 600) anchor_widget = QWidget(main_frame) anchor_widget.setMinimumSize(300, 200) main_frame.layout().addWidget(anchor_widget, 1, 1) gl.setColumnStretch(0, 1) gl.setColumnStretch(1, 0) gl.setColumnStretch(2, 1) gl.setRowStretch(0, 1) gl.setRowStretch(1, 0) gl.setRowStretch(2, 1) # 103 = WA_DontShowOnScreen (not available in PyQt) main_frame.setAttribute(103) main_frame.show() fw = qgis.gui.QgsFloatingWidget(main_frame) fw.setMinimumSize(100, 50) fw.setAnchorWidget(anchor_widget) tests = [{'anchorPoint': QgsFloatingWidget.TopLeft, 'widgetAnchorPoint': QgsFloatingWidget.TopLeft, 'x': 250, 'y': 200}, {'anchorPoint': QgsFloatingWidget.TopMiddle, 'widgetAnchorPoint': QgsFloatingWidget.TopLeft, 'x': 200, 'y': 200}, {'anchorPoint': QgsFloatingWidget.TopRight, 'widgetAnchorPoint': QgsFloatingWidget.TopLeft, 'x': 150, 'y': 200}, {'anchorPoint': QgsFloatingWidget.MiddleLeft, 'widgetAnchorPoint': QgsFloatingWidget.TopLeft, 'x': 250, 'y': 175}, {'anchorPoint': QgsFloatingWidget.Middle, 'widgetAnchorPoint': QgsFloatingWidget.TopLeft, 'x': 200, 'y': 175}, {'anchorPoint': QgsFloatingWidget.MiddleRight, 'widgetAnchorPoint': QgsFloatingWidget.TopLeft, 'x': 150, 'y': 175}, {'anchorPoint': QgsFloatingWidget.BottomLeft, 'widgetAnchorPoint': QgsFloatingWidget.TopLeft, 'x': 250, 'y': 150}, {'anchorPoint': QgsFloatingWidget.BottomMiddle, 'widgetAnchorPoint': QgsFloatingWidget.TopLeft, 'x': 200, 'y': 150}, {'anchorPoint': QgsFloatingWidget.BottomRight, 'widgetAnchorPoint': QgsFloatingWidget.TopLeft, 'x': 150, 'y': 150}, {'anchorPoint': QgsFloatingWidget.TopLeft, 'widgetAnchorPoint': QgsFloatingWidget.TopMiddle, 'x': 400, 'y': 200}, {'anchorPoint': QgsFloatingWidget.TopLeft, 'widgetAnchorPoint': QgsFloatingWidget.TopRight, 'x': 550, 'y': 200}, {'anchorPoint': QgsFloatingWidget.TopLeft, 'widgetAnchorPoint': QgsFloatingWidget.MiddleLeft, 'x': 250, 'y': 300}, {'anchorPoint': QgsFloatingWidget.TopLeft, 'widgetAnchorPoint': QgsFloatingWidget.Middle, 'x': 400, 'y': 300}, {'anchorPoint': QgsFloatingWidget.TopLeft, 'widgetAnchorPoint': QgsFloatingWidget.MiddleRight, 'x': 550, 'y': 300}, {'anchorPoint': QgsFloatingWidget.TopLeft, 'widgetAnchorPoint': QgsFloatingWidget.BottomLeft, 'x': 250, 'y': 400}, {'anchorPoint': QgsFloatingWidget.TopLeft, 'widgetAnchorPoint': QgsFloatingWidget.BottomMiddle, 'x': 400, 'y': 400}, {'anchorPoint': QgsFloatingWidget.TopLeft, 'widgetAnchorPoint': QgsFloatingWidget.BottomRight, 'x': 550, 'y': 400}] for t in tests: fw.setAnchorPoint(t['anchorPoint']) fw.setAnchorWidgetPoint(t['widgetAnchorPoint']) self.assertEqual(fw.pos().x(), t['x']) self.assertEqual(fw.pos().y(), t['y'])
def testMovingResizingAnchorWidget(self): """ test that moving or resizing the anchor widget updates the floating widget position """ main_frame = QWidget() gl = QGridLayout() main_frame.setLayout(gl) main_frame.setMinimumSize(800, 600) anchor_widget = QWidget(main_frame) anchor_widget.setFixedSize(300, 200) main_frame.layout().addWidget(anchor_widget, 1, 1) gl.setColumnStretch(0, 1) gl.setColumnStretch(1, 0) gl.setColumnStretch(2, 1) gl.setRowStretch(0, 1) gl.setRowStretch(1, 0) gl.setRowStretch(2, 1) # 103 = WA_DontShowOnScreen (not available in PyQt) main_frame.setAttribute(103) main_frame.show() fw = qgis.gui.QgsFloatingWidget(main_frame) fw.setMinimumSize(100, 50) fw.setAnchorWidget(anchor_widget) fw.setAnchorPoint(QgsFloatingWidget.TopLeft) fw.setAnchorWidgetPoint(QgsFloatingWidget.TopLeft) self.assertEqual(fw.pos().x(), 250) self.assertEqual(fw.pos().y(), 200) # now resize anchor widget anchor_widget.setFixedSize(400, 300) # force layout recalculation main_frame.layout().invalidate() main_frame.layout().activate() self.assertEqual(fw.pos().x(), 200) self.assertEqual(fw.pos().y(), 150) # now move anchor widget anchor_widget.move(100, 110) self.assertEqual(fw.pos().x(), 100) self.assertEqual(fw.pos().y(), 110)
def testResizingParentWidget(self): """ test resizing parent widget correctly repositions floating widget""" main_frame = QWidget() gl = QGridLayout() main_frame.setLayout(gl) main_frame.setMinimumSize(800, 600) anchor_widget = QWidget(main_frame) anchor_widget.setFixedSize(300, 200) main_frame.layout().addWidget(anchor_widget, 1, 1) gl.setColumnStretch(0, 1) gl.setColumnStretch(1, 0) gl.setColumnStretch(2, 1) gl.setRowStretch(0, 1) gl.setRowStretch(1, 0) gl.setRowStretch(2, 1) # 103 = WA_DontShowOnScreen (not available in PyQt) main_frame.setAttribute(103) main_frame.show() fw = qgis.gui.QgsFloatingWidget(main_frame) fw.setMinimumSize(100, 50) fw.setAnchorWidget(anchor_widget) fw.setAnchorPoint(QgsFloatingWidget.TopLeft) fw.setAnchorWidgetPoint(QgsFloatingWidget.TopLeft) self.assertEqual(fw.pos().x(), 250) self.assertEqual(fw.pos().y(), 200) # now resize parent widget main_frame.setFixedSize(1000, 800) # force layout recalculation main_frame.layout().invalidate() main_frame.layout().activate() self.assertEqual(fw.pos().x(), 350) self.assertEqual(fw.pos().y(), 300)
def testAnchor(self): """ test setting anchor point for widget """ main_frame = QWidget() gl = QGridLayout() main_frame.setLayout(gl) main_frame.setMinimumSize(800, 600) anchor_widget = QWidget(main_frame) anchor_widget.setMinimumSize(300, 200) main_frame.layout().addWidget(anchor_widget, 1, 1) gl.setColumnStretch(0, 1) gl.setColumnStretch(1, 0) gl.setColumnStretch(2, 1) gl.setRowStretch(0, 1) gl.setRowStretch(1, 0) gl.setRowStretch(2, 1) # 103 = WA_DontShowOnScreen (not available in PyQt) main_frame.setAttribute(103) main_frame.show() fw = qgis.gui.QgsFloatingWidget(main_frame) fw.setMinimumSize(100, 50) fw.setAnchorWidget(anchor_widget) tests = [{ 'anchorPoint': QgsFloatingWidget.TopLeft, 'widgetAnchorPoint': QgsFloatingWidget.TopLeft, 'x': 250, 'y': 200 }, { 'anchorPoint': QgsFloatingWidget.TopMiddle, 'widgetAnchorPoint': QgsFloatingWidget.TopLeft, 'x': 200, 'y': 200 }, { 'anchorPoint': QgsFloatingWidget.TopRight, 'widgetAnchorPoint': QgsFloatingWidget.TopLeft, 'x': 150, 'y': 200 }, { 'anchorPoint': QgsFloatingWidget.MiddleLeft, 'widgetAnchorPoint': QgsFloatingWidget.TopLeft, 'x': 250, 'y': 175 }, { 'anchorPoint': QgsFloatingWidget.Middle, 'widgetAnchorPoint': QgsFloatingWidget.TopLeft, 'x': 200, 'y': 175 }, { 'anchorPoint': QgsFloatingWidget.MiddleRight, 'widgetAnchorPoint': QgsFloatingWidget.TopLeft, 'x': 150, 'y': 175 }, { 'anchorPoint': QgsFloatingWidget.BottomLeft, 'widgetAnchorPoint': QgsFloatingWidget.TopLeft, 'x': 250, 'y': 150 }, { 'anchorPoint': QgsFloatingWidget.BottomMiddle, 'widgetAnchorPoint': QgsFloatingWidget.TopLeft, 'x': 200, 'y': 150 }, { 'anchorPoint': QgsFloatingWidget.BottomRight, 'widgetAnchorPoint': QgsFloatingWidget.TopLeft, 'x': 150, 'y': 150 }, { 'anchorPoint': QgsFloatingWidget.TopLeft, 'widgetAnchorPoint': QgsFloatingWidget.TopMiddle, 'x': 400, 'y': 200 }, { 'anchorPoint': QgsFloatingWidget.TopLeft, 'widgetAnchorPoint': QgsFloatingWidget.TopRight, 'x': 550, 'y': 200 }, { 'anchorPoint': QgsFloatingWidget.TopLeft, 'widgetAnchorPoint': QgsFloatingWidget.MiddleLeft, 'x': 250, 'y': 300 }, { 'anchorPoint': QgsFloatingWidget.TopLeft, 'widgetAnchorPoint': QgsFloatingWidget.Middle, 'x': 400, 'y': 300 }, { 'anchorPoint': QgsFloatingWidget.TopLeft, 'widgetAnchorPoint': QgsFloatingWidget.MiddleRight, 'x': 550, 'y': 300 }, { 'anchorPoint': QgsFloatingWidget.TopLeft, 'widgetAnchorPoint': QgsFloatingWidget.BottomLeft, 'x': 250, 'y': 400 }, { 'anchorPoint': QgsFloatingWidget.TopLeft, 'widgetAnchorPoint': QgsFloatingWidget.BottomMiddle, 'x': 400, 'y': 400 }, { 'anchorPoint': QgsFloatingWidget.TopLeft, 'widgetAnchorPoint': QgsFloatingWidget.BottomRight, 'x': 550, 'y': 400 }] for t in tests: fw.setAnchorPoint(t['anchorPoint']) fw.setAnchorWidgetPoint(t['widgetAnchorPoint']) self.assertEqual(fw.pos().x(), t['x']) self.assertEqual(fw.pos().y(), t['y'])
class ForeignKeyMapper(QWidget): """ Widget for selecting database records through an entity browser or using an ExpressionBuilder for filtering records. """ # Custom signals beforeEntityAdded = pyqtSignal("PyQt_PyObject") afterEntityAdded = pyqtSignal("PyQt_PyObject", int) entityRemoved = pyqtSignal("PyQt_PyObject") deletedRows = pyqtSignal(list) def __init__(self, entity, parent=None, notification_bar=None, enable_list=True, can_filter=False, plugin=None): QWidget.__init__(self, parent) self.current_profile = current_profile() self._tbFKEntity = QTableView(self) self._tbFKEntity.setEditTriggers(QAbstractItemView.NoEditTriggers) self._tbFKEntity.setAlternatingRowColors(True) self._tbFKEntity.setSelectionBehavior(QAbstractItemView.SelectRows) self.plugin = plugin self._add_entity_btn = QToolButton(self) self._add_entity_btn.setToolTip( QApplication.translate("ForeignKeyMapper", "Add")) self._add_entity_btn.setIcon(GuiUtils.get_icon("add.png")) self._add_entity_btn.clicked.connect(self.onAddEntity) self._edit_entity_btn = QToolButton(self) self._edit_entity_btn.setVisible(False) self._edit_entity_btn.setToolTip( QApplication.translate("ForeignKeyMapper", "Edit")) self._edit_entity_btn.setIcon(GuiUtils.get_icon("edit.png")) self._filter_entity_btn = QToolButton(self) self._filter_entity_btn.setVisible(False) self._filter_entity_btn.setToolTip( QApplication.translate("ForeignKeyMapper", "Select by expression")) self._filter_entity_btn.setIcon(GuiUtils.get_icon("filter.png")) self._filter_entity_btn.clicked.connect(self.onFilterEntity) self._delete_entity_btn = QToolButton(self) self._delete_entity_btn.setToolTip( QApplication.translate("ForeignKeyMapper", "Remove")) self._delete_entity_btn.setIcon(GuiUtils.get_icon("remove.png")) self._delete_entity_btn.clicked.connect(self.onRemoveEntity) layout = QVBoxLayout(self) layout.setSpacing(4) layout.setMargin(5) self.grid_layout = QGridLayout() self.grid_layout.setHorizontalSpacing(5) self.grid_layout.addWidget(self._add_entity_btn, 0, 0, 1, 1) self.grid_layout.addWidget(self._filter_entity_btn, 0, 1, 1, 1) self.grid_layout.addWidget(self._edit_entity_btn, 0, 2, 1, 1) self.grid_layout.addWidget(self._delete_entity_btn, 0, 3, 1, 1) self.grid_layout.setColumnStretch(4, 5) layout.addLayout(self.grid_layout) layout.addWidget(self._tbFKEntity) self.social_tenure = self.current_profile.social_tenure self._tableModel = None self._notifBar = notification_bar self._headers = [] self._entity_attrs = [] self._cell_formatters = {} self._searchable_columns = OrderedDict() self._supportsLists = enable_list self._deleteOnRemove = False self._uniqueValueColIndices = OrderedDict() self.global_id = None self._deferred_objects = {} self._use_expression_builder = can_filter if self._use_expression_builder: self._filter_entity_btn.setVisible(True) self._edit_entity_btn.setVisible(False) self.set_entity(entity) def set_entity(self, entity): """ Sets new entity and updates the ForeignKeyMapper with a new :param entity: The entity of the ForeignKeyMapper :type entity:Object """ from stdm.ui.entity_browser import EntityBrowser self._entity = entity self._dbmodel = entity_model(entity) self._init_fk_columns() self._entitySelector = EntityBrowser(self._entity, parent=self, state=SELECT, plugin=self.plugin) # Connect signals self._entitySelector.recordSelected.connect( self._onRecordSelectedEntityBrowser) def _init_fk_columns(self): """ Asserts if the entity columns actually do exist in the database. The method also initializes the table headers, entity column and cell formatters. """ self._headers[:] = [] self._entity_attrs[:] = [] if self._dbmodel is None: msg = QApplication.translate( 'ForeignKeyMapper', 'The data model for ' 'the entity could ' 'not be loaded, ' 'please contact ' 'your database ' 'administrator.') QMessageBox.critical( self, QApplication.translate('EntityBrowser', 'Entity Browser'), msg) return table_name = self._entity.name columns = table_column_names(table_name) missing_columns = [] header_idx = 0 # Iterate entity column and assert if they exist for c in self._entity.columns.values(): # Do not include virtual columns in list of missing columns if not c.name in columns and not isinstance(c, VirtualColumn): missing_columns.append(c.name) else: header = c.header() self._headers.append(header) ''' If it is a virtual column then use column name as the header but fully qualified column name (created by SQLAlchemy relationship) as the entity attribute name. ''' col_name = c.name if isinstance(c, MultipleSelectColumn): col_name = c.model_attribute_name self._entity_attrs.append(col_name) # Get widget factory so that we can use the value formatter w_factory = ColumnWidgetRegistry.factory(c.TYPE_INFO) if not w_factory is None: try: formatter = w_factory(c) self._cell_formatters[col_name] = formatter except WidgetException as we: msg = QApplication.translate( 'ForeignKeyMapper', 'Error in creating column:') msg = '{0} {1}:{2}\n{3}'.format( msg, self._entity.name, c.name, str(we)) QMessageBox.critical( self, QApplication.translate('ForeignKeyMapper', 'Widget Creation Error'), msg) # Set searchable columns if c.searchable: self._searchable_columns[header] = { 'name': c.name, 'header_index': header_idx } header_idx += 1 if len(missing_columns) > 0: msg = QApplication.translate( 'ForeignKeyMapper', 'The following columns have been defined in the ' 'configuration but are missing in corresponding ' 'database table, please re-run the configuration wizard ' 'to create them.\n{0}'.format('\n'.join(missing_columns))) QMessageBox.warning( self, QApplication.translate('ForeignKeyMapper', 'Entity Browser'), msg) self._tableModel = BaseSTDMTableModel([], self._headers, self) self._tbFKEntity.setModel(self._tableModel) # First (id) column will always be hidden self._tbFKEntity.hideColumn(0) self._tbFKEntity.horizontalHeader().setSectionResizeMode( QHeaderView.Interactive) self._tbFKEntity.horizontalHeader().setStretchLastSection(True) self._tbFKEntity.verticalHeader().setVisible(True) def databaseModel(self): ''' Returns the database model that represents the foreign key entity. ''' return self._dbmodel def setDatabaseModel(self, model): ''' Set the database model that represents the foreign key entity. Model has to be a callable. ''' self._dbmodel = model def cellFormatters(self): """ Returns a dictionary of cell formatters used by the foreign key mapper. """ return self._cell_formatters def cell_formatter(self, column): """ :param column: Column name: :type column: str :return: Returns the corresponding formatter object based on the column name. None will be returned if there is no corresponding object. :rtype: object """ return self._cell_formatters.get(column, None) def entitySelector(self): ''' Returns the dialog for selecting the entity objects. ''' return self._entitySelector def supportList(self): ''' Returns whether the mapper supports only one item or multiple entities. Default is 'True'. ''' return self._supportsLists def setSupportsList(self, supportsList): ''' Sets whether the mapper supports only one item or multiple entities i.e. one-to-one (False) and one-to-many mapping (True). ''' self._supportsLists = supportsList def setNotificationBar(self, notificationBar): ''' Set the notification bar for displaying user messages. ''' self._notifBar = notificationBar def viewModel(self): ''' Return the view model used by the table view. ''' return self._tableModel def set_expression_builder(self, state): """ Set the mapper to use QGIS expression builder as the entity selector. """ self._use_expression_builder = state def expression_builder_enabled(self): """ Returns whether the mapper has been configured to use the expression builder """ return self._use_expression_builder def deleteOnRemove(self): ''' Returns the state whether a record should be deleted from the database when it is removed from the list. ''' return self._deleteOnRemove def setDeleteonRemove(self, delete): ''' Set whether whether a record should be deleted from the database when it is removed from the list. ''' self._deleteOnRemove = delete def addUniqueColumnName(self, colName, replace=True): ''' Set the name of the column whose values are to be unique. If 'replace' is True then the existing row will be replaced with one with the new value; else, the new row will not be added to the list. ''' headers = list(self._dbmodel.displayMapping().values()) colIndex = getIndex(headers, colName) if colIndex != -1: self.addUniqueColumnIndex(colIndex, replace) def addUniqueColumnIndex(self, colIndex, replace=True): ''' Set the index of the column whose values are to be unique. The column indices are zero-based. If 'replace' is True then the existing row will be replaced with the new value; else, the new row will not be added to the list. For multiple replace rules defined, then the first one added to the collection is the one that will be applied. ''' self._uniqueValueColIndices[colIndex] = replace def onFilterEntity(self): """ Slot raised to load the expression builder dialog. """ vl, msg = self.vector_layer() if vl is None: msg = msg + "\n" + QApplication.translate( "ForeignKeyMapper", "The expression builder cannot be used at this moment.") QMessageBox.critical( self, QApplication.translate("ForeignKeyMapper", "Expression Builder"), msg) return context = self._entity.short_name filter_dlg = ForeignKeyMapperExpressionDialog(vl, self, context=context) filter_dlg.setWindowTitle( QApplication.translate("ForeignKeyMapper", "Filter By Expression")) filter_dlg.recordSelected[int].connect( self._onRecordSelectedEntityBrowser) res = filter_dlg.exec_() def _removeRow(self, rowNumber): ''' Remove the row at the given index. ''' self._tableModel.removeRows(rowNumber, 1) def onRemoveEntity(self): ''' Slot raised on clicking to remove the selected entity. ''' selectedRowIndices = self._tbFKEntity.selectionModel().selectedRows(0) deleted_rows = [] if len(selectedRowIndices) == 0: msg = QApplication.translate( "ForeignKeyMapper", "Please select the record to be removed.") self._notifBar.clear() self._notifBar.insertWarningNotification(msg) return for selectedRowIndex in selectedRowIndices: # Delete record from database if flag has been set to True recId = selectedRowIndex.data() dbHandler = self._dbmodel() delRec = dbHandler.queryObject().filter( self._dbmodel.id == recId).first() if not delRec is None: self.entityRemoved.emit(delRec) if self._deleteOnRemove: delRec.delete() self._removeRow(selectedRowIndex.row()) deleted_rows.append(selectedRowIndex.row()) self.deletedRows.emit(deleted_rows) def _recordIds(self): ''' Returns the primary keys of the records in the table. ''' recordIds = [] if self._tableModel: rowCount = self._tableModel.rowCount() for r in range(rowCount): # Get ID value modelIndex = self._tableModel.index(r, 0) modelId = modelIndex.data() recordIds.append(modelId) return recordIds def entities(self): ''' Returns the model instance(s) depending on the configuration specified by the user. ''' recIds = self._recordIds() modelInstances = self._modelInstanceFromIds(recIds) if len(modelInstances) == 0: if self._supportsLists: return [] else: return None else: if self._supportsLists: return modelInstances else: return modelInstances[0] def setEntities(self, entities): ''' Insert entities into the table. ''' if isinstance(entities, list): for entity in entities: self._insertModelToView(entity) else: self._insertModelToView(entities) def searchModel(self, columnIndex, columnValue): ''' Searches for 'columnValue' in the column whose index is specified by 'columnIndex' in all rows contained in the model. ''' if isinstance(columnValue, QVariant): columnValue = str(columnValue.toString()) if not isinstance(columnValue, str): columnValue = str(columnValue) columnValue = columnValue.strip() proxy = QSortFilterProxyModel(self) proxy.setSourceModel(self._tableModel) proxy.setFilterKeyColumn(columnIndex) proxy.setFilterFixedString(columnValue) # Will return model index containing the primary key. matchingIndex = proxy.mapToSource(proxy.index(0, 0)) return matchingIndex def _modelInstanceFromIds(self, ids): ''' Returns the model instance based the value of its primary key. ''' dbHandler = self._dbmodel() modelInstances = [] for modelId in ids: modelObj = dbHandler.queryObject().filter( self._dbmodel.id == modelId).first() if not modelObj is None: modelInstances.append(modelObj) return modelInstances def _onRecordSelectedEntityBrowser(self, rec, row_number=-1): ''' Slot raised when the user has clicked the select button in the 'EntityBrowser' dialog to add the selected record to the table's list. Add the record to the foreign key table using the mappings. ''' # Check if the record exists using the primary key so as to ensure # only one instance is added to the table if isinstance(rec, int): recIndex = getIndex(self._recordIds(), rec) if recIndex != -1: return dbHandler = self._dbmodel() modelObj = dbHandler.queryObject().filter( self._dbmodel.id == rec).first() elif isinstance(rec, object): modelObj = rec else: return if modelObj is not None: # Raise before entity added signal self.beforeEntityAdded.emit(modelObj) # Validate for unique value configurations ''' if not self._validate_unique_columns(modelObj, row_number): return ''' if not self._supportsLists and self._tableModel.rowCount() > 0: self._removeRow(0) insert_position = self._insertModelToView(modelObj, row_number) if isinstance(rec, object): self._deferred_objects[insert_position] = modelObj def _validate_unique_columns(self, model, exclude_row=-1): """ Loop through the attributes of the model to assert for existing row values that should be unique based on the configuration of unique columns. """ for colIndex, replace in list(self._uniqueValueColIndices.items()): attrName = list(self._dbmodel.displayMapping().keys())[colIndex] attrValue = getattr(model, attrName) # Check to see if there are cell formatters so # that the correct value is searched for in the model if attrName in self._cell_formatters: attrValue = self._cell_formatters[attrName](attrValue) matchingIndex = self.searchModel(colIndex, attrValue) if matchingIndex.isValid() and matchingIndex.row() != exclude_row: if replace: existingId = matchingIndex.data() # Delete old record from db entityModels = self._modelInstanceFromIds([existingId]) if len(entityModels) > 0: entityModels[0].delete() self._removeRow(matchingIndex.row()) return True else: # Break. Do not add item to the list. return False return True def _insertModelToView(self, model_obj, row_number=-1): """ Insert the given database model instance into the view at the given row number position. """ if row_number == -1: row_number = self._tableModel.rowCount() self._tableModel.insertRows(row_number, 1) # In some instances, we will need to get the model object with # backrefs included else exceptions will be raised on missing # attributes q_objs = self._modelInstanceFromIds([model_obj.id]) if len(q_objs) == 0: return model_obj = q_objs[0] for i, attr in enumerate(self._entity_attrs): prop_idx = self._tableModel.index(row_number, i) attr_val = getattr(model_obj, attr) ''' Check if there are display formatters and apply if one exists for the given attribute. ''' if attr in self._cell_formatters: formatter = self._cell_formatters[attr] attr_val = formatter.format_column_value(attr_val) self._tableModel.setData(prop_idx, attr_val) # Raise signal once entity has been inserted self.afterEntityAdded.emit(model_obj, row_number) self._tbFKEntity.resizeColumnsToContents() return row_number def insert_model_to_table(self, model_obj, row_number=-1): """ Insert the given database model instance into the view at the given row number position. """ if row_number == -1: row_number = self._tableModel.rowCount() self._tableModel.insertRows(row_number, 1) # In some instances, we will need to get the model object with # backrefs included else exceptions will be raised on missing # attributes q_objs = self._modelInstanceFromIds([model_obj.id]) if len(q_objs) == 0: return model_obj = q_objs[0] for i, attr in enumerate(self._entity_attrs): prop_idx = self._tableModel.index(row_number, i) attr_val = getattr(model_obj, attr) # Check if there are display formatters and apply if one exists # for the given attribute. if attr in self._cell_formatters: formatter = self._cell_formatters[attr] attr_val = formatter.format_column_value(attr_val) self._tableModel.setData(prop_idx, attr_val) #self._tbFKEntity.resizeColumnsToContents() self._tbFKEntity.horizontalHeader().setSectionResizeMode( QHeaderView.Stretch) return row_number def remove_rows(self): """ Removes rows from the fk browser. """ row_count = self._tbFKEntity.model().rowCount() self._tbFKEntity.model().removeRows(0, row_count) def vector_layer(self): """ Returns a QgsVectorLayer based on the configuration information specified in the mapper including the system-wide data connection properties. """ from stdm.data.pg_utils import vector_layer if self._dbmodel is None: msg = QApplication.translate( "ForeignKeyMapper", "Primary database model object not defined.") return None, msg filter_layer = vector_layer(self._entity.name) if filter_layer is None: msg = QApplication.translate( "ForeignKeyMapper", "Vector layer could not be constructed from the database table." ) return None, msg if not filter_layer.isValid(): trans_msg = QApplication.translate( "ForeignKeyMapper", "The vector layer for '{0}' table is invalid.") msg = trans_msg.format(self._entity.name) return None, msg return filter_layer, "" def onAddEntity(self): """ Slot raised on selecting to add related entities that will be mapped to the primary database model instance. """ self._entitySelector.buttonBox.button( QDialogButtonBox.Cancel).setVisible(False) # Clear any previous selections in the entity browser self._entitySelector.clear_selection() # Clear any previous notifications self._entitySelector.clear_notifications() self._entitySelector.exec_()
class QmsSearchResultItemWidget(QWidget): def __init__(self, geoservice, image_ba, parent=None, extent_renderer=None): QWidget.__init__(self, parent) self.extent_renderer = extent_renderer self.layout = QHBoxLayout(self) self.layout.setContentsMargins(5, 10, 5, 10) self.setLayout(self.layout) self.service_icon = QLabel(self) self.service_icon.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.service_icon.resize(24, 24) qimg = QImage.fromData(image_ba) pixmap = QPixmap.fromImage(qimg) self.service_icon.setPixmap(pixmap) self.layout.addWidget(self.service_icon) self.service_desc_layout = QGridLayout(self) self.service_desc_layout.setSpacing(0) self.layout.addLayout(self.service_desc_layout) self.service_name = QLabel(self) self.service_name.setTextFormat(Qt.RichText) self.service_name.setWordWrap(True) self.service_name.setText(u" <strong> {} </strong>".format( geoservice.get('name', u""))) self.service_desc_layout.addWidget(self.service_name, 0, 0, 1, 3) self.service_type = QLabel(self) self.service_type.setTextFormat(Qt.RichText) self.service_type.setWordWrap(True) self.service_type.setText(geoservice.get('type', u"").upper() + " ") self.service_desc_layout.addWidget(self.service_type, 1, 0) self.service_deteils = QLabel(self) self.service_deteils.setTextFormat(Qt.RichText) self.service_deteils.setWordWrap(True) self.service_deteils.setOpenExternalLinks(True) self.service_deteils.setText(u"<a href=\"{0}\">{1}</a>, ".format( Client().geoservice_info_url(geoservice.get('id', u"")), self.tr('details'))) self.service_desc_layout.addWidget(self.service_deteils, 1, 1) self.service_report = QLabel(self) self.service_report.setTextFormat(Qt.RichText) self.service_report.setWordWrap(True) self.service_report.setOpenExternalLinks(True) self.service_report.setText(u"<a href=\"{0}\">{1}</a><div/>".format( Client().geoservice_report_url(geoservice.get('id', u"")), self.tr('report a problem'))) self.service_desc_layout.addWidget(self.service_report, 1, 2) self.service_desc_layout.setColumnStretch(2, 1) self.status_label = QLabel(self) self.status_label.setTextFormat(Qt.RichText) self.status_label.setText(u'\u2022') status = geoservice.get('cumulative_status', u'') if status == 'works': self.status_label.setStyleSheet("color: green; font-size: 30px") if status == 'failed': self.status_label.setStyleSheet("color: red; font-size: 30px") if status == 'problematic': self.status_label.setStyleSheet("color: yellow; font-size: 30px") self.layout.addWidget(self.status_label) self.addButton = QToolButton() self.addButton.setText(self.tr("Add")) self.addButton.clicked.connect(self.addToMap) self.layout.addWidget(self.addButton) self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Minimum) self.geoservice = geoservice self.image_ba = image_ba def addToMap(self): try: QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) client = Client() client.set_proxy(*QGISSettings.get_qgis_proxy()) geoservice_info = client.get_geoservice_info(self.geoservice) ds = DataSourceSerializer.read_from_json(geoservice_info) add_layer_to_map(ds) CachedServices().add_service(self.geoservice, self.image_ba) except Exception as ex: plPrint(unicode(ex)) pass finally: QApplication.restoreOverrideCursor() def mouseDoubleClickEvent(self, event): self.addToMap() def enterEvent(self, event): extent = self.geoservice.get('extent', None) if self.extent_renderer and extent: if ';' in extent: extent = extent.split(';')[1] geom = QgsGeometry.fromWkt(extent) self.extent_renderer.show_feature(geom) def leaveEvent(self, event): if self.extent_renderer: self.extent_renderer.clear_feature()
def setup_thresholds_panel(self, classification): """Setup threshold panel in the right panel. :param classification: Classification definition. :type classification: dict """ # Set text in the label layer_purpose = self.parent.step_kw_purpose.selected_purpose() layer_subcategory = self.parent.step_kw_subcategory.\ selected_subcategory() if is_raster_layer(self.parent.layer): active_band = self.parent.step_kw_band_selector.selected_band() layer_extent = self.parent.layer.extent() statistics = self.parent.layer.dataProvider().bandStatistics( active_band, QgsRasterBandStats.All, layer_extent, 0) description_text = continuous_raster_question % ( layer_purpose['name'], layer_subcategory['name'], classification['name'], statistics.minimumValue, statistics.maximumValue) else: field_name = self.parent.step_kw_field.selected_fields() field_index = self.parent.layer.fields().lookupField(field_name) min_value_layer = self.parent.layer.minimumValue(field_index) max_value_layer = self.parent.layer.maximumValue(field_index) description_text = continuous_vector_question % ( layer_purpose['name'], layer_subcategory['name'], field_name, classification['name'], min_value_layer, max_value_layer) # Set description description_label = QLabel(description_text) description_label.setWordWrap(True) self.right_layout.addWidget(description_label) if self.thresholds: thresholds = self.thresholds else: thresholds = self.parent.get_existing_keyword('thresholds') selected_unit = self.parent.step_kw_unit.selected_unit()['key'] self.threshold_classes = OrderedDict() classes = classification.get('classes') # Sort by value, put the lowest first classes = sorted(classes, key=lambda the_key: the_key['value']) grid_layout_thresholds = QGridLayout() for i, the_class in enumerate(classes): class_layout = QHBoxLayout() # Class label class_label = QLabel(the_class['name']) # Min label min_label = QLabel(tr('Min >')) # Min value as double spin min_value_input = QDoubleSpinBox() # TODO(IS) We can set the min and max depends on the unit, later min_value_input.setMinimum(0) min_value_input.setMaximum(999999) if thresholds.get(self.active_exposure['key']): exposure_thresholds = thresholds.get( self.active_exposure['key']) if exposure_thresholds.get(classification['key']): exposure_thresholds_classifications = exposure_thresholds\ .get(classification['key']) min_value_input.setValue( exposure_thresholds_classifications['classes'][ the_class['key']][0]) else: default_min = the_class['numeric_default_min'] if isinstance(default_min, dict): default_min = the_class[ 'numeric_default_min'][selected_unit] min_value_input.setValue(default_min) else: default_min = the_class['numeric_default_min'] if isinstance(default_min, dict): default_min = the_class[ 'numeric_default_min'][selected_unit] min_value_input.setValue(default_min) min_value_input.setSingleStep(0.1) # Max label max_label = QLabel(tr('Max <=')) # Max value as double spin max_value_input = QDoubleSpinBox() # TODO(IS) We can set the min and max depends on the unit, later max_value_input.setMinimum(0) max_value_input.setMaximum(999999) if thresholds.get(self.active_exposure['key']): exposure_thresholds = thresholds.get( self.active_exposure['key']) if exposure_thresholds.get(classification['key']): exposure_thresholds_classifications = exposure_thresholds \ .get(classification['key']) max_value_input.setValue( exposure_thresholds_classifications['classes'][ the_class['key']][1]) else: default_max = the_class['numeric_default_max'] if isinstance(default_max, dict): default_max = the_class[ 'numeric_default_max'][selected_unit] max_value_input.setValue(default_max) else: default_max = the_class['numeric_default_max'] if isinstance(default_max, dict): default_max = the_class[ 'numeric_default_max'][selected_unit] max_value_input.setValue(default_max) max_value_input.setSingleStep(0.1) # Add to class_layout class_layout.addWidget(min_label) class_layout.addWidget(min_value_input) class_layout.addWidget(max_label) class_layout.addWidget(max_value_input) class_layout.setStretch(0, 1) class_layout.setStretch(1, 2) class_layout.setStretch(2, 1) class_layout.setStretch(3, 2) # Add to grid_layout grid_layout_thresholds.addWidget(class_label, i, 0) grid_layout_thresholds.addLayout(class_layout, i, 1) self.threshold_classes[the_class['key']] = [ min_value_input, max_value_input] grid_layout_thresholds.setColumnStretch(0, 1) grid_layout_thresholds.setColumnStretch(0, 2) def min_max_changed(double_spin_index, mode): """Slot when min or max value change. :param double_spin_index: The index of the double spin. :type double_spin_index: int :param mode: The flag to indicate the min or max value. :type mode: int """ if mode == MAX_VALUE_MODE: current_max_value = list(self.threshold_classes.values())[ double_spin_index][1] target_min_value = list(self.threshold_classes.values())[ double_spin_index + 1][0] if current_max_value.value() != target_min_value.value(): target_min_value.setValue(current_max_value.value()) elif mode == MIN_VALUE_MODE: current_min_value = list(self.threshold_classes.values())[ double_spin_index][0] target_max_value = list(self.threshold_classes.values())[ double_spin_index - 1][1] if current_min_value.value() != target_max_value.value(): target_max_value.setValue(current_min_value.value()) # Set behaviour for k, v in list(self.threshold_classes.items()): index = list(self.threshold_classes.keys()).index(k) if index < len(self.threshold_classes) - 1: # Max value changed v[1].valueChanged.connect(partial( min_max_changed, double_spin_index=index, mode=MAX_VALUE_MODE)) if index > 0: # Min value v[0].valueChanged.connect(partial( min_max_changed, double_spin_index=index, mode=MIN_VALUE_MODE)) grid_layout_thresholds.setSpacing(0) self.right_layout.addLayout(grid_layout_thresholds)
class QmsSearchResultItemWidget(QWidget): def __init__(self, geoservice, image_ba, parent=None, extent_renderer=None): QWidget.__init__(self, parent) self.extent_renderer = extent_renderer self.layout = QHBoxLayout(self) self.layout.setContentsMargins(5, 10, 5, 10) self.setLayout(self.layout) self.service_icon = QLabel(self) self.service_icon.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.service_icon.resize(24, 24) qimg = QImage.fromData(image_ba) pixmap = QPixmap.fromImage(qimg) self.service_icon.setPixmap(pixmap) self.layout.addWidget(self.service_icon) self.service_desc_layout = QGridLayout(self) self.service_desc_layout.setSpacing(0) self.layout.addLayout(self.service_desc_layout) self.service_name = QLabel(self) self.service_name.setTextFormat(Qt.RichText) self.service_name.setWordWrap(True) self.service_name.setText(u" <strong> {} </strong>".format(geoservice.get('name', u""))) self.service_desc_layout.addWidget(self.service_name, 0, 0, 1, 3) self.service_type = QLabel(self) self.service_type.setTextFormat(Qt.RichText) self.service_type.setWordWrap(True) self.service_type.setText(geoservice.get('type', u"").upper() + " ") self.service_desc_layout.addWidget(self.service_type, 1, 0) self.service_deteils = QLabel(self) self.service_deteils.setTextFormat(Qt.RichText) self.service_deteils.setWordWrap(True) self.service_deteils.setOpenExternalLinks(True) self.service_deteils.setText(u"<a href=\"{0}\">{1}</a>, ".format( Client().geoservice_info_url(geoservice.get('id', u"")), self.tr('details') )) self.service_desc_layout.addWidget(self.service_deteils, 1, 1) self.service_report = QLabel(self) self.service_report.setTextFormat(Qt.RichText) self.service_report.setWordWrap(True) self.service_report.setOpenExternalLinks(True) self.service_report.setText(u"<a href=\"{0}\">{1}</a><div/>".format( Client().geoservice_report_url(geoservice.get('id', u"")), self.tr('report a problem') )) self.service_desc_layout.addWidget(self.service_report, 1, 2) self.service_desc_layout.setColumnStretch(2, 1) self.status_label = QLabel(self) self.status_label.setTextFormat(Qt.RichText) self.status_label.setText(u'\u2022') status = geoservice.get('cumulative_status', u'') if status == 'works': self.status_label.setStyleSheet("color: green; font-size: 30px") if status == 'failed': self.status_label.setStyleSheet("color: red; font-size: 30px") if status == 'problematic': self.status_label.setStyleSheet("color: yellow; font-size: 30px") self.layout.addWidget(self.status_label) self.addButton = QToolButton() self.addButton.setText(self.tr("Add")) self.addButton.clicked.connect(self.addToMap) self.layout.addWidget(self.addButton) self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Minimum) self.geoservice = geoservice self.image_ba = image_ba def addToMap(self): try: QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) client = Client() client.set_proxy(*QGISSettings.get_qgis_proxy()) geoservice_info = client.get_geoservice_info(self.geoservice) ds = DataSourceSerializer.read_from_json(geoservice_info) add_layer_to_map(ds) CachedServices().add_service(self.geoservice, self.image_ba) except Exception as ex: plPrint(unicode(ex)) pass finally: QApplication.restoreOverrideCursor() def mouseDoubleClickEvent(self, event): self.addToMap() def enterEvent(self, event): extent = self.geoservice.get('extent', None) if self.extent_renderer and extent: if ';' in extent: extent = extent.split(';')[1] geom = QgsGeometry.fromWkt(extent) self.extent_renderer.show_feature(geom) def leaveEvent(self, event): if self.extent_renderer: self.extent_renderer.clear_feature()
class PropertySheetWidget(QWidget): def __init__(self, wizard_page): QWidget.__init__(self) self._page = wizard_page self._glayout = QGridLayout() self._glayout.setContentsMargins(0, 0, 0, 0) self._glayout.setVerticalSpacing(4) self._glayout.setColumnStretch(4, 1) self._row_count = 0 self.setDefaultIndent() self.setLayout(self._glayout) def setDefaultIndent(self): self.setIndent(10) def setIndent(self, indent): self._glayout.setColumnMinimumWidth(0, indent) def newSection(self, title=None): if self._row_count > 0: self._glayout.setRowMinimumHeight(self._row_count, 10) self._row_count = self._row_count + 1 if title is not None: self._glayout.addWidget(QLabel(title), self._row_count, 0, 1, 4) self._row_count = self._row_count + 1 def add(self, label, ctrl=None, unit=None): label_col_span = 1 if ctrl is None: label_col_span = 3 if unit is None else 2 self._glayout.addWidget(label, self._row_count, 1, 1, label_col_span) if ctrl is not None: self._glayout.addWidget(ctrl, self._row_count, 2) if unit is not None: self._glayout.addWidget(unit, self._row_count, 3) self._row_count = self._row_count + 1 def addBoolProp(self, title, default_value, prop_name, style=PropertyStyle.CHECK): widget = None if style == PropertyStyle.CHECK: widget = QCheckBox(title) elif style == PropertyStyle.RADIO: widget = QRadioButton(title) else: raise Exception("Unsupported bool property style (#%d)!" % (style)) self._page.regProp(prop_name, WizProp(widget, default_value)) self.add(widget) return widget def addNumberProp(self, title, default_value, decimals, unit, prop_name, style=PropertyStyle.LABEL, default_state=PropertyState.CHECKED): edit = QLineEdit() edit.setAlignment(Qt.AlignRight) unit_label = QLabel(unit) self._page.regProp(prop_name, WizPropFloat(edit, default_value, decimals)) widget = None if PropertyStyle.LABEL == style: widget = QLabel(title) elif PropertyStyle.CHECK == style: widget = WidgetEnableCheckBox(title, [edit, unit_label]) self._page.regProp(prop_name + "_enabled", WizProp(widget, default_state)) elif PropertyStyle.RADIO == style: widget = WidgetEnableRadioButton(title, [edit, unit_label]) self._page.regProp(prop_name + "_enabled", WizProp(widget, default_state)) else: raise Exception("Unsupported number property style (#%d)!" % (style)) self.add(widget, edit, unit_label) return (widget, edit, unit_label) def addComboProp(self, title, options, default_value, prop_name): combo = QComboBox() for text, value in options: combo.addItem(text, value) self._page.regProp(prop_name, WizPropCombo(combo, default_value)) label = QLabel(title) self.add(label, combo) return (label, combo) def addStretch(self, amount): self._glayout.setRowStretch(self._row_count, amount) self._row_count = self._row_count + 1
class Ui_DistroMap(object): def setupUi(self, DistroMap): DistroMap.setObjectName("DistroMap") DistroMap.resize(439, 657) self.gridLayout_3 = QGridLayout(DistroMap) self.gridLayout_3.setObjectName("gridLayout_3") self.scrollArea = QScrollArea(DistroMap) self.scrollArea.setWidgetResizable(True) self.scrollArea.setObjectName("scrollArea") self.scrollAreaWidgetContents = QWidget() self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 419, 573)) self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") self.gridLayout_6 = QGridLayout(self.scrollAreaWidgetContents) self.gridLayout_6.setObjectName("gridLayout_6") self.verticalLayout = QVBoxLayout() self.verticalLayout.setObjectName("verticalLayout") self.label_5 = QLabel(self.scrollAreaWidgetContents) self.label_5.setObjectName("label_5") self.verticalLayout.addWidget(self.label_5) self.comboLocalities = QComboBox(self.scrollAreaWidgetContents) self.comboLocalities.setObjectName("comboLocalities") self.verticalLayout.addWidget(self.comboLocalities) self.gridLayout_6.addLayout(self.verticalLayout, 1, 0, 1, 1) self.horizontalLayout_6 = QHBoxLayout() self.horizontalLayout_6.setObjectName("horizontalLayout_6") self.verticalLayout_13 = QVBoxLayout() self.verticalLayout_13.setObjectName("verticalLayout_13") self.label_19 = QLabel(self.scrollAreaWidgetContents) self.label_19.setObjectName("label_19") self.verticalLayout_13.addWidget(self.label_19) self.horizontalLayout_3 = QHBoxLayout() self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.spnOutWidth = QSpinBox(self.scrollAreaWidgetContents) self.spnOutWidth.setMaximum(999999) self.spnOutWidth.setProperty("value", 325) self.spnOutWidth.setObjectName("spnOutWidth") self.horizontalLayout_3.addWidget(self.spnOutWidth) self.label_20 = QLabel(self.scrollAreaWidgetContents) self.label_20.setAlignment(Qt.AlignCenter) self.label_20.setObjectName("label_20") self.horizontalLayout_3.addWidget(self.label_20) self.spnOutHeight = QSpinBox(self.scrollAreaWidgetContents) self.spnOutHeight.setMaximum(999999) self.spnOutHeight.setProperty("value", 299) self.spnOutHeight.setObjectName("spnOutHeight") self.horizontalLayout_3.addWidget(self.spnOutHeight) self.verticalLayout_13.addLayout(self.horizontalLayout_3) self.horizontalLayout_6.addLayout(self.verticalLayout_13) self.horizontalLayout_5 = QHBoxLayout() self.horizontalLayout_5.setObjectName("horizontalLayout_5") self.verticalLayout_14 = QVBoxLayout() self.verticalLayout_14.setObjectName("verticalLayout_14") self.label_21 = QLabel(self.scrollAreaWidgetContents) sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_21.sizePolicy().hasHeightForWidth()) self.label_21.setSizePolicy(sizePolicy) self.label_21.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) self.label_21.setObjectName("label_21") self.verticalLayout_14.addWidget(self.label_21) self.horizontalLayout_4 = QHBoxLayout() self.horizontalLayout_4.setObjectName("horizontalLayout_4") spacerItem = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout_4.addItem(spacerItem) self.btnColour = QPushButton(self.scrollAreaWidgetContents) sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnColour.sizePolicy().hasHeightForWidth()) self.btnColour.setSizePolicy(sizePolicy) self.btnColour.setObjectName("btnColour") self.horizontalLayout_4.addWidget(self.btnColour) self.verticalLayout_14.addLayout(self.horizontalLayout_4) self.horizontalLayout_5.addLayout(self.verticalLayout_14) self.frmColour = QFrame(self.scrollAreaWidgetContents) sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.frmColour.sizePolicy().hasHeightForWidth()) self.frmColour.setSizePolicy(sizePolicy) self.frmColour.setMinimumSize(QSize(45, 45)) self.frmColour.setSizeIncrement(QSize(1, 1)) self.frmColour.setBaseSize(QSize(0, 0)) self.frmColour.setFrameShape(QFrame.StyledPanel) self.frmColour.setFrameShadow(QFrame.Raised) self.frmColour.setObjectName("frmColour") self.horizontalLayout_5.addWidget(self.frmColour) self.horizontalLayout_6.addLayout(self.horizontalLayout_5) self.gridLayout_6.addLayout(self.horizontalLayout_6, 4, 0, 1, 1) self.verticalLayout_2 = QVBoxLayout() self.verticalLayout_2.setObjectName("verticalLayout_2") self.label_6 = QLabel(self.scrollAreaWidgetContents) self.label_6.setObjectName("label_6") self.verticalLayout_2.addWidget(self.label_6) self.comboTaxonField = QComboBox(self.scrollAreaWidgetContents) self.comboTaxonField.setObjectName("comboTaxonField") self.verticalLayout_2.addWidget(self.comboTaxonField) self.gridLayout_6.addLayout(self.verticalLayout_2, 2, 0, 1, 1) self.verticalLayout_5 = QVBoxLayout() self.verticalLayout_5.setObjectName("verticalLayout_5") self.label_9 = QLabel(self.scrollAreaWidgetContents) self.label_9.setObjectName("label_9") self.verticalLayout_5.addWidget(self.label_9) self.horizontalLayout = QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.leOutDir = QLineEdit(self.scrollAreaWidgetContents) self.leOutDir.setPlaceholderText("") self.leOutDir.setObjectName("leOutDir") self.horizontalLayout.addWidget(self.leOutDir) self.btnBrowse = QPushButton(self.scrollAreaWidgetContents) self.btnBrowse.setObjectName("btnBrowse") self.horizontalLayout.addWidget(self.btnBrowse) self.verticalLayout_5.addLayout(self.horizontalLayout) self.gridLayout_6.addLayout(self.verticalLayout_5, 5, 0, 1, 1) self.verticalLayout_6 = QVBoxLayout() self.verticalLayout_6.setObjectName("verticalLayout_6") self.label = QLabel(self.scrollAreaWidgetContents) self.label.setObjectName("label") self.verticalLayout_6.addWidget(self.label) self.gridLayout = QGridLayout() self.gridLayout.setObjectName("gridLayout") self.label_2 = QLabel(self.scrollAreaWidgetContents) self.label_2.setObjectName("label_2") self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1) self.comboSecondary = QComboBox(self.scrollAreaWidgetContents) self.comboSecondary.setObjectName("comboSecondary") self.gridLayout.addWidget(self.comboSecondary, 1, 1, 1, 1) self.comboSurface = QComboBox(self.scrollAreaWidgetContents) self.comboSurface.setObjectName("comboSurface") self.gridLayout.addWidget(self.comboSurface, 2, 1, 1, 1) self.label_3 = QLabel(self.scrollAreaWidgetContents) self.label_3.setObjectName("label_3") self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1) self.label_4 = QLabel(self.scrollAreaWidgetContents) self.label_4.setObjectName("label_4") self.gridLayout.addWidget(self.label_4, 2, 0, 1, 1) self.comboBase = QComboBox(self.scrollAreaWidgetContents) self.comboBase.setObjectName("comboBase") self.gridLayout.addWidget(self.comboBase, 0, 1, 1, 1) self.gridLayout.setColumnStretch(0, 1) self.gridLayout.setColumnStretch(1, 3) self.verticalLayout_6.addLayout(self.gridLayout) self.gridLayout_6.addLayout(self.verticalLayout_6, 0, 0, 1, 1) self.verticalLayout_3 = QVBoxLayout() self.verticalLayout_3.setObjectName("verticalLayout_3") self.label_7 = QLabel(self.scrollAreaWidgetContents) self.label_7.setObjectName("label_7") self.verticalLayout_3.addWidget(self.label_7) self.comboGrid = QComboBox(self.scrollAreaWidgetContents) self.comboGrid.setObjectName("comboGrid") self.verticalLayout_3.addWidget(self.comboGrid) self.verticalLayout_4 = QVBoxLayout() self.verticalLayout_4.setObjectName("verticalLayout_4") self.label_8 = QLabel(self.scrollAreaWidgetContents) self.label_8.setObjectName("label_8") self.verticalLayout_4.addWidget(self.label_8) self.gridLayout_2 = QGridLayout() self.gridLayout_2.setObjectName("gridLayout_2") self.leMaxY = QLineEdit(self.scrollAreaWidgetContents) self.leMaxY.setObjectName("leMaxY") self.gridLayout_2.addWidget(self.leMaxY, 0, 1, 1, 1) self.leMinX = QLineEdit(self.scrollAreaWidgetContents) self.leMinX.setObjectName("leMinX") self.gridLayout_2.addWidget(self.leMinX, 1, 0, 1, 1) self.leMaxX = QLineEdit(self.scrollAreaWidgetContents) self.leMaxX.setObjectName("leMaxX") self.gridLayout_2.addWidget(self.leMaxX, 1, 2, 1, 1) self.leMinY = QLineEdit(self.scrollAreaWidgetContents) self.leMinY.setObjectName("leMinY") self.gridLayout_2.addWidget(self.leMinY, 2, 1, 1, 1) self.btnExtent = QPushButton(self.scrollAreaWidgetContents) self.btnExtent.setObjectName("btnExtent") self.gridLayout_2.addWidget(self.btnExtent, 1, 1, 1, 1) self.verticalLayout_4.addLayout(self.gridLayout_2) self.verticalLayout_3.addLayout(self.verticalLayout_4) self.gridLayout_6.addLayout(self.verticalLayout_3, 3, 0, 1, 1) self.scrollArea.setWidget(self.scrollAreaWidgetContents) self.gridLayout_3.addWidget(self.scrollArea, 0, 0, 1, 1) self.buttonBox = QDialogButtonBox(DistroMap) self.buttonBox.setOrientation(Qt.Horizontal) self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel|QDialogButtonBox.Ok) self.buttonBox.setObjectName("buttonBox") self.gridLayout_3.addWidget(self.buttonBox, 2, 0, 1, 1) self.progressBar = QProgressBar(DistroMap) self.progressBar.setProperty("value", 0) self.progressBar.setObjectName("progressBar") self.gridLayout_3.addWidget(self.progressBar, 1, 0, 1, 1) self.retranslateUi(DistroMap) self.buttonBox.rejected.connect(DistroMap.reject) QMetaObject.connectSlotsByName(DistroMap) def retranslateUi(self, DistroMap): DistroMap.setWindowTitle(QApplication.translate("DistroMap", "Distribution Map Generator", None)) self.label_5.setText(QApplication.translate("DistroMap", "Point localities layer", None)) self.label_19.setText(QApplication.translate("DistroMap", "Output resolution", None)) self.label_20.setText(QApplication.translate("DistroMap", "x", None)) self.label_21.setText(QApplication.translate("DistroMap", "Map background", None)) self.btnColour.setText(QApplication.translate("DistroMap", "Change", None)) self.label_6.setText(QApplication.translate("DistroMap", "Taxon identifier field", None)) self.label_9.setText(QApplication.translate("DistroMap", "Output directory", None)) self.btnBrowse.setText(QApplication.translate("DistroMap", "Browse...", None)) self.label.setText(QApplication.translate("DistroMap", "Background layers:", None)) self.label_2.setText(QApplication.translate("DistroMap", "Base", None)) self.label_3.setText(QApplication.translate("DistroMap", "Secondary", None)) self.label_4.setText(QApplication.translate("DistroMap", "Surface", None)) self.label_7.setText(QApplication.translate("DistroMap", "Grid layer", None)) self.label_8.setText(QApplication.translate("DistroMap", "Output extent:", None)) self.leMaxY.setText(QApplication.translate("DistroMap", "-21.00", None)) self.leMinX.setText(QApplication.translate("DistroMap", "14.75", None)) self.leMaxX.setText(QApplication.translate("DistroMap", "34.00", None)) self.leMinY.setText(QApplication.translate("DistroMap", "-36.00", None)) self.btnExtent.setText(QApplication.translate("DistroMap", "Use current", None))