Beispiel #1
0
void ItemImage::setImage( const QImage& img )
{
    QMutexLocker locker( &mutex );

    clearContents();
    m_image = new QImage( img );
    if( m_image->width() < 32 && m_image->height() < 32 ) {
        setMinimumSize( QSize( 32, 32 ) );
        setMaximumSize( QSize( 32, 32 ) );
    } else if( m_image->width() < 32 && m_image->height() >= 32 ) {
        setMinimumSize( QSize( 32, m_image->size().height() ) );
        setMaximumSize( QSize( 32, m_image->size().height() ) );
    } else if( m_image->width() >= 32 && m_image->height() < 32 ) {
        setMinimumSize( QSize( m_image->size().width(), 32 ) );
        setMaximumSize( QSize( m_image->size().width(), 32 ) );
    } else {
        setMinimumSize( m_image->size() );
        setMaximumSize( m_image->size() );
    }

    emit imageChanged( img );

    updatePieces();
    update();
}
Beispiel #2
0
void BoardWidget::resizeEvent(QResizeEvent *e)
{
    PieceWidget::resizeEvent(e);

    drawBoard();
    if (renderMode) updatePieces();
    update();
}
Beispiel #3
0
void BoardWidget::mouseReleaseEvent( QMouseEvent* pEvent )
{
    if (!gettingMove && !editMode) return;
    mbDown = false;

    if (editMode) {
	int i;

	//    printf("Releasing...");
	for(i=0; i<Board::AllFields;i++)
	    if (field[i] == Board::color1bright ||
		field[i] == Board::color2bright) {
		//printf(" Found %d\n",i);
		field[i] = editColor;
	    }

	for(i=0; i<Board::AllFields;i++)
	    board.setField( i, field[i]);

	int vState = board.validState(); // set color1/2Count
	color1Count = board.getColor1Count();
	color2Count = board.getColor2Count();

	if (renderMode) updatePieces();
	update();

	emit edited(vState);
	return;
    }

    if (!startValid) return;

    int pos = positionOf( pEvent->x(), pEvent->y() );
    if (isValidEnd(pos)) {
	startValid = false;
	setCursor(Qt::CrossCursor);
	gettingMove = false;
	updatePosition(true);
	emit moveChoosen(actMove);
	qDebug() << "Move" << actMove.name() << "chosen";
	return;
    }

    updatePosition(true);
    startValid = false;
    setCursor(Qt::CrossCursor);

    QString tmp;
    emit updateSpy(tmp);
}
Beispiel #4
0
/** updatePosition
 *
 * Update my position with that of the <board> member.
 * If <updateGUI> is true, draw widget
 */
void BoardWidget::updatePosition(bool updateGUI)
{
    for(int i=0; i<Board::AllFields;i++)
	field[i] = board[i];
    color1Count = board.getColor1Count();
    color2Count = board.getColor2Count();
    color       = board.actColor();
    boardOK     = true;

    if (updateGUI) {
	if (renderMode) updatePieces();
	update();
    }
}
Beispiel #5
0
void BoardWidget::showStart(const Move& m, int step, bool updateGUI)
{
    int f, dir;
    int colorNew;

    if (boardOK) {
	/* board ok means: board has the normal state before move */
	if (step == 0)
	    return;      /* nothing to be done */
    }
    boardOK = (step == 0) ? true:false;

    if (color == Board::color1)
	colorNew = (step==0) ? Board::color1 : Board::color1bright;
    else
	colorNew = (step==0) ? Board::color2 : Board::color2bright;

    f = m.field;

    /* first field */
    field[f] = colorNew;

    switch(m.type) {
    case Move::left3:
    case Move::right3:
	dir = Board::fieldDiffOfDir(m.direction);
	field[f + dir] = colorNew;
	field[f + 2*dir] = colorNew;
	break;
    case Move::left2:
    case Move::right2:
	dir = Board::fieldDiffOfDir(m.direction);
	field[f + dir] = colorNew;
    default:
	break;
    }

    if (updateGUI) {
	if (renderMode) updatePieces();
	update();
    }
}
Beispiel #6
0
void BoardWidget::mouseMoveEvent( QMouseEvent* pEvent )
{
    if ((!gettingMove && !editMode) || !mbDown) return;

    int pos = positionOf( pEvent->x(), pEvent->y() );
    if (pos == oldPos) return;
    oldPos = pos;

    if (editMode) {
	int f = fieldOf(pos);
	if (field[f] != Board::out && field[f] != editColor) {
	    if      (editColor == Board::color1) field[f] = Board::color1bright;
	    else if (editColor == Board::color2) field[f] = Board::color2bright;
	    else if (field[f] == Board::color1)  field[f] = Board::color1bright;
	    else if (field[f] == Board::color2)  field[f] = Board::color2bright;

	    if (renderMode) updatePieces();
	    update();
	}
	return;
    }

    if (!startValid) {
	/* We haven't a valid move yet. Check if we are over a valid start */

	startValid = isValidStart(pos, (pEvent->button() == Qt::MidButton));
	qDebug() << "Start pos " << pos << " is valid: " << startValid;
	//    actMove.print();

	if (!startValid) return;
	startPos = oldPos = pos;

	showStart(actMove,1);
	startShown = true;

	QString tmp;
	actValue = - board.calcEvaluation();
	tmp = tr("Board value: %1").arg(actValue);
	emit updateSpy(tmp);
	return;
    }

    /* restore board */
    updatePosition();
    startShown = false;

    if (isValidEnd(pos)) {
	//    actMove.print();

	board.playMove(actMove);
	int v = board.calcEvaluation();
	board.takeBack();

	QString tmp;
	tmp.sprintf("%+d", v-actValue);
	QString str = QString("%1 : %2").arg(actMove.name()).arg(tmp);
	emit updateSpy(str);

	showMove(actMove,3);
	setCursor(*arrow[shownDirection]);
    }
    else {
	QString tmp;

	setCursor(Qt::CrossCursor);
	if (pos == startPos) {
	    showStart(actMove,1);
	    startShown = true;
	    tmp = tr("Board value: %1").arg(actValue);
	}
	else {

	    if (renderMode) updatePieces();
	    update();
	}
	emit updateSpy(tmp);
    }
}
Beispiel #7
0
void BoardWidget::mousePressEvent( QMouseEvent* pEvent )
{
    int pos = positionOf( pEvent->x(), pEvent->y() );
    int f = fieldOf(pos);

    if (pEvent->button() == Qt::RightButton) {
	emit rightButtonPressed(f, pEvent->globalPos());
	return;
    }

    if (!gettingMove && !editMode) {
	return;
    }
    mbDown = true;


    if (editMode) {
	editColor = (pEvent->button() == Qt::MidButton) ?
			Board::color2 : Board::color1;
	int newColor = (pEvent->button() == Qt::MidButton) ?
			   Board::color2bright : Board::color1bright;

	if (field[f] == Board::free) {
	    field[f] = newColor;
	}
	else if (field[f] == Board::color1) {
	    if (editColor == Board::color1) {
		editColor = Board::free;
		newColor = Board::color1bright;
	    }
	    field[f] = newColor;
	}
	else if (field[f] == Board::color2) {
	    if (editColor == Board::color2) {
		editColor = Board::free;
		newColor = Board::color2bright;
	    }
	    field[f] = newColor;
	}
	else {
	    editColor = Board::out;
	}

	oldPos = pos;

	if (renderMode) updatePieces();
	update();

	return;
    }

    startValid = isValidStart(pos, (pEvent->button() == Qt::MidButton));
    //qDebug() << "Start pos " << pos << " is valid: " << startValid;
    //  actMove.print();

    if (!startValid) return;
    startPos = oldPos = pos;

    showStart(actMove,1);
    startShown = true;

    QString tmp;
    actValue = - board.calcEvaluation();
    tmp = tr("Board value: %1").arg(actValue);
    emit updateSpy(tmp);
}
Beispiel #8
0
void BoardWidget::showMove(const Move& mm, int step, bool updateGUI)
{
    int f, dir, dir2;
    int opponentNew, colorNew;
    bool afterMove;
    static Move lastMove;
    Move m;

    if (boardOK) {
	/* board ok means: board has the normal state
     *  (e.g. no highlighting)
     */
	if (step == 0)
	    return;      /* nothing to be done */
    }
    boardOK = (step == 0) ? true:false;

    if (step == 0)
	m = lastMove;
    else {
	m = lastMove = mm;
    }

    if (color == Board::color1) {
	colorNew = (step<2) ? Board::color1 :
			      (step>2) ? Board::color1bright:Board::free;
	opponentNew = (step<2) ? Board::color2 : Board::color2bright;
    }
    else {
	colorNew = (step<2) ? Board::color2 :
			      (step>2) ? Board::color2bright:Board::free;
	opponentNew = (step<2) ? Board::color1 : Board::color1bright;
    }

    afterMove = (step == 1) || (step == 4);

    f = m.field;
    dir = Board::fieldDiffOfDir(m.direction);

    /* first field */
    field[f] = afterMove ? Board::free : colorNew;

    switch(m.type) {
    case Move::out2:        /* (c c c o o |) */
	field[f + dir] = colorNew;
	field[f + 2*dir] = colorNew;
	field[f + 3*dir] = afterMove ? colorNew : opponentNew;
	field[f + 4*dir] = opponentNew;
	break;
    case Move::out1with3:   /* (c c c o |)   */
	field[f + dir] = colorNew;
	field[f + 2*dir] = colorNew;
	field[f + 3*dir] = afterMove ? colorNew : opponentNew;
	break;
    case Move::move3:       /* (c c c .)     */
	field[f + dir] = colorNew;
	field[f + 2*dir] = colorNew;
	field[f + 3*dir] = afterMove ? colorNew : Board::free;
	break;
    case Move::out1with2:   /* (c c o |)     */
	field[f + dir] = colorNew;
	field[f + 2*dir] = afterMove ? colorNew : opponentNew;
	break;
    case Move::move2:       /* (c c .)       */
	field[f + dir] = colorNew;
	field[f + 2*dir] = afterMove ? colorNew : Board::free;
	break;
    case Move::push2:       /* (c c c o o .) */
	field[f + dir] = colorNew;
	field[f + 2*dir] = colorNew;
	field[f + 3*dir] = afterMove ? colorNew : opponentNew;
	field[f + 4*dir] = opponentNew;
	field[f + 5*dir] = afterMove ? opponentNew : Board::free;
	break;
    case Move::left3:
	dir2 = Board::fieldDiffOfDir(m.direction-1);
	field[f+dir2] = afterMove ? colorNew : Board::free;
	field[f+=dir] = afterMove ? Board::free : colorNew;
	field[f+dir2] = afterMove ? colorNew : Board::free;
	field[f+=dir] = afterMove ? Board::free : colorNew;
	field[f+dir2] = afterMove ? colorNew : Board::free;
	break;
    case Move::right3:
	dir2 = Board::fieldDiffOfDir(m.direction+1);
	field[f+dir2] = afterMove ? colorNew : Board::free;
	field[f+=dir] = afterMove ? Board::free : colorNew;
	field[f+dir2] = afterMove ? colorNew : Board::free;
	field[f+=dir] = afterMove ? Board::free : colorNew;
	field[f+dir2] = afterMove ? colorNew : Board::free;
	break;
    case Move::push1with3:   /* (c c c o .) => (. c c c o) */
	field[f + dir] = colorNew;
	field[f + 2*dir] = colorNew;
	field[f + 3*dir] = afterMove ? colorNew : opponentNew;
	field[f + 4*dir] = afterMove ? opponentNew : Board::free;
	break;
    case Move::push1with2:   /* (c c o .) => (. c c o) */
	field[f + dir] = colorNew;
	field[f + 2*dir] = afterMove ? colorNew : opponentNew;
	field[f + 3*dir] = afterMove ? opponentNew : Board::free;
	break;
    case Move::left2:
	dir2 = Board::fieldDiffOfDir(m.direction-1);
	field[f+dir2] = afterMove ? colorNew : Board::free;
	field[f+=dir] = afterMove ? Board::free : colorNew;
	field[f+dir2] = afterMove ? colorNew : Board::free;
	break;
    case Move::right2:
	dir2 = Board::fieldDiffOfDir(m.direction+1);
	field[f+dir2] = afterMove ? colorNew : Board::free;
	field[f+=dir] = afterMove ? Board::free : colorNew;
	field[f+dir2] = afterMove ? colorNew : Board::free;
	break;
    case Move::move1:       /* (c .) => (. c) */
	field[f + dir] = afterMove ? colorNew : Board::free;
	break;
    default:
	break;
    }

    if (updateGUI) {
	if (renderMode) updatePieces();
	update();
    }
}
Beispiel #9
0
void BoardWidget::renderPieces(bool r)
{
    renderMode=r;
    if (renderMode) updatePieces();
    update();
}