/**************************************************************************** ** ** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. ** ** This file is part of an example program for TQt. This example ** program may be used, distributed and modified without limitation. ** *****************************************************************************/ #include #include #include #include #include #include class AnimatedThingy : public TQLabel { public: AnimatedThingy( TQWidget* parent, const TQString& s ) : TQLabel(parent), label(s), step(0) { setBackgroundColor(white); label+="\n... and wasting CPU\nwith this animation!\n"; for (int i=0; irect()); for (int i=0; i=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; TQString label; int step; }; class CPUWaster : public TQWidget { TQ_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; } TQString drawItemText(int id) { TQString str; str.sprintf("%d Rectangles", drawItemRects(id)); return str; } public: CPUWaster() : pb(0) { menubar = new TQMenuBar( this, "menu" ); TQ_CHECK_PTR( menubar ); TQPopupMenu* file = new TQPopupMenu(); TQ_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", tqApp, SLOT(quit()) ); options = new TQPopupMenu(); TQ_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( TQTimerEvent* ) { if (!got_stop) pb->setProgress( pb->totalSteps() - rects ); rects--; { TQPainter p(this); int ww = width(); int wh = height(); if ( ww > 8 && wh > 8 ) { TQColor 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() ); TQPainter p(this); p.fillRect(0, 0, width(), height(), backgroundColor()); enableDrawingItems(TRUE); killTimers(); delete pb; pb = 0; } } TQProgressDialog* newProgressDialog( const char* label, int steps, bool modal ) { TQProgressDialog *d = new TQProgressDialog(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 { TQProgressDialog* lpb = newProgressDialog( "Drawing rectangles.\nUsing loop.", n, TRUE); lpb->setCaption("Please Wait"); TQPainter p(this); for (int i=0; isetProgress(i); if ( lpb->wasCancelled() ) break; TQColor 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; } } TQMenuBar* menubar; TQProgressDialog* pb; TQPopupMenu* 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 ) { TQApplication a( argc, argv ); int wincount = argc > 1 ? atoi(argv[1]) : 1; for ( int i=0; ishow(); } return a.exec(); } #include "progress.moc"