class QuadInstanceItemWidget(QFrame): quadSelected = pyqtSignal() def __init__(self, quad): QWidget.__init__(self) self.setMouseTracking(True) self.quad = quad self.nameLabel = QLabel( f'<b>{quad[ID]}</b><br><span style="color:grey;">' f'{quad[PERCENT_COVERED]} % covered</span>') self.iconLabel = QLabel() pixmap = QPixmap(PLACEHOLDER_THUMB, 'SVG') thumb = pixmap.scaled(48, 48, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation) self.iconLabel.setPixmap(thumb) self.checkBox = QCheckBox("") self.checkBox.stateChanged.connect(self.check_box_state_changed) layout = QHBoxLayout() layout.setMargin(0) layout.addWidget(self.checkBox) vlayout = QVBoxLayout() vlayout.setMargin(0) vlayout.addWidget(self.iconLabel) self.iconWidget = QWidget() self.iconWidget.setFixedSize(48, 48) self.iconWidget.setLayout(vlayout) layout.addWidget(self.iconWidget) layout.addWidget(self.nameLabel) layout.addStretch() self.setLayout(layout) download_thumbnail(quad[LINKS][THUMBNAIL], self) self.footprint = QgsRubberBand(iface.mapCanvas(), QgsWkbTypes.PolygonGeometry) self.footprint.setFillColor(QUADS_AOI_COLOR) self.footprint.setStrokeColor(QUADS_AOI_COLOR) self.footprint.setWidth(2) self.footprintfill = QgsRubberBand(iface.mapCanvas(), QgsWkbTypes.PolygonGeometry) self.footprintfill.setFillColor(QUADS_AOI_BODY_COLOR) self.footprintfill.setWidth(0) self.update_footprint_brush() self.hide_solid_interior() self.show_footprint() self.setStyleSheet( "QuadInstanceItemWidget{border: 2px solid transparent;}") def set_thumbnail(self, img): pixmap = QPixmap(img) thumb = pixmap.scaled(48, 48, Qt.KeepAspectRatio, Qt.SmoothTransformation) self.iconLabel.setPixmap(thumb) self.iconLabel.setStyleSheet("") def check_box_state_changed(self): self.update_footprint_brush() self.quadSelected.emit() def show_footprint(self): coords = self.quad[BBOX] extent = qgsrectangle_for_canvas_from_4326_bbox_coords(coords) self.geom = QgsGeometry.fromRect(extent) self.footprint.setToGeometry(self.geom) self.footprintfill.setToGeometry(self.geom) def hide_footprint(self): self.footprint.reset(QgsWkbTypes.PolygonGeometry) self.footprintfill.reset(QgsWkbTypes.PolygonGeometry) def show_solid_interior(self): self.footprintfill.setBrushStyle(Qt.SolidPattern) self.footprintfill.updateCanvas() def hide_solid_interior(self): self.footprintfill.setBrushStyle(Qt.NoBrush) self.footprintfill.updateCanvas() def update_footprint_brush(self): self.footprint.setBrushStyle( Qt.BDiagPattern if self.checkBox.isChecked() else Qt.NoBrush) self.footprint.updateCanvas() def remove_footprint(self): iface.mapCanvas().scene().removeItem(self.footprint) iface.mapCanvas().scene().removeItem(self.footprintfill) def isSelected(self): return self.checkBox.isChecked() def setChecked(self, checked, emit=True): if not emit: self.checkBox.blockSignals(True) self.checkBox.setChecked(checked) if not emit: self.update_footprint_brush() self.checkBox.blockSignals(False) def enterEvent(self, event): self.setStyleSheet( "QuadInstanceItemWidget{border: 2px solid rgb(157, 165, 0);}") self.show_solid_interior() def leaveEvent(self, event): self.setStyleSheet( "QuadInstanceItemWidget{border: 2px solid transparent;}") self.hide_solid_interior()