diff options
Diffstat (limited to 'examples/life/lifedlg.cpp')
-rw-r--r-- | examples/life/lifedlg.cpp | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/examples/life/lifedlg.cpp b/examples/life/lifedlg.cpp new file mode 100644 index 0000000..a27f456 --- /dev/null +++ b/examples/life/lifedlg.cpp @@ -0,0 +1,162 @@ +/**************************************************************************** +** +** 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 "lifedlg.h" +#include <qapplication.h> +#include <qpushbutton.h> +#include <qlabel.h> +#include <qslider.h> +#include <qcombobox.h> +#include <qdatetime.h> +#include <stdlib.h> + +#include "patterns.cpp" + + +// A simple timer which has a pause and a setSpeed slot + +LifeTimer::LifeTimer( QWidget *parent ) : QTimer( parent ), interval( 500 ) +{ + start( interval ); +} + + +void LifeTimer::pause( bool stopIt ) +{ + if ( stopIt ) + stop(); + else + start( interval ); +} + + +void LifeTimer::setSpeed( int speed ) +{ + interval = MAXSPEED - speed; + if ( isActive() ) + changeInterval( interval ); +} + + +// A top-level container widget to organize the others + +LifeDialog::LifeDialog( int scale, QWidget * parent, const char * name ) + : QWidget( parent, name ) +{ + qb = new QPushButton( "Quit!", this ); + cb = new QComboBox( this, "comboBox" ); + life = new LifeWidget(scale, this); + life->move( SIDEBORDER, TOPBORDER ); + + + connect( qb, SIGNAL(clicked()), qApp, SLOT(quit()) ); + qb->setGeometry( SIDEBORDER, SIDEBORDER, qb->sizeHint().width(), 25 ); + timer = new LifeTimer( this ); + + connect( timer, SIGNAL(timeout()), life, SLOT(nextGeneration()) ); + pb = new QPushButton( "Pause", this ); + pb->setToggleButton( TRUE ); + connect( pb, SIGNAL(toggled(bool)), timer, SLOT(pause(bool)) ); + pb->resize( pb->sizeHint().width(), 25 ); + pb->move( width() - SIDEBORDER - pb->width(), SIDEBORDER ); + + sp = new QLabel( "Speed:", this ); + sp->adjustSize(); + sp->move( SIDEBORDER, 45 ); + scroll = new QSlider( 0, LifeTimer::MAXSPEED, 50, + LifeTimer::MAXSPEED / 2, + QSlider::Horizontal, this ); + connect( scroll, SIGNAL(valueChanged(int)), + timer, SLOT(setSpeed(int)) ); + + scroll->move( sp->width() + 2 * SIDEBORDER, 45 ); + scroll->resize( 200, 15 ); + + life->setFrameStyle( QFrame::Panel | QFrame::Sunken ); + life->show(); + + srand( QTime(0,0,0).msecsTo(QTime::currentTime()) ); + int sel = rand() % NPATS; + getPattern( sel ); + + cb->move( 2*SIDEBORDER + qb->width(), SIDEBORDER); + cb->insertItem( "Glider Gun " ); + cb->insertItem( "Figure Eight " ); + cb->insertItem( "Pulsar " ); + cb->insertItem( "Barber Pole P2 " ); + cb->insertItem( "Achim P5 " ); + cb->insertItem( "Hertz P4 " ); + cb->insertItem( "Tumbler " ); + cb->insertItem( "Pulse1 P4" ); + cb->insertItem( "Shining Flower P5 " ); + cb->insertItem( "Pulse2 P6 " ); + cb->insertItem( "Pinwheel, Clock P4 " ); + cb->insertItem( "Pentadecatholon " ); + cb->insertItem( "Piston " ); + cb->insertItem( "Piston2 " ); + cb->insertItem( "Switch Engine " ); + cb->insertItem( "Gears (Gear, Flywheel, Blinker) " ); + cb->insertItem( "Turbine8 " ); + cb->insertItem( "P16 " ); + cb->insertItem( "Puffer " ); + cb->insertItem( "Escort " ); + cb->insertItem( "Dart Speed 1/3 " ); + cb->insertItem( "Period 4 Speed 1/2 " ); + cb->insertItem( "Another Period 4 Speed 1/2 " ); + cb->insertItem( "Smallest Known Period 3 Spaceship Speed 1/3 " ); + cb->insertItem( "Turtle Speed 1/3 " ); + cb->insertItem( "Smallest Known Period 5 Speed 2/5 " ); + cb->insertItem( "Sym Puffer " ); + cb->insertItem( "], Near Ship, Pi Heptomino " ); + cb->insertItem( "R Pentomino " ); + cb->setAutoResize( FALSE ); + cb->setCurrentItem( sel ); + cb->show(); + connect( cb, SIGNAL(activated(int)), SLOT(getPattern(int)) ); + + QSize s; + s = life->minimumSize(); + setMinimumSize( s.width() + 2 * SIDEBORDER, + s.height() + TOPBORDER + SIDEBORDER ); + s = life->maximumSize(); + setMaximumSize( s.width() + 2 * SIDEBORDER, + s.height() + TOPBORDER + SIDEBORDER ); + s = life->sizeIncrement(); + setSizeIncrement( s.width(), s.height() ); + + resize( QMIN(512, qApp->desktop()->width()), + QMIN(480, qApp->desktop()->height()) ); +} + + +void LifeDialog::resizeEvent( QResizeEvent * e ) +{ + life->resize( e->size() - QSize( 2 * SIDEBORDER, TOPBORDER + SIDEBORDER )); + pb->move( e->size().width() - SIDEBORDER - pb->width(), SIDEBORDER ); + scroll->resize( e->size().width() - sp->width() - 3 * SIDEBORDER, + scroll->height() ); + cb->resize( width() - 4*SIDEBORDER - qb->width() - pb->width() , 25 ); +} + + +// Adapted from xlock, see pattern.cpp for copyright info. + +void LifeDialog::getPattern( int pat ) +{ + life->clear(); + int i = pat % NPATS; + int col; + int * patptr = &patterns[i][0]; + while ( (col = *patptr++) != 127 ) { + int row = *patptr++; + col += life->maxCol() / 2; + row += life->maxRow() / 2; + life->setPoint( col, row ); + } +} |