def __init__(self, attribute='', min_values=[], max_values=[]): """ constructor """ super(DialogAttrRanges, self).__init__() self.ui = Ui_attrRangesDialog() self.ui.setupUi(self) self.setFixedSize(self.size()) # additional table UI adjustment self.ui.table_ranges.verticalHeader().hide() self.ui.table_ranges.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.ui.table_ranges.horizontalHeader().resizeSection(0, self.ui.table_ranges.width() * 0.5) self.ui.table_ranges.horizontalHeader().resizeSection(1, self.ui.table_ranges.width() * 0.5) self.ui.table_ranges.itemChanged.connect(self.verifyData) self.set_values(attribute, min_values, max_values) # connect slot (ui event) self.ui.buttons.accepted.connect(self.accept) self.ui.buttons.rejected.connect(self.reject) self.ui.btn_add.clicked.connect(self.add_range) self.ui.btn_delete.clicked.connect(self.remove_range)
class DialogAttrRanges(Ui_attrRangesDialog, QDialog): """ dialog specifying options for creating mapping scheme """ BUILD_EMPTY, BUILD_FROM_SURVEY=range(2) def __init__(self, attribute='', min_values=[], max_values=[]): """ constructor """ super(DialogAttrRanges, self).__init__() self.ui = Ui_attrRangesDialog() self.ui.setupUi(self) self.setFixedSize(self.size()) # additional table UI adjustment self.ui.table_ranges.verticalHeader().hide() self.ui.table_ranges.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.ui.table_ranges.horizontalHeader().resizeSection(0, self.ui.table_ranges.width() * 0.5) self.ui.table_ranges.horizontalHeader().resizeSection(1, self.ui.table_ranges.width() * 0.5) self.ui.table_ranges.itemChanged.connect(self.verifyData) self.set_values(attribute, min_values, max_values) # connect slot (ui event) self.ui.buttons.accepted.connect(self.accept) self.ui.buttons.rejected.connect(self.reject) self.ui.btn_add.clicked.connect(self.add_range) self.ui.btn_delete.clicked.connect(self.remove_range) @property def min_values(self): return self.range_values[0] @property def max_values(self): return self.range_values[1] @logUICall @pyqtSlot() def add_range(self): self.ui.table_ranges.insertRow(self.ui.table_ranges.rowCount()) self.range_values[0].append(None) self.range_values[1].append(None) @logUICall @pyqtSlot() def remove_range(self): self.ui.table_ranges.removeRow(self.ui.table_ranges.rowCount()-1) self.range_values[0].pop() self.range_values[1].pop() @logUICall @pyqtSlot(QObject) def verifyData(self, item): """ callback at each table value update. two checks - value is integer - range is valid with new value """ item_val = item.data(Qt.DisplayRole) if item_val == QVariant('None'): return int_val = item_val.toInt() row, col = item.row(), item.column() if int_val[1]: # is integer # set value self.range_values[col][row] = int_val[0] # allow set range only if is valid range_is_valid = False try: range_is_valid = self.is_range_valid() except SIDDRangeGroupException as err: # error means not valid self.ui.lb_notes.setText(err.message) except Exception as err: # error means not valid self.ui.lb_notes.setText(err.message) self.ui.buttons.button(QDialogButtonBox.Ok).setEnabled(range_is_valid) else: # not integer # restore logUICall.log(get_ui_string('dlg.attr.value.error'), logUICall.WARNING) self.ui.table_ranges.setItem(row, col, QTableWidgetItem('%s'%self.range_values[col][row])) # public method ############################### def set_values(self, attribute, min_values, max_values): """ set data for the table """ self.ui.lb_attribute.setText(attribute) self.range_values = [min_values, max_values] table = self.ui.table_ranges table.clearContents() table.setRowCount(0) for i, min_val, max_val in map(None, range(len(min_values)), min_values, max_values): table.insertRow(i) table.setItem(i, 0, QTableWidgetItem('%s'%min_val)) table.setItem(i, 1, QTableWidgetItem('%s'%max_val)) # internal helper methods ############################### def is_range_valid(self): is_valid = True self.ui.lb_notes.setText("") for i in range(len(self.range_values[0])): # minimum must be less than maximum in same row max_val = self.range_values[1][i] min_val = self.range_values[0][i] is_valid = (min_val <= max_val) if not is_valid: # use exception to stop additional checks raise SIDDRangeGroupException(get_ui_string("dlg.attr.error.max", (max_val, min_val))) # and minimum must be exactly 1 larger than maximum from previous row if i > 0: # first row does not have previous max_last = self.range_values[1][i-1] is_valid = (min_val == max_last+1) if not is_valid: # use exception to stop additional checks raise SIDDRangeGroupException(get_ui_string("dlg.attr.error.range", (max_last, min_val))) return is_valid