class LayerItemWidget(QWidget): def __init__(self, layer, parent=None): super(LayerItemWidget, self).__init__(parent) self.layer = layer self.layout = QHBoxLayout() self.check = QCheckBox() self.check.setText(layer.name()) self.labelMetadata = QLabel() self.labelMetadata.setFixedWidth(50) self.labelData = QLabel() self.labelData.setFixedWidth(50) self.layout.addWidget(self.check) self.layout.addWidget(self.labelData) self.layout.addWidget(self.labelMetadata) self.setLayout(self.layout) def name(self): return self.layer.name() def iconPath(self, server): return os.path.join(os.path.dirname(os.path.dirname(__file__)), "icons", "%s.png" % server.__class__.__name__.lower()[:-6]) def setMetadataPublished(self, server): self.labelMetadata.setPixmap(QPixmap(self.iconPath(server))) def setDataPublished(self, server): self.labelData.setPixmap(QPixmap(self.iconPath(server))) def checked(self): return self.check.isChecked() def setCheckState(self, state): self.check.setCheckState(state)
def _create_labels(self): for i in range(len(self.steps)): if i != 0: spacer = QSpacerItem( self.label_spacing_width, 0, QSizePolicy.Expanding, QSizePolicy.Minimum, ) self.layout_labels.addItem(spacer) label = QLabel(self.steps[i]) label.font_size = 11 label.setWordWrap(True) label.setAlignment(Qt.AlignCenter) label.setFixedWidth(self.label_width) self.layout_labels.addWidget(label) self.widgets[i].append(label)
def _create_bar(self): for i in range(len(self.steps)): self.widgets[i] = [] if i != 0: line = QFrame() line.setFrameShape(QFrame.HLine) line.setLineWidth(3) line.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) line.setFixedHeight(self.bar_height) self.layout_bar.addWidget(line) self.widgets[i].append(line) dot = QLabel("•") dot.font_size = self.bar_height * 2.6 dot.setFixedWidth(self.dot_width) dot.setFixedHeight(self.bar_height) dot.setAlignment(Qt.AlignCenter) self.layout_bar.addWidget(dot) self.widgets[i].append(dot)
class LayerItemWidget(QWidget): def __init__(self, layer, parent=None): super(LayerItemWidget, self).__init__(parent) self.layer = layer self.layout = QHBoxLayout() self.check = QCheckBox() self.check.setText(layer.name()) if layer.type() == layer.VectorLayer: self.check.setIcon( QgsApplication().getThemeIcon('/mIconLineLayer.svg')) else: self.check.setIcon( QgsApplication().getThemeIcon('/mIconRaster.svg')) self.labelMetadata = QLabel() self.labelMetadata.setFixedWidth(50) self.labelData = QLabel() self.labelData.setFixedWidth(50) self.layout.addWidget(self.check) self.layout.addWidget(self.labelData) self.layout.addWidget(self.labelMetadata) self.setLayout(self.layout) def name(self): return self.layer.name() @staticmethod def setIcon(label, server): pixmap = QPixmap( files.getIconPath(server.__class__.__name__.lower()[:-6])) label.setPixmap(pixmap) def setMetadataPublished(self, server): self.setIcon(self.labelMetadata, server) def setDataPublished(self, server): self.setIcon(self.labelData, server) def checked(self): return self.check.isChecked() def setCheckState(self, state): self.check.setCheckState(state)
class ServerItemWidget(QWidget): def __init__(self, server_class, server_name, parent=None): """ Widget used by the list widget control to show all available server instances. """ super(ServerItemWidget, self).__init__(parent) icon = server_class.getWidgetClass().getPngIcon() self.layout = QHBoxLayout() self.label = QLabel() self.serverName = server_name self.iconLabel = QLabel() self.iconLabel.setPixmap(icon) self.iconLabel.setFixedWidth(50) self.layout.addWidget(self.iconLabel) self.layout.addWidget(self.label) self.setLayout(self.layout) @property def serverName(self): return self.label.text() @serverName.setter def serverName(self, name): self.label.setText(name)
class ServerItemWidget(QWidget): def __init__ (self, server, parent = None): super(ServerItemWidget, self).__init__(parent) self.server = server self.layout = QHBoxLayout() self.label = QLabel() self.label.setText(server.name) self.iconLabel = QLabel() self.iconLabel.setPixmap(QPixmap(self.iconPath(server))) self.iconLabel.setFixedWidth(50) self.layout.addWidget(self.iconLabel) self.layout.addWidget(self.label) self.setLayout(self.layout) def iconPath(self, server): return os.path.join(os.path.dirname(os.path.dirname(__file__)), "icons", "%s_black.png" % self.server.__class__.__name__.lower()[:-6]) def setServerName(self, name): self.label.setText(name) def serverName(self): return self.label.text()
class LayerItemWidget(QWidget): def __init__(self, layer, parent=None): super(LayerItemWidget, self).__init__(parent) self._name = layer.name() self._id = layer.id() self._checkbox = QCheckBox() self._checkbox.setText(self._name) if layer.type() == layer.VectorLayer: self._checkbox.setIcon(QgsApplication.getThemeIcon('/mIconLineLayer.svg')) else: self._checkbox.setIcon(QgsApplication.getThemeIcon('/mIconRaster.svg')) self._metalabel = QLabel() self._metalabel.setFixedWidth(20) self._datalabel = QLabel() self._datalabel.setFixedWidth(20) layout = QHBoxLayout() layout.addWidget(self._checkbox) layout.addWidget(self._datalabel) layout.addWidget(self._metalabel) self.setLayout(layout) @property def name(self): """ Returns the corresponding layer name of the current list widget item. """ return self._name @property def id(self): """ Returns the QGIS layer ID of the current list widget item. """ return self._id @staticmethod def _setIcon(label, server) -> bool: """ Sets the server icon on the layer item widget if it has been published to that server. :returns: True if the icon was set, False if it was not (or removed). """ if not isinstance(server, manager.bases.AbstractServer): if label.pixmap(): # Remove existing pixmap label.pixmap().swap(QPixmap()) return False server_widget = server.__class__.getWidgetClass() pixmap = server_widget.getPngIcon() if server_widget else QPixmap() if not pixmap.isNull(): pixmap = pixmap.scaled(label.width(), label.height(), Qt.KeepAspectRatio, Qt.SmoothTransformation) label.setPixmap(pixmap) return not pixmap.isNull() def setMetadataPublished(self, server): if self._setIcon(self._metalabel, server): self._metalabel.setToolTip(f"Metadata published to '{server.serverName}'") else: self._metalabel.setToolTip('') def setDataPublished(self, server): if self._setIcon(self._datalabel, server): self._datalabel.setToolTip(f"Geodata published to '{server.serverName}'") else: self._datalabel.setToolTip('') @property def checked(self) -> bool: """ Returns True if the list widget item checkbox is in a checked state. """ return self._checkbox.isChecked() def setCheckbox(self, state: bool): self._checkbox.setCheckState(Qt.Checked if state else Qt.Unchecked)
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)