summaryrefslogtreecommitdiffstats
path: root/examples/progress.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/progress.py')
-rwxr-xr-xexamples/progress.py281
1 files changed, 281 insertions, 0 deletions
diff --git a/examples/progress.py b/examples/progress.py
new file mode 100755
index 0000000..3ebdd12
--- /dev/null
+++ b/examples/progress.py
@@ -0,0 +1,281 @@
+#!/usr/bin/env python
+
+#/****************************************************************************
+#** $Id: progress.py 3.3.7 edited Aug 31 2005 $
+#**
+#** Copyright (C) 1992-2005 Trolltech AS. All rights reserved.
+#**
+#** This file is part of an example program for TQt. This example
+#** program may be used, distributed and modified without limitation.
+#**
+#** Converted to PyTQt3 by Hans-Peter Jansen <hpj@urpla.net>
+#**
+#*****************************************************************************/
+
+import sys
+from python_tqt.qt import *
+from random import randint
+
+class AnimatedThingy(TQLabel):
+ def __init__(self, parent, s):
+ TQLabel.__init__(self, parent)
+ self.label = TQString(s)
+ self.setEraseColor(TQt.white)
+ self.label.append("\n... and wasting CPU\nwith this animation!\n")
+ self.step = 0
+ self.nqix = 10
+ self.stepoff = 2
+ self.stepmax = 7
+ self.lwidth = 2
+ self.tdelay = 100
+ self.ox, self.oy = [], []
+ for i in range(self.nqix):
+ self.ox.append((0, 0))
+ self.oy.append((0, 0))
+ self.x0, self.y0, self.x1, self.y1 = 0, 0, 0, 0
+ self.dx0 = randint(0, self.stepmax) + self.stepoff
+ self.dy0 = randint(0, self.stepmax) + self.stepoff
+ self.dx1 = randint(0, self.stepmax) + self.stepoff
+ self.dy1 = randint(0, self.stepmax) + self.stepoff
+
+ def show(self):
+ if not self.isVisible():
+ self.startTimer(self.tdelay)
+ TQWidget.show(self)
+
+ def hide(self):
+ TQWidget.hide(self)
+ self.killTimers()
+
+ def sizeHint(self):
+ return TQSize(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][0], self.oy[step][0],
+ self.ox[step][1], self.oy[step][1])
+ # calc new line coordinates
+ ww, wh = self.width(), self.height()
+ self.x0, self.dx0 = self._inc(self.x0, self.dx0, ww)
+ self.y0, self.dy0 = self._inc(self.y0, self.dy0, wh)
+ self.x1, self.dx1 = self._inc(self.x1, self.dx1, ww)
+ self.y1, self.dy1 = self._inc(self.y1, self.dy1, wh)
+ self.ox[step] = (self.x0, self.x1)
+ self.oy[step] = (self.y0, self.y1)
+ self._drawqix(p, pn, step)
+ self._drawtxt(p)
+
+ def paintEvent(self, event):
+ p, pn = self._painter()
+ p.setClipRect(event.rect())
+ for i in range(self.nqix):
+ self._drawqix(p, pn, i)
+ self._drawtxt(p)
+
+ def _painter(self):
+ p = TQPainter(self)
+ # we need to create a new pen from p.pen() with TQPen() in order
+ # to make it fully functional (changes are discarded otherwise)
+ pn = TQPen(p.pen())
+ pn.setWidth(self.lwidth)
+ p.setPen(pn)
+ return p, pn
+
+ def _drawqix(self, p, pn, step):
+ # rainbow effect
+ pn.setColor(TQColor(int((step * 255)/self.nqix), 255, 255, TQColor.Hsv))
+ p.setPen(pn)
+ p.drawLine(self.ox[step][0], self.oy[step][0],
+ self.ox[step][1], self.oy[step][1])
+
+ def _drawtxt(self, p):
+ p.setPen(self.colorGroup().text())
+ p.drawText(self.rect(), TQt.AlignCenter, self.label)
+
+ def _inc(self, x, dx, b):
+ x += dx
+ if x < 0:
+ x = 0
+ dx = randint(0, self.stepmax) + self.stepoff;
+ elif x >= b:
+ x = b - 1
+ dx = -(randint(0, self.stepmax) + self.stepoff)
+ return x, dx
+
+
+class CPUWaster(TQWidget):
+ def __init__(self):
+ TQWidget.__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 = False
+ self.pb = None # non modal progress dialog
+ self.menubar = menubar = TQMenuBar(self, "menu")
+ self.file_ = file_ = TQPopupMenu()
+ menubar.insertItem("&File", file_)
+ for i in range(self.first_draw_item, self.last_draw_item + 1):
+ file_.insertItem(self.drawItemText(i), i)
+ file_.setAccel(TQKeySequence(
+ "Ctrl+%s" % (i - self.first_draw_item)), i)
+ self.connect(menubar, SIGNAL("activated(int)"), self.doMenuItem)
+ file_.insertSeparator()
+ file_.insertItem("Quit", tqApp, SLOT("quit()"), TQKeySequence("Ctrl+Q"))
+ self.options = options = TQPopupMenu()
+ menubar.insertItem("&Options", options)
+ self.ld_id = options.insertItem("Loop driven", self.loopDriven,
+ TQKeySequence("Alt+L"))
+ self.td_id = options.insertItem("Timer driven", self.timerDriven,
+ TQKeySequence("Alt+T"))
+ options.insertSeparator()
+ self.dl_id = options.insertItem("Default label", self.defaultLabel,
+ TQKeySequence("Alt+D"))
+ self.cl_id = options.insertItem("Custom label", self.customLabel,
+ TQKeySequence("Alt+C"))
+ options.insertSeparator()
+ self.md_id = options.insertItem("No minimum duration",
+ self.toggleMinimumDuration,
+ TQKeySequence("Alt+M"))
+ options.setCheckable(True)
+ # default option settings
+ self.timerDriven()
+ self.customLabel()
+ self.toggleMinimumDuration()
+ self.resize(400, 300)
+ self.setEraseColor(TQt.black)
+
+ def drawItemRects(self, id_):
+ r = 100
+ for n in range(id_ - self.first_draw_item):
+ if not n % 3:
+ r *= 4
+ else:
+ r *= 5
+ return r
+
+ def drawItemText(self, id_):
+ return TQString("%d Rectangles" % self.drawItemRects(id_))
+
+ def enableDrawingItems(self, yes):
+ for i in range(self.first_draw_item, self.last_draw_item + 1):
+ self.menubar.setItemEnabled(i, yes)
+
+ # slots
+ def doMenuItem(self, id_):
+ if id_ >= self.first_draw_item and id_ <= self.last_draw_item:
+ self.draw(self.drawItemRects(id_))
+
+ 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 stopDrawing(self):
+ self.got_stop = True
+
+ def newProgressDialog(self, label, steps, modal):
+ d = TQProgressDialog(label, "Cancel", steps, self, "progress", modal)
+ if self.options.isItemChecked(self.md_id):
+ d.setMinimumDuration(0)
+ if not self.default_label:
+ d.setLabel(AnimatedThingy(d, label))
+ d.setCaption("Please Wait")
+ return d
+
+ def draw(self, n):
+ if self.timer_driven:
+ if self.pb:
+ tqWarning("This cannot happen!")
+ return
+
+ self.rects = n
+ self.pb = self.newProgressDialog("Drawing rectangles.\n"
+ "Using timer event.", n, False)
+ self.connect(self.pb, SIGNAL("cancelled()"), self.stopDrawing)
+ self.enableDrawingItems(False)
+ self.startTimer(0)
+ self.got_stop = False
+ else: # loop driven with modal progress dialog
+ lpb = self.newProgressDialog("Drawing rectangles.\n"
+ "Using loop.", n, True)
+ p = TQPainter(self)
+ for i in range(n):
+ lpb.setProgress(i)
+ if lpb.wasCancelled():
+ break
+ self._draw(p)
+ self._clear(p)
+ lpb.cancel()
+ del lpb
+
+ def timerEvent(self, e):
+ if not self.got_stop:
+ self.pb.setProgress(self.pb.totalSteps() - self.rects)
+ self.rects -= 1
+ p = TQPainter(self)
+ self._draw(p)
+
+ if not self.rects or self.got_stop:
+ if not self.got_stop:
+ self.pb.setProgress(self.pb.totalSteps())
+ self._clear(p)
+ self.enableDrawingItems(True)
+ self.killTimers()
+ self.pb.cancel()
+ del self.pb
+ self.pb = None
+
+ def _draw(self, p):
+ ww = self.width()
+ wh = self.height()
+ if ww > 8 and wh > 8:
+ c = TQColor(randint(0, 255), randint(0, 255), randint(0, 255))
+ x = randint(0, ww - 8)
+ y = randint(0, wh - 8)
+ w = randint(0, ww - x)
+ h = randint(0, wh - y)
+ p.fillRect(x, y, w, h, TQBrush(c))
+
+ def _clear(self, p):
+ p.fillRect(0, 0, self.width(), self.height(), TQBrush(self.eraseColor()))
+
+
+if __name__ == "__main__":
+ app = TQApplication(sys.argv)
+ try:
+ n = int(sys.argv[1])
+ except:
+ n = 1
+ wlst = [] # keep a ref around
+ for i in range(n):
+ cpuw = CPUWaster()
+ if i == 0:
+ app.setMainWidget(cpuw)
+ cpuw.show()
+ wlst.append(cpuw)
+ app.exec_loop()