home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / qt3_emx.zip / examples / life / lifedlg.cpp < prev    next >
C/C++ Source or Header  |  2001-10-11  |  5KB  |  164 lines

  1. /****************************************************************************
  2. ** $Id:  qt/lifedlg.cpp   3.0.0   edited Jun 22 13:24 $
  3. **
  4. ** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
  5. **
  6. ** This file is part of an example program for Qt.  This example
  7. ** program may be used, distributed and modified without limitation.
  8. **
  9. *****************************************************************************/
  10.  
  11. #include "lifedlg.h"
  12. #include <qapplication.h>
  13. #include <qpushbutton.h>
  14. #include <qlabel.h>
  15. #include <qslider.h>
  16. #include <qcombobox.h>
  17. #include <qdatetime.h>
  18. #include <stdlib.h>
  19.  
  20. #include "patterns.cpp"
  21.  
  22.  
  23. // A simple timer which has a pause and a setSpeed slot
  24.  
  25. LifeTimer::LifeTimer( QWidget *parent ) : QTimer( parent ), interval( 500 )
  26. {
  27.     start( interval );
  28. }
  29.  
  30.  
  31. void LifeTimer::pause( bool stopIt )
  32. {
  33.     if ( stopIt )
  34.     stop();
  35.     else
  36.     start( interval );
  37. }
  38.  
  39.  
  40. void LifeTimer::setSpeed( int speed )
  41. {
  42.     interval = MAXSPEED - speed; 
  43.     if ( isActive() )
  44.     changeInterval( interval );
  45. }
  46.  
  47.  
  48. // A top-level container widget to organize the others
  49.  
  50. LifeDialog::LifeDialog( int scale, QWidget * parent, const char * name )
  51.     : QWidget( parent, name )
  52. {
  53.     qb = new QPushButton( "Quit!", this );
  54.     cb = new QComboBox( this, "comboBox" );
  55.     life = new LifeWidget(scale, this);
  56.     life->move( SIDEBORDER, TOPBORDER );
  57.  
  58.  
  59.     connect( qb, SIGNAL(clicked()), qApp, SLOT(quit()) );
  60.     qb->setGeometry( SIDEBORDER, SIDEBORDER, qb->sizeHint().width(), 25 );
  61.     timer = new LifeTimer( this );
  62.  
  63.     connect( timer, SIGNAL(timeout()), life, SLOT(nextGeneration()) );
  64.     pb = new QPushButton( "Pause", this );
  65.     pb->setToggleButton( TRUE );
  66.     connect( pb, SIGNAL(toggled(bool)), timer, SLOT(pause(bool)) );
  67.     pb->resize( pb->sizeHint().width(), 25 );
  68.     pb->move( width() - SIDEBORDER - pb->width(), SIDEBORDER );
  69.  
  70.     sp = new QLabel( "Speed:", this );
  71.     sp->adjustSize();
  72.     sp->move( SIDEBORDER, 45 );
  73.     scroll = new QSlider( 0, LifeTimer::MAXSPEED, 50,
  74.                  LifeTimer::MAXSPEED / 2,
  75.                  QSlider::Horizontal, this );
  76.     connect( scroll, SIGNAL(valueChanged(int)),
  77.          timer,  SLOT(setSpeed(int)) );
  78.  
  79.     scroll->move( sp->width() + 2 * SIDEBORDER, 45 );
  80.     scroll->resize( 200, 15 );
  81.  
  82.     life->setFrameStyle( QFrame::Panel | QFrame::Sunken );
  83.     life->show();
  84.  
  85.     srand( QTime(0,0,0).msecsTo(QTime::currentTime()) );
  86.     int sel =  rand() % NPATS;
  87.     getPattern( sel );
  88.  
  89.     cb->move( 2*SIDEBORDER + qb->width(), SIDEBORDER);
  90.     cb->insertItem( "Glider Gun " );
  91.     cb->insertItem( "Figure Eight " );
  92.     cb->insertItem( "Pulsar " );
  93.     cb->insertItem( "Barber Pole P2 " );
  94.     cb->insertItem( "Achim P5 " );
  95.     cb->insertItem( "Hertz P4 " );
  96.     cb->insertItem( "Tumbler " );
  97.     cb->insertItem( "Pulse1 P4" );
  98.     cb->insertItem( "Shining Flower P5 " );
  99.     cb->insertItem( "Pulse2 P6 " );
  100.     cb->insertItem( "Pinwheel, Clock P4 " );
  101.     cb->insertItem( "Pentadecatholon " );
  102.     cb->insertItem( "Piston " );
  103.     cb->insertItem( "Piston2 " );
  104.     cb->insertItem( "Switch Engine " );
  105.     cb->insertItem( "Gears (Gear, Flywheel, Blinker) " );
  106.     cb->insertItem( "Turbine8 " );
  107.     cb->insertItem( "P16 " );
  108.     cb->insertItem( "Puffer " );
  109.     cb->insertItem( "Escort " );
  110.     cb->insertItem( "Dart Speed 1/3 " );
  111.     cb->insertItem( "Period 4 Speed 1/2 " );
  112.     cb->insertItem( "Another Period 4 Speed 1/2 " );
  113.     cb->insertItem( "Smallest Known Period 3 Spaceship Speed 1/3 " );
  114.     cb->insertItem( "Turtle Speed 1/3 " );
  115.     cb->insertItem( "Smallest Known Period 5 Speed 2/5 " );
  116.     cb->insertItem( "Sym Puffer " );
  117.     cb->insertItem( "], Near Ship, Pi Heptomino " );
  118.     cb->insertItem( "R Pentomino " );
  119.     cb->setAutoResize( FALSE );
  120.     cb->setCurrentItem( sel );
  121.     cb->show();
  122.     connect( cb, SIGNAL(activated(int)), SLOT(getPattern(int)) );
  123.  
  124.     QSize s;
  125.     s = life->minimumSize();
  126.     setMinimumSize( s.width() + 2 * SIDEBORDER, 
  127.             s.height() + TOPBORDER + SIDEBORDER );
  128.     s = life->maximumSize();
  129.     setMaximumSize( s.width() + 2 * SIDEBORDER, 
  130.             s.height() + TOPBORDER + SIDEBORDER );
  131.     s = life->sizeIncrement();
  132.     setSizeIncrement( s.width(), s.height() );
  133.  
  134.     resize( QMIN(512, qApp->desktop()->width()),
  135.         QMIN(480, qApp->desktop()->height()) );
  136. }
  137.  
  138.  
  139. void LifeDialog::resizeEvent( QResizeEvent * e )
  140. {
  141.     life->resize( e->size() - QSize( 2 * SIDEBORDER, TOPBORDER + SIDEBORDER ));
  142.     pb->move( e->size().width() - SIDEBORDER - pb->width(), SIDEBORDER );
  143.     scroll->resize( e->size().width() - sp->width() - 3 * SIDEBORDER,
  144.             scroll->height() );
  145.     cb->resize( width() - 4*SIDEBORDER - qb->width() - pb->width()  , 25 );
  146. }
  147.  
  148.  
  149. // Adapted from xlock, see pattern.cpp for copyright info.
  150.  
  151. void LifeDialog::getPattern( int pat )
  152. {
  153.     life->clear();
  154.     int i = pat % NPATS;
  155.     int col;
  156.     int * patptr = &patterns[i][0];
  157.     while ( (col = *patptr++) != 127 ) {
  158.     int row = *patptr++;
  159.     col += life->maxCol() / 2;
  160.     row += life->maxRow() / 2;
  161.     life->setPoint( col, row );
  162.     }
  163. }
  164.