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(); }
void BoardWidget::resizeEvent(QResizeEvent *e) { PieceWidget::resizeEvent(e); drawBoard(); if (renderMode) updatePieces(); update(); }
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); }
/** 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(); } }
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(); } }
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); } }
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); }
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(); } }
void BoardWidget::renderPieces(bool r) { renderMode=r; if (renderMode) updatePieces(); update(); }