|
| 1 | +from PySide2.QtCore import Qt, QRect, QRectF, QSize, QPointF |
| 2 | +from PySide2.QtGui import QPixmap, QPainter, QFont, QColor, QPen, QFontMetrics |
| 3 | +from PySide2.QtWidgets import QApplication |
| 4 | + |
| 5 | + |
| 6 | +class TrayIcon: |
| 7 | + |
| 8 | + def __init__(self): |
| 9 | + self.bgWidth = 128 |
| 10 | + self.bgHeight = 128 |
| 11 | + self.pixmap = QPixmap(self.bgWidth, self.bgHeight) |
| 12 | + self.pixmap.fill(Qt.transparent) |
| 13 | + self.painter = QPainter(self.pixmap) |
| 14 | + |
| 15 | + def centerWidth(self, width): |
| 16 | + return (self.bgWidth - width) >> 1 |
| 17 | + |
| 18 | + def centerHeight(self, height): |
| 19 | + return (self.bgHeight - height) >> 1 |
| 20 | + |
| 21 | + def drawRoundedRect(self, margin, radius, battery=1.0): |
| 22 | + marginX = margin[0] |
| 23 | + marginY = margin[1] |
| 24 | + bRectWidth = self.bgWidth - marginX * 2 |
| 25 | + bRectHeight = self.bgHeight - marginY * 2 |
| 26 | + brt = QRectF(self.centerWidth(bRectWidth), self.centerHeight(bRectHeight), bRectWidth * battery, bRectHeight) |
| 27 | + self.painter.drawRoundedRect(brt, radius, radius) |
| 28 | + return brt |
| 29 | + |
| 30 | + def drawChord(self, brt): |
| 31 | + width = height = 15 |
| 32 | + cr = QRectF(brt.x() + brt.width() - 5, self.centerHeight(height), width, height) |
| 33 | + self.painter.drawChord(cr, 90 * 16, -180 * 16) |
| 34 | + |
| 35 | + def drawChargeIcon(self, r=20): |
| 36 | + p = QRectF(self.pixmap.width() - r, 0, r, r) |
| 37 | + self.painter.setPen(Qt.red) |
| 38 | + self.painter.setBrush(Qt.red) |
| 39 | + self.painter.drawChord(p, 0, 360 * 16) |
| 40 | + |
| 41 | + def drawNumIcon(self, battery, isCharge): |
| 42 | + if isCharge: self.drawChargeIcon(26) |
| 43 | + ft = QFont("Microsoft YaHei", 48) |
| 44 | + ft_rect = QFontMetrics(ft).boundingRect(str(battery)) |
| 45 | + scale = ft_rect.width() / self.pixmap.width() |
| 46 | + if scale > 1: |
| 47 | + ft.setPointSize(36) |
| 48 | + elif scale < 0.5: |
| 49 | + ft.setPointSize(62) |
| 50 | + self.painter.setFont(ft) |
| 51 | + self.painter.setPen(Qt.black) |
| 52 | + self.painter.setRenderHint(QPainter.HighQualityAntialiasing) |
| 53 | + self.painter.drawText(self.pixmap.rect(), Qt.AlignCenter, str(battery)) |
| 54 | + |
| 55 | + self.painter.end() |
| 56 | + |
| 57 | + def drawRectIcon(self, battery, isCharge): |
| 58 | + self.painter.setBrush(Qt.black) |
| 59 | + self.painter.setPen(Qt.transparent) |
| 60 | + brt = self.drawRoundedRect((16, 42), 6) |
| 61 | + |
| 62 | + self.painter.setCompositionMode(QPainter.CompositionMode_SourceOut) |
| 63 | + percentage = battery / 100 |
| 64 | + mask_x = brt.x() + percentage * brt.width() |
| 65 | + mask_width = brt.width() * (1 - percentage) |
| 66 | + maskBrt = QRectF(mask_x, brt.y(), mask_width, brt.height()) |
| 67 | + self.painter.fillRect(maskBrt, Qt.transparent) |
| 68 | + |
| 69 | + # big rect |
| 70 | + self.painter.setCompositionMode(QPainter.CompositionMode_DestinationOver) |
| 71 | + self.painter.setPen(QPen(Qt.black, 9)) |
| 72 | + self.painter.setBrush(Qt.transparent) |
| 73 | + brt_ = self.drawRoundedRect((6, 30), 16) |
| 74 | + if isCharge: self.drawChargeIcon() |
| 75 | + self.painter.end() |
| 76 | + |
| 77 | + def draw(self, battery, isCharge, style=0): |
| 78 | + if style == 0: |
| 79 | + self.drawNumIcon(battery, isCharge) |
| 80 | + else: |
| 81 | + self.drawRectIcon(battery, isCharge) |
| 82 | + return self.pixmap |
0 commit comments