/*
* =====================================================================================
*
* Filename: QtChessBoard.cpp
*
* Description:
*
* Version: 1.0
* Created: 21/02/2011 08:28:40
* Revision: none
* Compiler: gcc
*
* Author: John Ryland (jryland), jryland@xiaofrog.com
* Company: InvertedLogic
*
* =====================================================================================
*/
#include <QtChessBoard.h>
#include <QPainter>
#include <QPixmap>
#include <QMouseEvent>
QtChessBoard::QtChessBoard(QWidget *parent, AbstractChessBoard *brd) : QWidget(parent)
{
if ( !brd )
brd = new AbstractChessBoard;
board = brd;
haveSelected = false;
haveCursor = false;
f = new QFile("game-data.txt");
f->open(QFile::ReadOnly);
f->readLine(1024);
f->readLine(1024);
f->readLine(1024);
f->readLine(1024);
f->readLine(1024);
f->readLine(1024);
startTimer(2000);
}
QtChessBoard::~QtChessBoard()
{
}
void QtChessBoard::timerEvent(QTimerEvent *te)
{
static bool whitesMove = true;
static QByteArray ba;
if ( whitesMove ) {
ba = f->readLine(1024);
}
repaint();
}
void QtChessBoard::paintEvent(QPaintEvent *pe)
{
int w = width();
int h = height();
int s = qMin(w, h);
int sqr = s / 8;
int xOffset = (w - s) / 2;
int yOffset = (h - s) / 2;
QPainter p(this);
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if ( (i + j) % 2 )
p.setBrush(Qt::black);
else
p.setBrush(Qt::white);
p.drawRect(xOffset + i*sqr, yOffset + j*sqr, sqr, sqr);
}
}
p.setBrush(Qt::NoBrush);
if ( haveCursor ) {
p.setPen(Qt::yellow);
p.drawRect(xOffset + cursor.file*sqr, yOffset + cursor.rank*sqr, sqr, sqr);
}
if ( haveSelected ) {
p.setPen(Qt::green);
p.drawRect(xOffset + selected.file*sqr, yOffset + selected.rank*sqr, sqr, sqr);
}
foreach (AbstractChessPiece *piece, board->pieces) {
int y = ( piece->color == Black ) ? 0 : 32;
int i = piece->position.file;
int j = piece->position.rank;
int x;
switch (piece->type) {
case Pawn: x = 0; break;
case Bishop: x = 16; break;
case Knight: x = 32; break;
case Rook: x = 48; break;
case Queen: x = 64; break;
case King: x = 80; break;
default: break;
}
QPixmap pieces("Graphics/pieces-small.png");
if ( haveSelected && piece->position.rank == selected.rank && piece->position.file == selected.file ) {
p.drawPixmap(mx - sqr*9/32, my - sqr*7/16, sqr*7/16, sqr*7/8, pieces, x, y, 16, 32);
} else
p.drawPixmap(xOffset + i*sqr + sqr*9/32, yOffset + j*sqr + sqr/16, sqr*7/16, sqr*7/8, pieces, x, y, 16, 32);
}
}
void QtChessBoard::mouseMoveEvent(QMouseEvent *me)
{
int w = width();
int h = height();
int s = qMin(w, h);
int sqr = s / 8;
int xOffset = (w - s) / 2;
int yOffset = (h - s) / 2;
mx = me->pos().x();
my = me->pos().y();
int i = (mx - xOffset) / sqr;
int j = (my - yOffset) / sqr;
haveCursor = false;
if (i >= 0 && i <= 7 && j >= 0 && j <= 7 ) {
cursor.file = i;
cursor.rank = j;
haveCursor = true;
}
repaint();
}
void QtChessBoard::mousePressEvent(QMouseEvent *me)
{
int w = width();
int h = height();
int s = qMin(w, h);
int sqr = s / 8;
int xOffset = (w - s) / 2;
int yOffset = (h - s) / 2;
mx = me->pos().x();
my = me->pos().y();
int i = (mx - xOffset) / sqr;
int j = (my - yOffset) / sqr;
selected.file = i;
selected.rank = j;
haveSelected = true;
repaint();
}
void QtChessBoard::mouseReleaseEvent(QMouseEvent *me)
{
haveSelected = false;
haveCursor = false;
repaint();
}