def create_button(item_num, item_name, item_color, item_thematic_class): # save button config buttons[int(item_num)] = {"name": item_name, "color": item_color, "thematic_class": item_thematic_class} # create button QPButton = QPushButton(item_name) QPButton.setStyleSheet('QPushButton {color: ' + item_color + '}') QPButton.clicked.connect(lambda state, classif_id=item_num: self.classify_sample(classif_id)) QPButton.setAutoDefault(False) self.gridButtonsClassification.addWidget(QPButton, len(buttons) - 1, 0)
class PoleRow(object): """ Creates all input fields necessary to change the properties of a pole in the cable layout. The layout is identified by the position (index) it has in the vertical layout. """ ICON_ADD_ROW = ":/plugins/SeilaplanPlugin/gui/icons/icon_addrow.png" ICON_DEL_ROW = ":/plugins/SeilaplanPlugin/gui/icons/icon_bin.png" def __init__(self, parent, widget, layout, idx, nr, name, rowType, dist, distRange, height=False, angle=False, delBtn=False, addBtn=False): self.parent = parent self.widget = widget self.layout = layout self.index = idx self.rowType = rowType self.parent.poleCount += 1 self.row = QHBoxLayout() self.row.setAlignment(Qt.AlignLeft) self.labelNr = None self.statusSwitcher = None self.fieldName = None self.fieldDist = None self.fieldHeight = None self.fieldAngle = None self.addBtn = None self.delBtn = None self.addRowToLayout() self.addBtnPlus(addBtn) if self.rowType == 'anchor': self.addSwitcher() else: self.addLabelNr(nr) self.addFieldName(name) self.addFieldDist(dist, distRange) if self.rowType not in ['anchor']: self.addFieldHeight(height) self.addFieldAngle(angle) self.addBtnDel(delBtn) def addRowToLayout(self): if self.index == self.parent.poleCount: # Add layout at the end self.layout.addLayout(self.row) else: # Insert new row between existing ones self.layout.insertLayout(self.index + 1, self.row) def addSwitcher(self): self.statusSwitcher = QCheckBox(self.widget) self.statusSwitcher.setText('') self.statusSwitcher.setFixedWidth(20) self.statusSwitcher.setChecked(True) self.row.addWidget(self.statusSwitcher) # Connect events self.statusSwitcher.stateChanged.connect( lambda newVal: self.parent.onRowChange(newVal == 2, self.index, 'active')) def addLabelNr(self, nr): self.labelNr = QLabel(self.widget) self.labelNr.setFixedWidth(20) self.labelNr.setAlignment(Qt.AlignVCenter | Qt.AlignRight) self.row.addWidget(self.labelNr) if nr: self.labelNr.setText(f"{nr}:") def updateIndex(self, idx): self.index = idx def updateLabelNr(self, label): if self.labelNr: if label: self.labelNr.setText(f"{label}:") else: self.labelNr.setText("") def addFieldName(self, value): self.fieldName = QLineEditWithFocus(self.widget) self.fieldName.setFocusPolicy(Qt.ClickFocus) self.fieldName.setFixedWidth(200) self.fieldName.setText(value) self.row.addWidget(self.fieldName) # Connect events self.fieldName.inFocus.connect( lambda x: self.parent.zoomIn(self.index)) self.fieldName.outFocus.connect(self.parent.zoomOut) self.fieldName.textChanged.connect( lambda newVal: self.parent.onRowChange(newVal, self.index, 'name')) def addFieldDist(self, value, distRange): self.fieldDist = QDoubleSpinBoxWithFocus(self.widget) self.fieldDist.setFocusPolicy(Qt.ClickFocus) self.fieldDist.setDecimals(0) self.fieldDist.setSingleStep(self.parent.pole_dist_step) self.fieldDist.setSuffix(" m") self.fieldDist.setFixedWidth(95) self.fieldDist.setRange(float(distRange[0]), float(distRange[1])) self.fieldDist.setValue(float(value)) self.row.addWidget(self.fieldDist) # Connect events self.fieldDist.inFocus.connect( lambda x: self.parent.zoomIn(self.index)) self.fieldDist.outFocus.connect(self.parent.zoomOut) self.fieldDist.valueChanged.connect( lambda newVal: self.parent.onRowChange(newVal, self.index, 'd')) def addFieldHeight(self, value): if value is False: return self.fieldHeight = QDoubleSpinBoxWithFocus(self.widget) self.fieldHeight.setFocusPolicy(Qt.ClickFocus) self.fieldHeight.setDecimals(1) self.fieldHeight.setSingleStep(self.parent.pole_height_step) # Pole rows with type fixed are only used in profile window, so before # optimization. That's why they only have 1 meter resolution. if self.rowType == 'fixed': self.fieldHeight.setDecimals(0) self.fieldHeight.setSingleStep(1) self.fieldHeight.setSuffix(" m") self.fieldHeight.setFixedWidth(95) self.fieldHeight.setRange(0.0, 50.0) if value is not None: self.fieldHeight.setValue(float(value)) self.row.addWidget(self.fieldHeight) # Connect events self.fieldHeight.inFocus.connect( lambda x: self.parent.zoomIn(self.index)) self.fieldHeight.outFocus.connect(self.parent.zoomOut) self.fieldHeight.valueChanged.connect( lambda newVal: self.parent.onRowChange(newVal, self.index, 'h')) def addFieldAngle(self, value): if value is False: return self.fieldAngle = QSpinBoxWithFocus(self.widget) self.fieldAngle.setFocusPolicy(Qt.ClickFocus) self.fieldAngle.setSuffix(" °") self.fieldAngle.setFixedWidth(60) self.fieldAngle.setRange(-180, 180) if value is not None: self.fieldAngle.setValue(int(value)) self.row.addWidget(self.fieldAngle) # Connect events self.fieldAngle.inFocus.connect( lambda x: self.parent.zoomIn(self.index)) self.fieldAngle.outFocus.connect(self.parent.zoomOut) self.fieldAngle.valueChanged.connect( lambda newVal: self.parent.onRowChange(newVal, self.index, 'angle' )) def addBtnPlus(self, createButton): if createButton is False: self.row.addSpacing(33) return self.addBtn = QPushButton(self.widget) self.addBtn.setMaximumSize(QSize(27, 27)) icon = QIcon() icon.addPixmap(QPixmap(PoleRow.ICON_ADD_ROW), QIcon.Normal, QIcon.Off) self.addBtn.setIcon(icon) self.addBtn.setIconSize(QSize(16, 16)) self.addBtn.setToolTip( self.tr('Fuegt eine neue Stuetze nach dieser hinzu')) self.addBtn.setAutoDefault(False) self.row.addWidget(self.addBtn) self.addBtn.clicked.connect(lambda x: self.parent.onRowAdd(self.index)) def addBtnDel(self, createButton): if createButton is False: self.row.addSpacing(33) return self.delBtn = QPushButton(self.widget) self.delBtn.setMaximumSize(QSize(27, 27)) icon = QIcon() icon.addPixmap(QPixmap(PoleRow.ICON_DEL_ROW), QIcon.Normal, QIcon.Off) self.delBtn.setIcon(icon) self.delBtn.setIconSize(QSize(16, 16)) self.delBtn.setToolTip(self.tr('Loescht die Stuetze')) self.delBtn.setAutoDefault(False) self.row.addWidget(self.delBtn) self.delBtn.clicked.connect(lambda x: self.parent.onRowDel(self.index)) def updateLowerDistRange(self, minimum): self.fieldDist.setMinimum(minimum) def updateUpperDistRange(self, maximum): self.fieldDist.setMaximum(maximum) def activate(self): self.statusSwitcher.blockSignals(True) self.statusSwitcher.setChecked(True) self.statusSwitcher.blockSignals(False) self.fieldName.setEnabled(True) self.fieldDist.setEnabled(True) def deactivate(self): self.statusSwitcher.blockSignals(True) self.statusSwitcher.setChecked(False) self.statusSwitcher.blockSignals(False) self.fieldName.setEnabled(False) self.fieldDist.setEnabled(False) def remove(self): # Disconnect all widgets self.fieldName.disconnect() self.fieldDist.disconnect() if self.fieldHeight: self.fieldHeight.disconnect() if self.fieldAngle: self.fieldAngle.disconnect() if self.addBtn: self.addBtn.disconnect() if self.delBtn: self.delBtn.disconnect() for i in reversed(range(self.row.count())): item = self.row.takeAt(i) widget = item.widget() if widget is not None: widget.deleteLater() else: # For spacers self.row.removeItem(item) self.layout.removeItem(self.row) self.parent.poleCount -= 1 # noinspection PyMethodMayBeStatic def tr(self, message, **kwargs): """Get the translation for a string using Qt translation API. We implement this ourselves since we do not inherit QObject. :param message: String for translation. :type message: str, QString :returns: Translated version of message. :rtype: QString Parameters ---------- **kwargs """ # noinspection PyTypeChecker,PyArgumentList,PyCallByClass return QCoreApplication.translate(type(self).__name__, message)