def draw_background(self, painter, outline=True): old_pen = painter.pen() old_brush = painter.brush() p = QPen() b = QBrush() if self.__selected: p.setColor(QColor("#ffff99")) p.setWidth(2) b.setColor(QColor("#ffff66")) b.setStyle(Qt.SolidPattern) if self.__selected: painter.setBrush(b) painter.setPen(p) painter.drawRect(1, 0, self.boundingRect().width()-1, self.boundingRect().height()-1) if outline: painter.setBrush(QBrush()) painter.setPen(QPen()) painter.drawRect(0, 0, self.boundingRect().width(), self.boundingRect().height()-1) painter.setBrush(old_brush) painter.setPen(old_pen)
class GPSMarker(QgsMapCanvasItem): def __init__(self, canvas): super(GPSMarker, self).__init__(canvas) self.canvas = canvas self._quaility = 0 self._heading = 0 self.size = roam.config.settings.get('gps', {}).get('marker_size', 24) self.red = Qt.darkRed self.blue = QColor(129, 173, 210) self.green = Qt.darkGreen self._gpsinfo = QgsGpsInformation() self.pointbrush = QBrush(self.red) self.pointpen = QPen(Qt.black) self.pointpen.setWidth(1) self.map_pos = QgsPoint(0.0, 0.0) self.gps = None def setgps(self, gps): self.gps = gps def setSize(self, size): self.size = size def paint(self, painter, xxx, xxx2): self.setPos(self.toCanvasCoordinates(self.map_pos)) halfSize = self.size / 2.0 rect = QRectF(0 - halfSize, 0 - halfSize, self.size, self.size) painter.setRenderHint(QPainter.Antialiasing) if self.quality == 0: color = self.red elif self.quality == 1: color = self.green elif self.quality >= 2: color = self.blue else: color = self.red self.pointpen.setColor(Qt.gray) self.pointpen.setWidth(2) self.pointbrush.setColor(color) painter.setBrush(self.pointbrush) painter.setPen(self.pointpen) y = 0 - halfSize x = rect.width() / 2 - halfSize line = QLine(x, y, x, rect.height() - halfSize) y = rect.height() / 2 - halfSize x = 0 - halfSize line2 = QLine(x, y, rect.width() - halfSize, y) # Arrow p = QPolygonF() p.append(QPoint(0 - halfSize, 0)) p.append(QPoint(0, -self.size)) x = rect.width() - halfSize p.append(QPoint(x, 0)) p.append(QPoint(0, 0)) offsetp = QPolygonF() offsetp.append(QPoint(0 - halfSize, 0)) offsetp.append(QPoint(0, -self.size)) x = rect.width() - halfSize offsetp.append(QPoint(x, 0)) offsetp.append(QPoint(0, 0)) waypoint = self.gps.waypoint if waypoint: az = self.map_pos.azimuth(waypoint) painter.save() painter.rotate(az) self.pointbrush.setColor(Qt.red) painter.setBrush(self.pointbrush) path = QPainterPath() path.addPolygon(offsetp) painter.drawPath(path) painter.restore() painter.save() painter.rotate(self._heading) path = QPainterPath() path.addPolygon(p) painter.drawPath(path) painter.restore() painter.drawEllipse(rect) painter.drawLine(line) painter.drawLine(line2) def boundingRect(self): halfSize = self.size / 2.0 size = self.size * 2 return QRectF(-size, -size, 2.0 * size, 2.0 * size) @property def quality(self): return self._gpsinfo.quality @quality.setter def quality(self, value): self._quaility = value self.update() def setCenter(self, map_pos, gpsinfo): self._heading = gpsinfo.direction self._gpsinfo = gpsinfo self.map_pos = QgsPointXY(map_pos) self.setPos(self.toCanvasCoordinates(self.map_pos)) def updatePosition(self): self.setCenter(self.map_pos, self._gpsinfo)
def paint(self, painter, option, widget): if not painter: return painter.save() painter.setRenderHint(QPainter.Antialiasing, True) # do a bit of trigonometry to find out how to transform a rotated item such # that the center point is at the point feature x = 0.0 y = 0.0 if self.pixmap.width() > 0 and self.pixmap.height() > 0: half_item_diagonal = math.sqrt( self.pixmap.width() * self.pixmap.width() + self.pixmap.height() * self.pixmap.height()) / 2 diagonal_angle = math.acos( self.pixmap.width() / (half_item_diagonal * 2)) * 180 / math.pi x = half_item_diagonal * math.cos( (self.rotation - diagonal_angle) * math.pi / 180) y = half_item_diagonal * math.sin( (self.rotation - diagonal_angle) * math.pi / 180) painter.rotate(self.rotation) painter.translate(x - self.pixmap.width() / 2.0, -y - self.pixmap.height() / 2.0) painter.drawPixmap(0, 0, self.pixmap) # draw arrow, using a red line over a thicker white line so that the arrow is visible # against a range of backgrounds pen = QPen() pen.setWidth(GuiUtils.scale_icon_size(4)) pen.setColor(QColor(Qt.white)) painter.setPen(pen) painter.drawPath(self.arrow_path) pen.setWidth(GuiUtils.scale_icon_size(1)) pen.setColor(QColor(Qt.red)) painter.setPen(pen) painter.drawPath(self.arrow_path) painter.restore() # draw numeric value beside the symbol painter.save() painter.setRenderHint(QPainter.Antialiasing, True) buffer_pen = QPen() buffer_pen.setColor(Qt.white) buffer_pen.setWidthF(GuiUtils.scale_icon_size(4)) fm = QFontMetricsF(self.marker_font) label = QPainterPath() label.addText(self.pixmap.width(), self.pixmap.height() / 2.0 + fm.height() / 2.0, self.marker_font, str(round(self.rotation, 1))) painter.setPen(buffer_pen) painter.setBrush(Qt.NoBrush) painter.drawPath(label) painter.setPen(Qt.NoPen) painter.setBrush(QBrush(Qt.black)) painter.drawPath(label) painter.restore()