You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebindings/python/pyqt/examples3/progress.py

288 lines
9.1 KiB
Python

#!/usr/bin/env python
#/****************************************************************************
#** $Id$
#**
#** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
#**
#** This file is part of an example program for Qt. This example
#** program may be used, distributed and modified without limitation.
#**
#** Converted to PyQt3: Hans-Peter Jansen <hpj@urpla.net>
#**
#*****************************************************************************/
from qt import *
import sys
from random import random
TRUE = 1
FALSE = 0
class AnimatedThingy(QLabel):
def __init__(self, parent, s):
QLabel.__init__(self, parent)
self.nqix = 40
self.step = 0
self.ox = []
self.oy = []
self.px = []
self.py = []
for i in range(self.nqix):
self.ox.append(0)
self.oy.append(0)
self.px.append(0)
self.py.append(0)
self.x0, self.y0, self.x1, self.y1 = 0, 0, 0, 0
self.dx0 = 2 + int(random() * 8)
self.dy0 = 2 + int(random() * 8)
self.dx1 = 2 + int(random() * 8)
self.dy1 = 2 + int(random() * 8)
self.label = QString(s)
self.setEraseColor(Qt.black)
self.label.append("\n... and wasting CPU\nwith this animation!\n")
def XXXshow(self):
if not self.isVisible():
print "bla"
self.startTimer(100)
QWidget.show(self)
def hide(self):
QWidget.hide(self)
self.killTimers()
def sizeHint(self):
return QSize(120, 100)
def timerEvent(self, e):
p, pn = self._painter()
pn.setColor(self.eraseColor())
p.setPen(pn)
self.step = step = (self.step + 1) % self.nqix
# erase line
p.drawLine(self.ox[step], self.oy[step], self.px[step], self.py[step])
# calc new line coordinates
self.x0, self.dx0 = self._inc(self.x0, self.dx0, self.width())
self.y0, self.dy0 = self._inc(self.y0, self.dy0, self.height())
self.x1, self.dx1 = self._inc(self.x1, self.dx1, self.width())
self.y1, self.dy1 = self._inc(self.y1, self.dy1, self.height())
self.ox[step] = self.x0
self.oy[step] = self.y0
self.px[step] = self.x1
self.py[step] = self.y1
self._drawqix(p, pn, step)
self._drawtxt(p)
def paintEvent(self, e):
p, pn = self._painter()
p.setClipRect(e.rect())
for i in range(self.nqix):
self._drawqix(p, pn, i)
self._drawtxt(p)
def _painter(self):
p = QPainter(self)
pn = p.pen()
pn.setWidth(2)
p.setPen(pn)
return p, pn
def _drawqix(self, p, pn, step):
c = QColor()
# enhanced rainbow effect
i = (step * 511)/self.nqix
if i > 255:
i = 511 - i
c.setHsv(i, 255, 255)
pn.setColor(c)
p.setPen(pn)
p.drawLine(self.ox[step], self.oy[step], self.px[step], self.py[step])
def _drawtxt(self, p):
#p.setPen(self.colorGroup().text())
p.setPen(Qt.white)
p.drawText(self.rect(), Qt.AlignCenter, self.label)
def _inc(self, x, dx, b):
x += dx
if x < 0:
x = 0
dx = 2 + int(random() * 8)
elif x >= b:
x = b-1
dx = -(2 + int(random() * 8))
return x, dx
class CPUWaster(QWidget):
def __init__(self):
QWidget.__init__(self)
self.first_draw_item = 1000
self.last_draw_item = 1006
self.rects = 0
self.timer_driven = 0
self.default_label = 0
self.got_stop = 0
self.pb = None
menubar = QMenuBar(self, "menu")
file = QPopupMenu()
menubar.insertItem("&File", file)
for i in range(self.first_draw_item, self.last_draw_item + 1):
file.insertItem(self.drawItemText(i), i)
self.connect(menubar, SIGNAL("activated(int)"), self.doMenuItem)
file.insertSeparator()
file.insertItem("Quit", qApp, SLOT("quit()"))
options = QPopupMenu()
menubar.insertItem("&Options", options)
self.td_id = options.insertItem("Timer driven", self.timerDriven)
self.ld_id = options.insertItem("Loop driven", self.loopDriven)
options.insertSeparator()
self.dl_id = options.insertItem("Default label", self.defaultLabel)
self.cl_id = options.insertItem("Custom label", self.customLabel)
options.insertSeparator()
self.md_id = options.insertItem("No minimum duration", self.toggleMinimumDuration)
options.setCheckable(TRUE)
self.options = options
self.menubar = menubar
self.file = file
#self.loopDriven()
self.timerDriven()
#self.defaultLabel()
self.customLabel()
self.setFixedSize(400, 300)
self.setEraseColor(Qt.black)
def drawItemRects(self, id):
n = id - self.first_draw_item
r = 100
while n:
n -= 1
f = 5
if not n % 3:
f = 4
r *= f
return r
def drawItemText(self, id):
return QString("%d Rectangles" % self.drawItemRects(id))
# slots
def doMenuItem(self, id):
if id >= self.first_draw_item and id <= self.last_draw_item:
self._draw(self.drawItemRects(id))
def stopDrawing(self):
self.got_stop = TRUE
def timerDriven(self):
self.timer_driven = TRUE
self.options.setItemChecked(self.td_id, TRUE)
self.options.setItemChecked(self.ld_id, FALSE)
def loopDriven(self):
self.timer_driven = FALSE
self.options.setItemChecked(self.ld_id, TRUE)
self.options.setItemChecked(self.td_id, FALSE)
def defaultLabel(self):
self.default_label = TRUE
self.options.setItemChecked(self.dl_id, TRUE)
self.options.setItemChecked(self.cl_id, FALSE)
def customLabel(self):
self.default_label = FALSE
self.options.setItemChecked(self.dl_id, FALSE)
self.options.setItemChecked(self.cl_id, TRUE)
def toggleMinimumDuration(self):
self.options.setItemChecked(self.md_id, not self.options.isItemChecked(self.md_id))
def timerEvent(self, e):
self.pb.setProgress(self.pb.totalSteps() - self.rects)
self.rects -= 1
p = QPainter(self)
ww = self.width()
wh = self.height()
if ww > 8 and wh > 8:
c = QColor(int(random() * 255), int(random() * 255), int(random() * 255))
x = int(random() * (ww-8))
y = int(random() * (wh-8))
w = int(random() * (ww-x))
h = int(random() * (wh-y))
p.fillRect(x, y, w, h, QBrush(c))
if not self.rects or self.got_stop:
self.pb.setProgress(self.pb.totalSteps())
p = QPainter(self)
p.fillRect(0, 0, self.width(), self.height(), QBrush(self.eraseColor()))
self.enableDrawingItems(TRUE)
self.killTimers()
if not self.default_label:
self.pb.killTimers()
self.l.killTimers()
del self.pb
self.pb = None
def newProgressDialog(self, label, steps, modal):
d = QProgressDialog(label, "Cancel", steps, self, "progress", modal)
if self.options.isItemChecked(self.md_id):
d.setMinimumDuration(0)
if not self.default_label:
self.l = AnimatedThingy(d, label)
d.setLabel(self.l)
self.l.startTimer(100)
return d
def enableDrawingItems(self, yes):
for i in range(self.first_draw_item, self.last_draw_item):
self.menubar.setItemEnabled(i, yes)
def _draw(self, n):
if self.timer_driven:
if self.pb:
qWarning("This cannot happen!")
return
self.rects = n
self.pb = self.newProgressDialog("Drawing rectangles.\nUsing timer event.", n, FALSE)
self.pb.setCaption("Please Wait")
self.connect(self.pb, SIGNAL("cancelled()"), self.stopDrawing)
self.enableDrawingItems(FALSE)
self.startTimer(10)
self.got_stop = FALSE
else:
lpb = self.newProgressDialog("Drawing rectangles.\nUsing loop.", n, TRUE)
lpb.setCaption("Please Wait")
p = QPainter(self)
for i in range(n):
lpb.setProgress(i)
if lpb.wasCancelled():
break
c = QColor(int(random() * 255), int(random() * 255), int(random() * 255))
x = int(random() * (self.width()-8))
y = int(random() * (self.height()-8))
w = int(random() * (self.width()-x))
h = int(random() * (self.height()-y))
p.fillRect(x, y, w, h, QBrush(c))
lpb.cancel()
del lpb
p.fillRect(0, 0, self.width(), self.height(), QBrush(self.eraseColor()))
if __name__ == "__main__":
app = QApplication(sys.argv)
try:
n = int(sys.argv[1])
except:
n = 1
for i in range(n):
cpuw = CPUWaster()
if i == 0:
app.setMainWidget(cpuw)
cpuw.show()
app.exec_loop()