summaryrefslogtreecommitdiffstats
path: root/examples/tetrix/qtetrix.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/tetrix/qtetrix.cpp')
-rw-r--r--examples/tetrix/qtetrix.cpp176
1 files changed, 176 insertions, 0 deletions
diff --git a/examples/tetrix/qtetrix.cpp b/examples/tetrix/qtetrix.cpp
new file mode 100644
index 0000000..2ebeefd
--- /dev/null
+++ b/examples/tetrix/qtetrix.cpp
@@ -0,0 +1,176 @@
+/****************************************************************************
+**
+** 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 "qtetrix.h"
+#include <qapplication.h>
+#include <qlabel.h>
+#include <qdatetime.h>
+
+
+void drawTetrixButton( QPainter *p, int x, int y, int w, int h,
+ const QColor *color, QWidget *widg)
+{
+ if ( color ) {
+ QPointArray a;
+ a.setPoints( 3, x,y+h-1, x,y, x+w-1,y );
+ p->setPen( color->light() );
+ p->drawPolyline( a );
+ a.setPoints( 3, x+1,y+h-1, x+w-1,y+h-1, x+w-1,y+1 );
+ p->setPen( color->dark() );
+ p->drawPolyline( a );
+ x++;
+ y++;
+ w -= 2;
+ h -= 2;
+ p->fillRect( x, y, w, h, *color );
+ }
+ else if(widg) {
+ widg->erase(x, y, w, h);
+ } else {
+ p->fillRect(x, y, w, h, p->backgroundColor());
+ }
+}
+
+
+ShowNextPiece::ShowNextPiece( QWidget *parent, const char *name )
+ : QFrame( parent, name )
+{
+ setFrameStyle( QFrame::Panel | QFrame::Sunken );
+ xOffset = -1; // -1 until first resizeEvent.
+}
+
+void ShowNextPiece::resizeEvent( QResizeEvent *e )
+{
+ QSize sz = e->size();
+ blockWidth = (sz.width() - 3)/5;
+ blockHeight = (sz.height() - 3)/6;
+ xOffset = (sz.width() - 3)/5;
+ yOffset = (sz.height() - 3)/6;
+}
+
+
+void ShowNextPiece::paintEvent( QPaintEvent * )
+{
+ QPainter p( this );
+ drawFrame( &p );
+ p.end(); // explicit end() so any slots can paint too
+ emit update();
+}
+
+
+void ShowNextPiece::drawNextSquare(int x, int y,QColor *color)
+{
+ if (xOffset == -1) // Before first resizeEvent?
+ return;
+
+ QPainter paint;
+ paint.begin(this);
+ drawTetrixButton( &paint, xOffset+x*blockWidth, yOffset+y*blockHeight,
+ blockWidth, blockHeight, color, this );
+ paint.end();
+}
+
+
+QTetrix::QTetrix( QWidget *parent, const char *name )
+ : QWidget( parent, name )
+{
+ QTime t = QTime::currentTime();
+ TetrixPiece::setRandomSeed( (((double)t.hour())+t.minute()+t.second())/
+ (24+60+60) );
+
+#define ADD_LABEL( str, x, y, w, h ) \
+ { QLabel *label = new QLabel(str,this); \
+ label->setGeometry(x,y,w,h); \
+ label->setAlignment(AlignCenter|AlignVCenter); }
+
+ ADD_LABEL( "NEXT", 50, 10, 78, 30 );
+ ADD_LABEL( "SCORE", 330, 10, 178, 30 );
+ ADD_LABEL( "LEVEL", 50, 130, 78, 30 );
+ ADD_LABEL( "LINES REMOVED", 330, 130, 178, 30 );
+
+ board = new QTetrixBoard(this);
+ showNext = new ShowNextPiece(this);
+#ifndef QT_NO_LCDNUMBER
+ showScore = new QLCDNumber(5,this);
+ showLevel = new QLCDNumber(2,this);
+ showLines = new QLCDNumber(5,this);
+#else
+ showScore = new QLabel("0",this);
+ showLevel = new QLabel("0",this);
+ showLines = new QLabel("0",this);
+ showScore->setAlignment(AlignCenter);
+ showLines->setAlignment(AlignCenter);
+ showLevel->setAlignment(AlignCenter);
+ showScore->setFrameStyle(QFrame::Sunken|QFrame::Box);
+ showLines->setFrameStyle(QFrame::Sunken|QFrame::Box);
+ showLevel->setFrameStyle(QFrame::Sunken|QFrame::Box);
+#endif
+ quitButton = new QPushButton("&Quit",this);
+ startButton = new QPushButton("&New Game",this);
+ pauseButton = new QPushButton("&Pause",this);
+
+ // Don't let the buttons get keyboard focus
+ quitButton->setFocusPolicy( QWidget::NoFocus );
+ startButton->setFocusPolicy( QWidget::NoFocus );
+ pauseButton->setFocusPolicy( QWidget::NoFocus );
+
+ connect( board, SIGNAL(gameOverSignal()), SLOT(gameOver()) );
+ connect( board, SIGNAL(drawNextSquareSignal(int,int,QColor*)), showNext,
+ SLOT(drawNextSquare(int,int,QColor*)) );
+ connect( showNext, SIGNAL(update()), board, SLOT(updateNext()) );
+#ifndef QT_NO_LCDNUMBER
+ connect( board, SIGNAL(updateScoreSignal(int)), showScore,
+ SLOT(display(int)) );
+ connect( board, SIGNAL(updateLevelSignal(int)), showLevel,
+ SLOT(display(int)));
+ connect( board, SIGNAL(updateRemovedSignal(int)), showLines,
+ SLOT(display(int)));
+#else
+ connect( board, SIGNAL(updateScoreSignal(int)), showScore,
+ SLOT(setNum(int)) );
+ connect( board, SIGNAL(updateLevelSignal(int)), showLevel,
+ SLOT(setNum(int)));
+ connect( board, SIGNAL(updateRemovedSignal(int)), showLines,
+ SLOT(setNum(int)));
+#endif
+ connect( startButton, SIGNAL(clicked()), board, SLOT(start()) );
+ connect( quitButton , SIGNAL(clicked()), SLOT(quit()));
+ connect( pauseButton, SIGNAL(clicked()), board, SLOT(pause()) );
+
+ board->setGeometry( 150, 20, 153, 333 );
+ showNext->setGeometry( 50, 40, 78, 94 );
+ showScore->setGeometry( 330, 40, 178, 93 );
+ showLevel->setGeometry( 50, 160, 78, 93 );
+ showLines->setGeometry( 330, 160, 178, 93 );
+#ifndef QT_NO_LCDNUMBER
+ showScore->display( 0 );
+ showLevel->display( 0 );
+ showLines->display( 0 );
+#else
+ showScore->setNum( 0 );
+ showLevel->setNum( 0 );
+ showLines->setNum( 0 );
+#endif
+ startButton->setGeometry( 46, 288, 90, 30 );
+ quitButton->setGeometry( 370, 265, 90, 30 );
+ pauseButton->setGeometry( 370, 310, 90, 30 );
+ board->revealNextPiece(TRUE);
+
+ resize( 550, 370 );
+}
+
+void QTetrix::gameOver()
+{
+}
+
+
+void QTetrix::quit()
+{
+ qApp->quit();
+}