2 Copyright (c) 2006 Paolo Capriotti <p.capriotti@sns.it>
3 (c) 2006 Maurizio Monge <maurizio.monge@kdemail.net>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
14 #include <QMouseEvent>
15 #include "chesstable.h"
18 #include "connection.h"
19 #include "piecepool.h"
22 #include "movelist_table.h"
23 #include "infodisplay.h"
25 using namespace boost
;
27 ChessTable::ChessTable(QWidget
* parent
)
28 : KGameCanvasWidget(parent
)
32 , m_need_reload(false) {
34 setMouseTracking(true);
37 m_board
= new Board(this);
41 m_movelist
= new MoveList::Table
;
44 m_clock
= new Clock(this);
49 // create info display
50 m_info
= new InfoDisplay(this);
54 for(int i
=0;i
<2;i
++) {
55 m_pools
[i
] = new PiecePool(i
, m_board
, this);
63 ChessTable::~ChessTable() {
72 void ChessTable::settingsChanged() {
75 if (settings
["background"]) {
76 m_background
= new KGameCanvasTiledPixmap(QPixmap(settings
["background"].value
<QString
>()),
77 QSize(), QPoint(), false, this);
83 m_board
->settingsChanged();
84 m_clock
->settingsChanged();
85 m_info
->settingsChanged();
87 m_pools
[i
]->settingsChanged();
89 /* redo the layout, forcing reload */
96 ClickableCanvas
* ChessTable::eventItemAt(QPoint pos
) {
97 if (m_board
->boardRect().contains(pos
))
100 for (int i
=0; i
<2; i
++)
101 if (m_pools
[i
]->boardRect().contains(pos
))
104 if (m_clock
->rect().contains(pos
))
110 void ChessTable::setEntity(const boost::shared_ptr
<UserEntity
>& entity
) {
111 m_board
->setEntity(entity
);
114 void ChessTable::layout(bool force_reload
) {
115 force_reload
|= m_need_reload
;
116 m_need_reload
= false;
119 m_background
->setSize(size());
121 int b
= m_board
->marginSize();
122 Point gs
= m_board
->gridSize();
123 int sq_size
= std::max(0, std::min(int((width()-3*b
)/(gs
.x
+2.2)),
124 (gs
.y
== 0 ? 100000 : (height()-80-3*b
)/gs
.y
)) );
125 m_board
->moveTo(b
,80+2*b
);
126 m_board
->onResize( sq_size
, force_reload
);
128 m_clock
->moveTo(0, b
);
129 m_clock
->resize(QSize(m_board
->rect().width(), 80) /*, force_reload*/);
131 int x
= !!m_board
->flipped();
132 m_pools
[x
]->m_flipped
= false;
133 m_pools
[x
]->setGridWidth(3);
134 m_pools
[x
]->moveTo(sq_size
*gs
.x
+2*b
+b
/2, 80+b
+b
/2);
135 m_pools
[x
]->onResize(static_cast<int>(sq_size
*2.2/3), force_reload
);
138 m_pools
[x
]->m_flipped
= true;
139 m_pools
[x
]->setGridWidth(3);
140 m_pools
[x
]->moveTo(sq_size
*gs
.x
+2*b
+b
/2, 80+sq_size
*gs
.y
+b
*2+b
/2);
141 m_pools
[x
]->onResize(static_cast<int>(sq_size
*2.2/3), force_reload
);
143 m_info
->moveTo(sq_size
*gs
.x
+4*b
, 80+sq_size
*gs
.y
/2+b
+b
/2);
146 void ChessTable::resizeEvent(QResizeEvent
* /*e*/) {
150 void ChessTable::mouseReleaseEvent(QMouseEvent
* e
) {
153 m_mousegrab
->onMouseRelease(e
->pos() - m_mousegrab
->pos(), e
->button() );
157 ClickableCanvas
* cb
= eventItemAt(e
->pos());
158 if(cb
!= m_current
) {
160 m_current
->onMouseLeave();
163 cb
->onMouseMove(e
->pos() - cb
->pos(), 0);
172 void ChessTable::mousePressEvent(QMouseEvent
* e
) {
174 m_mousegrab
->onMousePress(e
->pos() - m_mousegrab
->pos(), e
->button() );
178 ClickableCanvas
* cb
= eventItemAt(e
->pos());
179 if(cb
!= m_current
) {
181 m_current
->onMouseLeave();
187 cb
->onMousePress(e
->pos() - cb
->pos(), e
->button() );
192 void ChessTable::mouseMoveEvent(QMouseEvent
* e
) {
194 m_mousegrab
->onMouseMove(e
->pos() - m_mousegrab
->pos(), e
->button() );
198 ClickableCanvas
* cb
= eventItemAt(e
->pos());
199 if(cb
!= m_current
) {
201 m_current
->onMouseLeave();
207 cb
->onMouseMove(e
->pos() - cb
->pos(), e
->button() );
210 void ChessTable::enterEvent(QEvent
*) { }
212 void ChessTable::leaveEvent(QEvent
*) {
214 m_current
->onMouseLeave();
218 void ChessTable::flip() {
222 m_pools
[i
]->flipAndMoveBy( QPoint(0, m_board
->squareSize()*8+m_board
->marginSize()) );
225 void ChessTable::flip(bool flipped
) {
226 if(m_board
->flipped() != flipped
)
230 void ChessTable::changeClock(int color
) {
231 if (m_clock
->running()) {
232 m_clock
->start(color
);
236 void ChessTable::updateTurn(int color
) {
237 m_clock
->activate(color
);
240 void ChessTable::stopClocks() {
244 void ChessTable::updateTime(int white
, int black
) {
245 m_clock
->setTime(0, white
);
246 m_clock
->setTime(1, black
);
249 void ChessTable::resetClock() {
252 m_clock
->setPlayers(Player(), Player());
255 void ChessTable::setPlayers(const Player
& white
, const Player
& black
) {
256 m_clock
->setPlayers(white
, black
);
259 void ChessTable::run() {
260 if (!m_clock
->running()) m_clock
->start(0);
263 void ChessTable::displayMessage(const QString
& msg
) {
264 std::cout
<< msg
<< std::endl
;