| 47 | |
| 48 | |
| 49 | class DWaterProgress(QProgressBar): |
| 50 | |
| 51 | def __init__(self, *args, **kwargs): |
| 52 | super(DWaterProgress, self).__init__(*args, **kwargs) |
| 53 | self.waterFrontImage = QImage() |
| 54 | self.waterBackImage = QImage() |
| 55 | self.waterFrontSvg = QSvgRenderer(WATER_FRONT.encode()) |
| 56 | self.waterBackSvg = QSvgRenderer(WATER_BACK.encode()) |
| 57 | self.pops = [] |
| 58 | self.initPops() |
| 59 | self.setTextVisible(True) |
| 60 | self.interval = 33 |
| 61 | self.timer = QTimer(self) |
| 62 | self.timer.setInterval(self.interval) |
| 63 | self.timer.timeout.connect(self.onTimerOut) |
| 64 | self.resizePixmap(self.size()) |
| 65 | self.frontXOffset = self.width() |
| 66 | self.backXOffset = 0 |
| 67 | effect = QGraphicsDropShadowEffect(self) |
| 68 | effect.setOffset(0, 6) |
| 69 | effect.setColor(QColor(1, 153, 248, 255 * 5 / 20)) |
| 70 | effect.setBlurRadius(12) |
| 71 | self.setGraphicsEffect(effect) |
| 72 | |
| 73 | def initPops(self): |
| 74 | self.pops = [Pop(7, -1.8, 0.6), Pop(8, 1.2, 1.0), Pop(11, 0.8, 1.6)] |
| 75 | |
| 76 | @pyqtSlot() |
| 77 | def start(self): |
| 78 | self.timer.start() |
| 79 | |
| 80 | @pyqtSlot() |
| 81 | def stop(self): |
| 82 | self.timer.stop() |
| 83 | |
| 84 | def resizePixmap(self, sz): |
| 85 | # https://github.com/linuxdeepin/dtkwidget/blob/master/src/widgets/dwaterprogress.cpp#L192 |
| 86 | # resize water |
| 87 | waterWidth = 500 * sz.width() / 100 |
| 88 | waterHeight = 110 * sz.height() / 100 |
| 89 | waterSize = QSizeF(waterWidth, waterHeight).toSize() |
| 90 | |
| 91 | if self.waterFrontImage.size() != waterSize: |
| 92 | image = QImage(waterWidth, waterHeight, QImage.Format_ARGB32) |
| 93 | image.fill(Qt.transparent) |
| 94 | waterPainter = QPainter(image) |
| 95 | self.waterFrontSvg.render(waterPainter) |
| 96 | self.waterFrontImage = image |
| 97 | |
| 98 | if self.waterBackImage.size() != waterSize: |
| 99 | image = QImage(waterWidth, waterHeight, QImage.Format_ARGB32) |
| 100 | image.fill(Qt.transparent) # partly transparent red-ish background |
| 101 | waterPainter = QPainter(image) |
| 102 | self.waterBackSvg.render(waterPainter) |
| 103 | self.waterBackImage = image |
| 104 | |
| 105 | def onTimerOut(self): |
| 106 | # interval can not be zero, and limit to 1 |