You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.8 KiB
57 lines
1.8 KiB
# coding:utf-8
|
|
from PySide6.QtCore import Qt, QRectF
|
|
from PySide6.QtGui import QColor, QPen, QPainter, QFont
|
|
|
|
from .progress_bar import ProgressBar
|
|
from ...common.style_sheet import themeColor, isDarkTheme
|
|
|
|
|
|
class ProgressRing(ProgressBar):
|
|
""" Progress ring """
|
|
|
|
def __init__(self, parent=None, useAni=True):
|
|
super().__init__(parent, useAni=useAni)
|
|
self.lightBackgroundColor = QColor(0, 0, 0, 34)
|
|
self.darkBackgroundColor = QColor(255, 255, 255, 34)
|
|
|
|
self.setTextVisible(False)
|
|
self.setFixedSize(100, 100)
|
|
|
|
font = QFont()
|
|
font.setFamilies(['Segoe UI', 'Microsoft YaHei'])
|
|
font.setPixelSize(14)
|
|
self.setFont(font)
|
|
|
|
def _drawText(self, painter: QPainter, text: str):
|
|
""" draw text """
|
|
painter.setFont(self.font())
|
|
painter.setPen(Qt.white if isDarkTheme() else Qt.black)
|
|
painter.drawText(self.rect(), Qt.AlignCenter, text)
|
|
|
|
def paintEvent(self, e):
|
|
painter = QPainter(self)
|
|
painter.setRenderHints(QPainter.Antialiasing)
|
|
|
|
cw = 6 # circle thickness
|
|
w = min(self.height(), self.width()) - cw
|
|
rc = QRectF(cw/2, self.height()/2 - w/2, w, w)
|
|
|
|
# draw background
|
|
bc = self.darkBackgroundColor if isDarkTheme() else self.lightBackgroundColor
|
|
pen = QPen(bc, cw, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin)
|
|
painter.setPen(pen)
|
|
painter.drawArc(rc, 0, 360*16)
|
|
|
|
if self.maximum() <= self.minimum():
|
|
return
|
|
|
|
# draw bar
|
|
pen.setColor(themeColor())
|
|
painter.setPen(pen)
|
|
degree = int(self.val / (self.maximum() - self.minimum()) * 360)
|
|
painter.drawArc(rc, 90*16, -degree*16)
|
|
|
|
# draw text
|
|
if self.isTextVisible():
|
|
self._drawText(painter, self.valText())
|