class QDrawLayerDialog(QDialog): def __init__(self, iface, gtype): QDialog.__init__(self) self.setWindowTitle(self.tr('Drawing')) self.name = QLineEdit() if gtype == 'point' or gtype == 'XYpoint': gtype = 'Point' elif gtype == 'line': gtype = 'LineString' else: gtype = 'Polygon' # change here by QgsMapLayerComboBox() self.layerBox = QComboBox() self.layers = [] for layer in QgsProject.instance().mapLayers().values(): if layer.providerType() == "memory": # ligne suivante à remplacer par if layer.geometryType() == : if gtype in layer.dataProvider().dataSourceUri()[:26]: # must be of the same type of the draw if 'field='+self.tr('Drawings')+':string(255,0)' in layer.dataProvider().dataSourceUri()[-28:]: # must have its first field named Drawings, string type self.layers.append(layer) self.layerBox.addItem(layer.name()) self.addLayer = QCheckBox(self.tr('Add to an existing layer')) self.addLayer.toggled.connect(self.addLayerChecked) buttons = QDialogButtonBox( QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self) buttons.accepted.connect(self.accept) buttons.rejected.connect(self.reject) vbox = QVBoxLayout() vbox.addWidget(QLabel(self.tr("Give a name to the feature:"))) vbox.addWidget(self.name) vbox.addWidget(self.addLayer) vbox.addWidget(self.layerBox) if len(self.layers) == 0: self.addLayer.setEnabled(False) self.layerBox.setEnabled(False) vbox.addWidget(buttons) self.setLayout(vbox) self.layerBox.setEnabled(False) self.name.setFocus() def tr(self, message): return QCoreApplication.translate('Qdraw', message) def addLayerChecked(self): if self.addLayer.checkState() == Qt.Checked: self.layerBox.setEnabled(True) else: self.layerBox.setEnabled(False) def getName(self, iface, gtype): dialog = QDrawLayerDialog(iface, gtype) result = dialog.exec_() return ( dialog.name.text(), dialog.addLayer.checkState() == Qt.Checked, dialog.layerBox.currentIndex(), dialog.layers, result == QDialog.Accepted)
class ItemWidgetBase(QFrame): checkedStateChanged = pyqtSignal() thumbnailChanged = pyqtSignal() def __init__(self, item): QFrame.__init__(self) self.item = item self.is_updating_checkbox = False self.setMouseTracking(True) self.setStyleSheet("ItemWidgetBase{border: 2px solid transparent;}") def _setup_ui(self, text, thumbnailurl): self.lockLabel = QLabel() iconSize = QSize(16, 16) self.lockLabel.setPixmap(LOCK_ICON.pixmap(iconSize)) self.checkBox = QCheckBox("") self.checkBox.clicked.connect(self.check_box_state_changed) self.nameLabel = QLabel(text) self.iconLabel = QLabel() self.labelZoomTo = QLabel() self.labelZoomTo.setPixmap(ZOOMTO_ICON.pixmap(QSize(18, 18))) self.labelZoomTo.setToolTip("Zoom to extent") self.labelZoomTo.mousePressEvent = self.zoom_to_extent self.labelAddPreview = QLabel() self.labelAddPreview.setPixmap(ADD_PREVIEW_ICON.pixmap(QSize(18, 18))) self.labelAddPreview.setToolTip("Add preview layer to map") self.labelAddPreview.mousePressEvent = self._add_preview_clicked layout = QHBoxLayout() layout.setMargin(0) layout.addWidget(self.checkBox) layout.addWidget(self.lockLabel) pixmap = QPixmap(PLACEHOLDER_THUMB, "SVG") self.thumbnail = None thumb = pixmap.scaled(48, 48, Qt.KeepAspectRatio, Qt.SmoothTransformation) self.iconLabel.setPixmap(thumb) self.iconLabel.setFixedSize(48, 48) layout.addWidget(self.iconLabel) if thumbnailurl is not None: download_thumbnail(thumbnailurl, self) layout.addWidget(self.nameLabel) layout.addStretch() layout.addWidget(self.labelZoomTo) layout.addWidget(self.labelAddPreview) layout.addSpacing(10) self.setLayout(layout) self.footprint = QgsRubberBand(iface.mapCanvas(), QgsWkbTypes.PolygonGeometry) self.footprint.setStrokeColor(PLANET_COLOR) self.footprint.setWidth(2) def set_thumbnail(self, img): self.thumbnail = QPixmap(img) thumb = self.thumbnail.scaled(48, 48, Qt.KeepAspectRatio, Qt.SmoothTransformation) self.iconLabel.setPixmap(thumb) self.thumbnailChanged.emit() def is_selected(self): return self.checkBox.checkState() == Qt.Checked def _geom_bbox_in_project_crs(self): transform = QgsCoordinateTransform( QgsCoordinateReferenceSystem("EPSG:4326"), QgsProject.instance().crs(), QgsProject.instance(), ) return transform.transformBoundingBox(self.geom.boundingBox()) def _geom_in_project_crs(self): transform = QgsCoordinateTransform( QgsCoordinateReferenceSystem("EPSG:4326"), QgsProject.instance().crs(), QgsProject.instance(), ) geom = QgsGeometry(self.geom) geom.transform(transform) return geom def show_footprint(self): self.footprint.setToGeometry(self._geom_in_project_crs()) def hide_footprint(self): self.footprint.reset(QgsWkbTypes.PolygonGeometry) def enterEvent(self, event): self.setStyleSheet( "ItemWidgetBase{border: 2px solid rgb(0, 157, 165);}") self.show_footprint() def leaveEvent(self, event): self.setStyleSheet("ItemWidgetBase{border: 2px solid transparent;}") self.hide_footprint() def zoom_to_extent(self, evt): rect = QgsRectangle(self._geom_bbox_in_project_crs()) rect.scale(1.05) iface.mapCanvas().setExtent(rect) iface.mapCanvas().refresh() def _add_preview_clicked(self, evt): self.add_preview() @waitcursor def add_preview(self): send_analytics_for_preview(self.item.images()) create_preview_group(self.name(), self.item.images()) def check_box_state_changed(self): self.update_children_items() self.update_parent_item() self.checkedStateChanged.emit() def update_parent_item(self): parent = self.item.parent() if parent is not None: w = parent.treeWidget().itemWidget(parent, 0) w.update_checkbox() def update_children_items(self): total = self.item.childCount() if self.checkBox.isTristate(): self.checkBox.setTristate(False) self.checkBox.setChecked(False) for i in range(total): w = self.item.treeWidget().itemWidget(self.item.child(i), 0) w.set_checked(self.checkBox.isChecked()) def update_checkbox(self): selected = 0 total = self.item.childCount() for i in range(total): w = self.item.treeWidget().itemWidget(self.item.child(i), 0) if w.is_selected(): selected += 1 if selected == total: self.checkBox.setTristate(False) self.checkBox.setCheckState(Qt.Checked) elif selected == 0: self.checkBox.setTristate(False) self.checkBox.setCheckState(Qt.Unchecked) else: self.checkBox.setTristate(True) self.checkBox.setCheckState(Qt.PartiallyChecked) def set_checked(self, checked): self.checkBox.setChecked(checked) self.update_children_items() def update_thumbnail(self): thumbnails = self.scene_thumbnails() if thumbnails and None not in thumbnails: bboxes = [img[GEOMETRY] for img in self.item.images()] pixmap = createCompoundThumbnail(bboxes, thumbnails) thumb = pixmap.scaled(48, 48, Qt.KeepAspectRatio, Qt.SmoothTransformation) self.iconLabel.setPixmap(thumb) self.thumbnailChanged.emit() def scene_thumbnails(self): thumbnails = [] try: for i in range(self.item.childCount()): w = self.item.treeWidget().itemWidget(self.item.child(i), 0) thumbnails.extend(w.scene_thumbnails()) except RuntimeError: # item might not exist anymore. In this case, we just return # an empty list pass return thumbnails
class QDrawLayerDialog(QDialog): def __init__(self, iface, gtype): QDialog.__init__(self) self.setWindowTitle(self.tr('Drawing')) self.name = QLineEdit() if gtype == 'point' or gtype == 'XYpoint': gtype = 'Point' elif gtype == 'line': gtype = 'LineString' else: gtype = 'Polygon' # change here by QgsMapLayerComboBox() self.layerBox = QComboBox() self.layers = [] for layer in QgsProject.instance().mapLayers().values(): if layer.providerType() == "memory": # ligne suivante à remplacer par if layer.geometryType() == : if gtype in layer.dataProvider().dataSourceUri( )[:26]: # must be of the same type of the draw if 'field=' + self.tr( 'Drawings' ) + ':string(255,0)' in layer.dataProvider().dataSourceUri( )[-28:]: # must have its first field named Drawings, string type self.layers.append(layer) self.layerBox.addItem(layer.name()) self.addLayer = QCheckBox(self.tr('Add to an existing layer')) self.addLayer.toggled.connect(self.addLayerChecked) buttons = QDialogButtonBox( QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self) buttons.accepted.connect(self.accept) buttons.rejected.connect(self.reject) vbox = QVBoxLayout() vbox.addWidget(QLabel(self.tr("Give a name to the feature:"))) vbox.addWidget(self.name) vbox.addWidget(self.addLayer) vbox.addWidget(self.layerBox) if len(self.layers) == 0: self.addLayer.setEnabled(False) self.layerBox.setEnabled(False) vbox.addWidget(buttons) self.setLayout(vbox) self.layerBox.setEnabled(False) self.name.setFocus() def tr(self, message): return QCoreApplication.translate('Qdraw', message) def addLayerChecked(self): if self.addLayer.checkState() == Qt.Checked: self.layerBox.setEnabled(True) else: self.layerBox.setEnabled(False) def getName(self, iface, gtype): dialog = QDrawLayerDialog(iface, gtype) result = dialog.exec_() return (dialog.name.text(), dialog.addLayer.checkState() == Qt.Checked, dialog.layerBox.currentIndex(), dialog.layers, result == QDialog.Accepted)