Newer
Older
Import / applications / Chess / QtChessBoard.cpp
/*
 * =====================================================================================
 *
 *       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();
}