Source Code (Use browser search to find items of interest.)
Class Index
kabalone'BoardWidget (./kdegames/kabalone/BoardWidget.h:12)
class BoardWidget : public BallWidget
{
Q_OBJECT
public:
BoardWidget(Board&, QWidget *parent = 0, const char *name = 0);
~BoardWidget();
void createPos(int , int , int , Ball*);
void initBalls();
void updateBalls();
virtual void resizeEvent(QResizeEvent *);
virtual void paintEvent(QPaintEvent *);
virtual void mousePressEvent( QMouseEvent* pEvent );
virtual void mouseReleaseEvent( QMouseEvent* pEvent );
virtual void mouseMoveEvent( QMouseEvent* pEvent );
void renderBalls(bool r);
void draw();
void drawBoard();
void choseMove(MoveList*);
/* enable/disable Edit Mode:
* On disabling & valid position it's actually copied to Board
*/
bool setEditMode(bool);
int validState();
bool isValid() { return validState()==Board::valid; }
/* copy actual board position */
void copyPosition();
void clearPosition();
int getColor1Count() { return color1Count; }
int getColor2Count() { return color2Count; }
signals:
void moveChoosen(Move&);
void mousePressed(int);
void updateSpy(QString);
void edited(int);
private:
int positionOf(int x, int y);
bool isValidStart(int pos, bool);
bool isValidEnd(int pos);
QPixmap pm, boardPM;
Board& board;
int actValue;
bool editMode, renderMode;
int editColor;
/* copied position */
int field[Board::AllFields];
int color1Count, color2Count;
/* for getting user Move */
MoveList *pList;
Move actMove;
bool gettingMove, mbDown, startValid, startShown;
int startPos, actPos, oldPos, shownDirection;
int startField, startField2, actField, oldField, startType;
QColor *boardColor, *redColor, *yellowColor, *redHColor, *yellowHColor;
QCursor *arrowAll, *arrow[7];
Ball *n1, *n2, *h1, *h2, *d1, *d2; //, *e;
};
kabalone'BoardWidget::BoardWidget() (./kdegames/kabalone/BoardWidget.cpp:39)
BoardWidget::BoardWidget(Board& b, QWidget *parent, const char *name)
: BallWidget(5,9,parent, name), board(b)
{
pList =0;
gettingMove = false;
editMode = false;
renderMode = false;
/* setup cursors */
kabalone'BoardWidget::~BoardWidget() (./kdegames/kabalone/BoardWidget.cpp:77)
BoardWidget::~BoardWidget()
{
for(int i=1; i<7; i++)
if (arrow[i] != 0)
delete arrow[i];
}
kabalone'BoardWidget::createPos() (./kdegames/kabalone/BoardWidget.cpp:84)
void BoardWidget::createPos(int pos, int i, int j, Ball* b)
{
int x=(465*(2*(i)-(j))/9);
int y=(500*19*(j)/100);
createBallPosition(pos, x,y, b);
}
kabalone'BoardWidget::initBalls() (./kdegames/kabalone/BoardWidget.cpp:91)
void BoardWidget::initBalls()
{
n2 = new Ball( *yellowColor );
h2 = new Ball( *yellowHColor );
d2 = new Ball( *yellowHColor, 3.14/2 );
n1 = new Ball( *redColor );
h1 = new Ball( *redHColor );
d1 = new Ball( *redHColor, 3.14/2 );
// e = new Ball( white,0,0 );
// e->setSpecials(.6,.85,.75);
createBlending(1,5,n1,h1);
createBlending(2,5,h1,d1);
createBlending(3,5,n2,h2);
createBlending(4,5,h2,d2);
int i,j,pos;
for(j=-4;j<5;j++)
for(i= ((j>0)?j-4:-4) ; i< ((j<0)?5+j:5) ;i++) {
pos=60+j*11+i;
createPos(pos, i,j, 0);
}
pos = 0;
/* the outer marks of color1 */
for(i=0;i<3;i++) createPos(pos++, -6, i-4, 0 );
for(i=0;i<3;i++) createPos(pos++, 2+i, i-4, 0 );
/* the outer marks of color2 */
for(i=0;i<3;i++) createPos(pos++, 6, 4-i, 0 );
for(i=0;i<3;i++) createPos(pos++, -2-i, 4-i, 0 );
}
kabalone'BoardWidget::resizeEvent() (./kdegames/kabalone/BoardWidget.cpp:126)
void BoardWidget::resizeEvent(QResizeEvent *e)
{
drawBoard();
BallWidget::resizeEvent(e);
}
kabalone'BoardWidget::paintEvent() (./kdegames/kabalone/BoardWidget.cpp:132)
void BoardWidget::paintEvent(QPaintEvent *)
{
if (renderMode) {
pm = boardPM;
BallWidget::paint(&pm);
}
else
draw();
bitBlt(this, 0, 0, &pm);
}
kabalone'BoardWidget::drawBoard() (./kdegames/kabalone/BoardWidget.cpp:202)
void BoardWidget::drawBoard()
{
QColorGroup g = QPalette( *boardColor ).normal();
QColorGroup g2 = QWidget::colorGroup();
int boardSize = width() *10/12;
if (boardSize > height()) boardSize = height();
boardPM.resize(width(), height());
boardPM.fill(this, 0,0);
QPainter p;
p.begin(&boardPM);
p.setBrush(g2.brush(QColorGroup::Mid));
QWMatrix m;
QPoint cp = rect().center();
m.translate(cp.x(), cp.y());
m.scale(boardSize/1100.0, boardSize/1000.0);
m.rotate(0);
p.setWorldMatrix(m);
/* draw field */
int i,j;
QPointArray a;
int dx=520 /2, dy=(520 *87)/100;
a.setPoints(6, -dx,-dy, dx,-dy, 2*dx,0, dx,dy, -dx,dy, -2*dx,0 );
p.drawPolygon(a);
drawShadedHexagon(&p, 0,0, 505, 1, g, false);
drawShadedHexagon(&p, 0,0, 512, 3, g, true);
drawShadedHexagon(&p, 0,0, 525, 5, g2, true);
kabalone'BoardWidget::renderBalls() (./kdegames/kabalone/BoardWidget.cpp:254)
void BoardWidget::renderBalls(bool r)
{
renderMode=r;
draw();
}
kabalone'BoardWidget::updateBalls() (./kdegames/kabalone/BoardWidget.cpp:260)
void BoardWidget::updateBalls()
{
int i,j;
for(j=-4;j<5;j++)
for(i= ((j>0)?j-4:-4) ; i< ((j<0)?5+j:5) ;i++) {
int pos = 60+j*11+i;
int w=field[60+j*11+i];
if (w==Board::color1) {
if (positions[pos]->def != n1) {
positions[pos]->def= n1;
startAnimation(pos,1, ANIMATION_FORWARD);
}
else
stopAnimation(pos);
}
else if (w==Board::color1bright)
startAnimation(pos,2,ANIMATION_LOOP);
else if (w==Board::color2) {
if (positions[pos]->def != n2) {
positions[pos]->def= n2;
startAnimation(pos,3,ANIMATION_FORWARD);
}
else
stopAnimation(pos);
}
else if (w==Board::color2bright)
startAnimation(pos,4,ANIMATION_LOOP);
else if (w==Board::free) {
positions[pos]->def= 0;
stopAnimation(pos);
}
}
for(i=0;i<6;i++)
positions[i]->def= ((14-color1Count)>i && color1Count>0) ? n1:0;
for(i=6;i<12;i++)
positions[i]->def= ((14-color2Count)>i-6 && color2Count>0) ? n2:0;
}
kabalone'BoardWidget::draw() (./kdegames/kabalone/BoardWidget.cpp:304)
void BoardWidget::draw()
{
if (boardPM.isNull())
return;
pm = boardPM;
if (renderMode) {
updateBalls();
repaint(false);
return;
}
int boardSize = width() *10/12;
if (boardSize > height()) boardSize = height();
QPainter p;
p.begin(&pm);
p.setBrush(foregroundColor());
QWMatrix m;
QPoint cp = rect().center();
m.translate(cp.x(), cp.y());
m.scale(boardSize/1100.0, boardSize/1000.0);
m.rotate(0);
p.setWorldMatrix(m);
/* draw fields */
int i,j;
for(j=-4;j<5;j++)
for(i= ((j>0)?j-4:-4) ; i< ((j<0)?5+j:5) ;i++) {
int x=xpos(i,j);
int y=ypos(j);
int w=field[60+j*11+i];
if (w==Board::color1)
drawColor(&p, x,y, 35, redColor );
else if (w==Board::color1bright)
drawColor(&p, x,y, 35, redHColor );
else if (w==Board::color2)
drawColor(&p, x,y, 35, yellowColor );
else if (w==Board::color2bright)
drawColor(&p, x,y, 35, yellowHColor );
}
if (color1Count >0) {
/* the outer marks of color1 */
if (color1Count <12) {
for(i=11; i>8 && i>color1Count ;i--)
drawColor(&p, xpos(12-i,7-i)+55, ypos(7-i), 35, redColor );
}
for(i=14; i>11 && i>color1Count ;i--)
drawColor(&p, xpos(-6,10-i)+55, ypos(10-i), 35, redColor );
/* the outer marks of color2 */
if (color2Count <12) {
for(i=11; i>8 && i>color2Count ;i--)
drawColor(&p, xpos(i-12,i-7)-55, ypos(i-7), 35, yellowColor);
}
for(i=14; i>11 && i>color2Count ;i--)
drawColor(&p, xpos(6,i-10)-55, ypos(i-10), 35, yellowColor);
}
p.end();
bitBlt(this, 0, 0, &pm);
}
kabalone'BoardWidget::copyPosition() (./kdegames/kabalone/BoardWidget.cpp:374)
void BoardWidget::copyPosition()
{
for(int i=0; i<Board::AllFields;i++)
field[i] = board[i];
color1Count = board.getColor1Count();
color2Count = board.getColor2Count();
}
kabalone'BoardWidget::setEditMode() (./kdegames/kabalone/BoardWidget.cpp:383)
bool BoardWidget::setEditMode(bool mode)
{
if (editMode == false && mode==true) {
editMode = true;
}
else if (editMode == true && mode == false) {
editMode = false;
for(int i=0; i<Board::AllFields;i++)
board.setField( i, field[i]);
board.setColor1Count(color1Count);
board.setColor2Count(color2Count);
}
return editMode;
}
kabalone'BoardWidget::validState() (./kdegames/kabalone/BoardWidget.cpp:400)
int BoardWidget::validState()
{
int c1 = 0, c2 = 0;
int i,j;
for(i=0;i<Board::AllFields;i++) {
j=field[i];
if (j == Board::color1) c1++;
if (j == Board::color2) c2++;
}
color1Count = c1;
color2Count = c2;
if (c1==0 && c2==0)
return Board::empty;
if (c1>8 && c1<15 && c2>8 && c2<15)
return Board::valid;
return Board::invalid;
}
kabalone'BoardWidget::clearPosition() (./kdegames/kabalone/BoardWidget.cpp:422)
void BoardWidget::clearPosition()
{
for(int i=0; i<Board::AllFields;i++)
field[i] = 0;
color1Count = color2Count = 0;
}
kabalone'BoardWidget::choseMove() (./kdegames/kabalone/BoardWidget.cpp:429)
void BoardWidget::choseMove(MoveList *pl)
{
if (!gettingMove && pl != 0) {
pList = pl;
gettingMove = true;
mbDown = false;
actValue = - board.calcValue();
PRINT(( "Chose Move...\n" ));
}
}
/* returns position of point (xx,yy)
*/
kabalone'BoardWidget::positionOf() (./kdegames/kabalone/BoardWidget.cpp:443)
int BoardWidget::positionOf(int xx, int yy)
{
int boardSize = QMIN( width()*10/12, height() );
int x = (1000 * (xx- (width()-boardSize)/2)) / boardSize;
int y = (1000 * (yy- (height()-boardSize)/2)) / boardSize;
PRINT(( "(%d,%d) -> (%d,%d)\n", xx,yy, x,y ));
y = (y-2)/47;
if (y < 2 || y > 18) return 0;
x= ((x+25)/25+ (y-10) )/2;
if (y < 10 && ((x < 2) || (x > 8+y) )) return 0;
if (y >= 10 && ((x < y-8) || (x > 18) )) return 0;
return 22*y + x;
}
kabalone'BoardWidget::isValidStart() (./kdegames/kabalone/BoardWidget.cpp:532)
bool BoardWidget::isValidStart(int pos, bool midPressed)
{
bool res = false;
int f1 = fieldOf(pos);
startField = f1;
if (isBetweenFields(pos)) {
int f2 = field2Of(pos);
actMove = Move(f1, directionOfFieldDiff( f2-f1 ), Move::none);
res = pList->isElement(actMove, MoveList::start2);
if (!res) {
startField = f2;
actMove = Move(f2, directionOfFieldDiff( f1-f2 ), Move::none);
res = pList->isElement(actMove, MoveList::start2);
}
startType = MoveList::start2;
return res;
}
if (midPressed) {
startType = MoveList::start3;
/* Check all 6 directions */
for(int dir=1;dir<7;dir++) {
actMove = Move(f1 - Board::fieldDiffOfDir(dir), dir, Move::none );
if (pList->isElement(actMove, startType))
return true;
}
/* if we don't find a side move3 fall trough to normal moves... */
}
startType = MoveList::start1;
actMove = Move(f1, 0, Move::none);
res = pList->isElement(actMove, startType);
return res;
}
/* Check if <pos> is a valid end position for a move
* regarding <startPos>
* If yes, set <actMove>
*/
kabalone'BoardWidget::isValidEnd() (./kdegames/kabalone/BoardWidget.cpp:577)
bool BoardWidget::isValidEnd(int pos)
{
int dir = directionOfPosDiff(pos - startPos);
Move m;
if (dir == 0) return false;
switch(startType) {
case MoveList::start1:
m = Move(startField, dir, Move::none);
if (!pList->isElement(m, startType))
return false;
break;
case MoveList::start2:
{
int f1 = fieldOf(startPos);
int f2 = field2Of(startPos);
int dir2 = directionOfFieldDiff( f2-f1 );
int dir3 = directionOfFieldDiff( f1-f2 );
switch((dir2-dir+6)%6) {
case 1:
m = Move(f1, dir2, Move::left2);
break;
case 2:
m = Move(f2, dir3, Move::right2);
break;
case 4:
m = Move(f2, dir3, Move::left2);
break;
case 5:
m = Move(f1, dir2, Move::right2);
break;
default:
return false;
}
if (!pList->isElement(m, startType))
return false;
break;
}
case MoveList::start3:
{
int rightDir = (dir%6)+1;
m = Move( startField - Board::fieldDiffOfDir(rightDir), rightDir, Move::left3 );
if (!pList->isElement(m, startType)) {
int leftDir = ((dir-2)%6)+1;
m = Move( startField - Board::fieldDiffOfDir(leftDir), leftDir, Move::right3 );
if (!pList->isElement(m, startType))
return false;
}
}
break;
}
actMove = m;
shownDirection = dir;
return true;
}
kabalone'BoardWidget::mousePressEvent() (./kdegames/kabalone/BoardWidget.cpp:640)
void BoardWidget::mousePressEvent( QMouseEvent* pEvent )
{
if (!gettingMove && !editMode) {
return;
}
mbDown = true;
int pos = positionOf( pEvent->x(), pEvent->y() );
int f = fieldOf(pos);
if (field[f]==Board::out) {
emit mousePressed(pEvent->button());
return;
}
if (editMode) {
editColor = (pEvent->button() == MidButton) ?
Board::color2 : Board::color1;
int newColor = (pEvent->button() == 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;
draw();
return;
}
startValid = isValidStart(pos, (pEvent->button() == MidButton));
PRINT(( "Start pos %d is %svalid.\n", pos, startValid ? "":"in" ));
// actMove.print();
if (!startValid) return;
startPos = oldPos = pos;
board.showStart(actMove,1);
startShown = true;
copyPosition();
draw();
QString tmp;
tmp = i18n("Board value: %1").arg(actValue);
emit updateSpy(tmp);
}
kabalone'BoardWidget::mouseMoveEvent() (./kdegames/kabalone/BoardWidget.cpp:705)
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) {
int newColor = (editColor == Board::color1) ? Board::color1bright :
(editColor == Board::color2) ? Board::color2bright :
(field[f] == Board::color1) ? Board::color1bright :
(field[f] == Board::color2) ? Board::color2bright : field[f];
field[f] = newColor;
draw();
}
return;
}
if (!startValid) {
/* We haven't a valid move yet. Check if we are over a valid start */
startValid = isValidStart(pos, (pEvent->button() == MidButton));
PRINT(( "Start pos %d is %svalid.\n", pos, startValid ? "":"in" ));
// actMove.print();
if (!startValid) return;
startPos = oldPos = pos;
board.showStart(actMove,1);
startShown = true;
copyPosition();
draw();
QString tmp;
tmp = i18n("Board value: %1").arg(actValue);
emit updateSpy(tmp);
return;
}
/* restore board */
if (startShown)
board.showStart(actMove,0);
else
board.showMove(actMove,0);
startShown = false;
if (isValidEnd(pos)) {
// actMove.print();
board.showMove(actMove,0);
board.playMove(actMove);
int v = board.calcValue();
board.takeBack();
QString tmp;
tmp.sprintf("%+d", v-actValue);
QString str = QString("%1 : %2").arg(actMove.name()).arg(tmp);
emit updateSpy(str);
board.showMove(actMove,3);
setCursor(*arrow[shownDirection]);
}
else {
QString tmp;
setCursor(crossCursor);
if (pos == startPos) {
board.showStart(actMove,1);
startShown = true;
tmp = i18n("Board value: %1").arg(actValue);
}
emit updateSpy(tmp);
}
copyPosition();
draw();
}
kabalone'BoardWidget::mouseReleaseEvent() (./kdegames/kabalone/BoardWidget.cpp:787)
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;
}
int vState = validState(); // set color1/2Count
for(i=0; i<Board::AllFields;i++)
board.setField( i, field[i]);
board.setColor1Count(color1Count);
board.setColor2Count(color2Count);
draw();
emit edited(vState);
return;
}
if (!startValid) return;
int pos = positionOf( pEvent->x(), pEvent->y() );
if (isValidEnd(pos)) {
// actMove.print();
board.showMove(actMove,0);
startValid = false;
setCursor(crossCursor);
gettingMove = false;
emit moveChoosen(actMove);
return;
}
board.showStart(actMove,0);
copyPosition();
draw();
startValid = false;
setCursor(crossCursor);
QString tmp;
emit updateSpy(tmp);
}