diff options
Diffstat (limited to 'examples/progress/progress.cpp')
-rw-r--r-- | examples/progress/progress.cpp | 337 |
1 files changed, 337 insertions, 0 deletions
diff --git a/examples/progress/progress.cpp b/examples/progress/progress.cpp new file mode 100644 index 0000000..f7e7232 --- /dev/null +++ b/examples/progress/progress.cpp @@ -0,0 +1,337 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for Qt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qprogressdialog.h> +#include <qapplication.h> +#include <qmenubar.h> +#include <qpopupmenu.h> +#include <qpainter.h> +#include <stdlib.h> + +class AnimatedThingy : public QLabel { +public: + AnimatedThingy( QWidget* parent, const QString& s ) : + QLabel(parent), + label(s), + step(0) + { + setBackgroundColor(white); + label+="\n... and wasting CPU\nwith this animation!\n"; + + for (int i=0; i<nqix; i++) + ox[0][i] = oy[0][i] = ox[1][i] = oy[1][i] = 0; + x0 = y0 = x1 = y1 = 0; + dx0 = rand()%8+2; + dy0 = rand()%8+2; + dx1 = rand()%8+2; + dy1 = rand()%8+2; + } + + void show() + { + if (!isVisible()) startTimer(100); + QWidget::show(); + } + + void hide() + { + QWidget::hide(); + killTimers(); + } + + QSize sizeHint() const + { + return QSize(120,100); + } + +protected: + void timerEvent(QTimerEvent*) + { + QPainter p(this); + QPen pn=p.pen(); + pn.setWidth(2); + pn.setColor(backgroundColor()); + p.setPen(pn); + + step = (step + 1) % nqix; + + p.drawLine(ox[0][step], oy[0][step], ox[1][step], oy[1][step]); + + inc(x0, dx0, width()); + inc(y0, dy0, height()); + inc(x1, dx1, width()); + inc(y1, dy1, height()); + ox[0][step] = x0; + oy[0][step] = y0; + ox[1][step] = x1; + oy[1][step] = y1; + + QColor c; + c.setHsv( (step*255)/nqix, 255, 255 ); // rainbow effect + pn.setColor(c); + p.setPen(pn); + p.drawLine(ox[0][step], oy[0][step], ox[1][step], oy[1][step]); + p.setPen(colorGroup().text()); + p.drawText(rect(), AlignCenter, label); + } + + void paintEvent(QPaintEvent* event) + { + QPainter p(this); + QPen pn=p.pen(); + pn.setWidth(2); + p.setPen(pn); + p.setClipRect(event->rect()); + for (int i=0; i<nqix; i++) { + QColor c; + c.setHsv( (i*255)/nqix, 255, 255 ); // rainbow effect + pn.setColor(c); + p.setPen(pn); + p.drawLine(ox[0][i], oy[0][i], ox[1][i], oy[1][i]); + } + p.setPen(colorGroup().text()); + p.drawText(rect(), AlignCenter, label); + } + +private: + void inc(int& x, int& dx, int b) + { + x+=dx; + if (x<0) { x=0; dx=rand()%8+2; } + else if (x>=b) { x=b-1; dx=-(rand()%8+2); } + } + + enum {nqix=10}; + int ox[2][nqix]; + int oy[2][nqix]; + int x0,y0,x1,y1; + int dx0,dy0,dx1,dy1; + QString label; + int step; +}; + + +class CPUWaster : public QWidget +{ + Q_OBJECT + + enum { first_draw_item = 1000, last_draw_item = 1006 }; + + int drawItemRects(int id) + { + int n = id - first_draw_item; + int r = 100; + while (n--) r*=(n%3 ? 5 : 4); + return r; + } + QString drawItemText(int id) + { + QString str; + str.sprintf("%d Rectangles", drawItemRects(id)); + return str; + } + +public: + CPUWaster() : + pb(0) + { + menubar = new QMenuBar( this, "menu" ); + Q_CHECK_PTR( menubar ); + + QPopupMenu* file = new QPopupMenu(); + Q_CHECK_PTR( file ); + menubar->insertItem( "&File", file ); + for (int i=first_draw_item; i<=last_draw_item; i++) + file->insertItem( drawItemText(i), i ); + connect( menubar, SIGNAL(activated(int)), this, SLOT(doMenuItem(int)) ); + file->insertSeparator(); + file->insertItem( "Quit", qApp, SLOT(quit()) ); + + options = new QPopupMenu(); + Q_CHECK_PTR( options ); + menubar->insertItem( "&Options", options ); + td_id = options->insertItem( "Timer driven", this, SLOT(timerDriven()) ); + ld_id = options->insertItem( "Loop driven", this, SLOT(loopDriven()) ); + options->insertSeparator(); + dl_id = options->insertItem( "Default label", this, SLOT(defaultLabel()) ); + cl_id = options->insertItem( "Custom label", this, SLOT(customLabel()) ); + options->insertSeparator(); + md_id = options->insertItem( "No minimum duration", this, SLOT(toggleMinimumDuration()) ); + options->setCheckable( TRUE ); + loopDriven(); + defaultLabel(); + + setFixedSize( 400, 300 ); + + setBackgroundColor( black ); + } + +public slots: + void doMenuItem(int id) + { + if (id >= first_draw_item && id <= last_draw_item) + draw(drawItemRects(id)); + } + + void stopDrawing() { got_stop = TRUE; } + + void timerDriven() + { + timer_driven = TRUE; + options->setItemChecked( td_id, TRUE ); + options->setItemChecked( ld_id, FALSE ); + } + + void loopDriven() + { + timer_driven = FALSE; + options->setItemChecked( ld_id, TRUE ); + options->setItemChecked( td_id, FALSE ); + } + + void defaultLabel() + { + default_label = TRUE; + options->setItemChecked( dl_id, TRUE ); + options->setItemChecked( cl_id, FALSE ); + } + + void customLabel() + { + default_label = FALSE; + options->setItemChecked( dl_id, FALSE ); + options->setItemChecked( cl_id, TRUE ); + } + + void toggleMinimumDuration() + { + options->setItemChecked( md_id, + !options->isItemChecked( md_id ) ); + } + +private: + void timerEvent( QTimerEvent* ) + { + if (!got_stop) + pb->setProgress( pb->totalSteps() - rects ); + rects--; + + { + QPainter p(this); + + int ww = width(); + int wh = height(); + + if ( ww > 8 && wh > 8 ) { + QColor c(rand()%255, rand()%255, rand()%255); + int x = rand() % (ww-8); + int y = rand() % (wh-8); + int w = rand() % (ww-x); + int h = rand() % (wh-y); + p.fillRect( x, y, w, h, c ); + } + } + + if (!rects || got_stop) { + if (!got_stop) + pb->setProgress( pb->totalSteps() ); + QPainter p(this); + p.fillRect(0, 0, width(), height(), backgroundColor()); + enableDrawingItems(TRUE); + killTimers(); + delete pb; + pb = 0; + } + } + + QProgressDialog* newProgressDialog( const char* label, int steps, bool modal ) + { + QProgressDialog *d = new QProgressDialog(label, "Cancel", steps, this, + "progress", modal); + if ( options->isItemChecked( md_id ) ) + d->setMinimumDuration(0); + if ( !default_label ) + d->setLabel( new AnimatedThingy(d,label) ); + return d; + } + + void enableDrawingItems(bool yes) + { + for (int i=first_draw_item; i<=last_draw_item; i++) { + menubar->setItemEnabled(i, yes); + } + } + + void draw(int n) + { + if ( timer_driven ) { + if ( pb ) { + qWarning("This cannot happen!"); + return; + } + rects = n; + pb = newProgressDialog("Drawing rectangles.\n" + "Using timer event.", n, FALSE); + pb->setCaption("Please Wait"); + connect(pb, SIGNAL(cancelled()), this, SLOT(stopDrawing())); + enableDrawingItems(FALSE); + startTimer(0); + got_stop = FALSE; + } else { + QProgressDialog* lpb = newProgressDialog( + "Drawing rectangles.\nUsing loop.", n, TRUE); + lpb->setCaption("Please Wait"); + + QPainter p(this); + for (int i=0; i<n; i++) { + lpb->setProgress(i); + if ( lpb->wasCancelled() ) + break; + + QColor c(rand()%255, rand()%255, rand()%255); + int x = rand()%(width()-8); + int y = rand()%(height()-8); + int w = rand()%(width()-x); + int h = rand()%(height()-y); + p.fillRect(x,y,w,h,c); + } + + p.fillRect(0, 0, width(), height(), backgroundColor()); + + delete lpb; + } + } + + QMenuBar* menubar; + QProgressDialog* pb; + QPopupMenu* options; + int td_id, ld_id; + int dl_id, cl_id; + int md_id; + int rects; + bool timer_driven; + bool default_label; + bool got_stop; +}; + +int main( int argc, char **argv ) +{ + QApplication a( argc, argv ); + + int wincount = argc > 1 ? atoi(argv[1]) : 1; + + for ( int i=0; i<wincount; i++ ) { + CPUWaster* cpuw = new CPUWaster; + if ( i == 0 ) a.setMainWidget(cpuw); + cpuw->show(); + } + return a.exec(); +} + +#include "progress.moc" |