Removed prints
[tagua/yd.git] / src / chesstable.cpp
blob1dc8717108d4ed449fad205d2c7a062780e24d24
1 /*
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.
9 */
11 #include <iostream>
12 #include <QLayout>
13 #include <QSplitter>
14 #include <QMouseEvent>
15 #include "chesstable.h"
16 #include "game.h"
17 #include "gameinfo.h"
18 #include "connection.h"
19 #include "piecepool.h"
20 #include "clock.h"
21 #include "global.h"
22 #include "movelist_table.h"
23 #include "infodisplay.h"
25 using namespace boost;
27 ChessTable::ChessTable(QWidget* parent)
28 : KGameCanvasWidget(parent)
29 , m_wallpaper(NULL)
30 , m_current(NULL)
31 , m_mousegrab(NULL)
32 , m_need_reload(false) {
34 setMouseTracking(true);
36 // create m_board
37 m_board = new Board(this);
38 m_board->show();
40 // create move list
41 m_movelist = new MoveList::Table;
43 // create clocks
44 for(int i=0;i<2;i++) {
45 m_clocks[i] = new Clock(i, m_board, this);
46 m_clocks[i]->show();
48 m_clocks[0]->activate(0);
50 // create info display
51 m_info = new InfoDisplay(this);
52 // m_info->show();
54 // create pools
55 for(int i=0;i<2;i++) {
56 m_pools[i] = new PiecePool(i, m_board, this);
57 m_pools[i]->show();
60 m_board->raise();
61 settingsChanged();
64 ChessTable::~ChessTable() {
65 for(int i=0;i<2;i++)
66 delete m_clocks[i];
67 delete m_movelist;
68 delete m_board;
69 for(int i=0;i<2;i++)
70 delete m_pools[i];
71 delete m_info;
74 void ChessTable::settingsChanged() {
75 m_board->settingsChanged();
76 for(int i=0;i<2;i++)
77 m_clocks[i]->settingsChanged();
78 m_info->settingsChanged();
79 for(int i=0;i<2;i++)
80 m_pools[i]->settingsChanged();
82 if(m_wallpaper)
83 delete m_wallpaper;
85 QPixmap bg = m_board->tagsLoader()->getStaticValue<QPixmap>("wallpaper");
86 if(!bg.isNull()) {
87 m_wallpaper = new KGameCanvasTiledPixmap(bg, QSize(), QPoint(), false, this);
88 m_wallpaper->lower();
89 m_wallpaper->show();
91 else
92 m_wallpaper = 0;
94 /* redo the layout, forcing reload */
95 if(isVisible())
96 layout(true);
97 else
98 m_need_reload = true;
101 ClickableCanvas* ChessTable::eventItemAt(QPoint pos) {
102 if (m_board->boardRect().contains(pos))
103 return m_board;
105 for (int i=0; i<2; i++)
106 if (m_pools[i]->boardRect().contains(pos))
107 return m_pools[i];
109 for (int i=0; i<2; i++)
110 if (m_clocks[i]->rect().contains(pos))
111 return m_clocks[i];
113 return NULL;
116 void ChessTable::setEntity(const boost::shared_ptr<UserEntity>& entity) {
117 m_board->setEntity(entity);
120 void ChessTable::layout(bool force_reload) {
121 force_reload |= m_need_reload;
122 m_need_reload = false;
124 if (m_wallpaper) {
125 m_wallpaper->setSize(size());
126 QSize delta = (m_wallpaper->pixmap().size()-size())/2;
127 m_wallpaper->setOrigin(QPoint(delta.width(), delta.height()));
130 Point gs = m_board->gridSize();
131 int sq_size = std::max(0, std::min(int(width()/(gs.x+2.6+(2.0/3.0)*3)),
132 int(gs.y == 0 ? 100000 : height()/(gs.y+4.0/3.0))) );
133 int b = sq_size*2/3;
134 m_board->moveTo(b,b);
135 m_board->onResize( sq_size, force_reload);
137 int x = !m_board->flipped();
139 m_clocks[x]->resize();
140 m_clocks[!x]->resize();
141 m_clocks[x]->moveTo(sq_size*gs.x+2*b+b/2, b/2);
142 m_clocks[!x]->moveTo(sq_size*gs.x+2*b+b/2, sq_size*gs.y+b+b/2-m_clocks[1]->height());
144 m_pools[x]->m_flipped = false;
145 m_pools[x]->setGridWidth(3);
146 m_pools[x]->moveTo(sq_size*gs.x+2*b+b/2, b+m_clocks[0]->height());
147 m_pools[x]->onResize(static_cast<int>(sq_size*2.2/3), force_reload);
149 m_pools[!x]->m_flipped = true;
150 m_pools[!x]->setGridWidth(3);
151 m_pools[!x]->moveTo(sq_size*gs.x+2*b+b/2, sq_size*gs.y+b-m_clocks[1]->height());
152 m_pools[!x]->onResize(static_cast<int>(sq_size*2.2/3), force_reload);
154 m_info->moveTo(sq_size*gs.x+4*b, 80+sq_size*gs.y/2+b+b/2);
157 void ChessTable::resizeEvent(QResizeEvent* /*e*/) {
158 layout();
161 void ChessTable::mouseReleaseEvent(QMouseEvent* e) {
163 if(m_mousegrab) {
164 m_mousegrab->onMouseRelease(e->pos() - m_mousegrab->pos(), e->button() );
165 if(!e->buttons()) {
166 m_mousegrab = NULL;
168 ClickableCanvas* cb = eventItemAt(e->pos());
169 if(cb != m_current) {
170 if(m_current)
171 m_current->onMouseLeave();
172 if(cb) {
173 cb->onMouseEnter();
174 cb->onMouseMove(e->pos() - cb->pos(), 0);
176 m_current = cb;
179 return;
183 void ChessTable::mousePressEvent(QMouseEvent* e) {
184 if(m_mousegrab) {
185 m_mousegrab->onMousePress(e->pos() - m_mousegrab->pos(), e->button() );
186 return;
189 ClickableCanvas* cb = eventItemAt(e->pos());
190 if(cb != m_current) {
191 if(m_current)
192 m_current->onMouseLeave();
193 if(cb)
194 cb->onMouseEnter();
195 m_current = cb;
197 if(cb) {
198 cb->onMousePress(e->pos() - cb->pos(), e->button() );
199 m_mousegrab = cb;
203 void ChessTable::mouseMoveEvent(QMouseEvent* e) {
204 if(m_mousegrab) {
205 m_mousegrab->onMouseMove(e->pos() - m_mousegrab->pos(), e->button() );
206 return;
209 ClickableCanvas* cb = eventItemAt(e->pos());
210 if(cb != m_current) {
211 if(m_current)
212 m_current->onMouseLeave();
213 if(cb)
214 cb->onMouseEnter();
215 m_current = cb;
217 if(cb)
218 cb->onMouseMove(e->pos() - cb->pos(), e->button() );
221 void ChessTable::enterEvent(QEvent*) { }
223 void ChessTable::leaveEvent(QEvent*) {
224 if(m_current)
225 m_current->onMouseLeave();
226 m_current = NULL;
229 void ChessTable::flip() {
230 m_board->flip();
232 int delta = qAbs(m_pools[0]->pos().y() - m_pools[1]->pos().y());
233 for(int i=0;i<2;i++)
234 m_pools[i]->flipAndMoveBy( QPoint(0, delta) );
237 void ChessTable::flip(bool flipped) {
238 if(m_board->flipped() != flipped)
239 flip();
242 void ChessTable::changeClock(int color) {
243 std::cout << "change " << color << std::endl;
244 if(m_clocks[0]->running() || m_clocks[1]->running())
245 for(int i=0;i<2;i++) {
246 if ( (i == color) != m_clocks[i]->running() )
247 if( i==color )
248 m_clocks[i]->start();
249 else
250 m_clocks[i]->stop();
254 void ChessTable::updateTurn(int color) {
255 std::cout << "updatet" << std::endl;
256 for(int i=0;i<2;i++)
257 m_clocks[i]->activate(color == i);
260 void ChessTable::stopClocks() {
261 for(int i=0;i<2;i++)
262 m_clocks[i]->stop();
265 void ChessTable::updateTime(int white, int black) {
266 std::cout << "update" << std::endl;
267 m_clocks[0]->setTime(white);
268 m_clocks[1]->setTime(black);
271 void ChessTable::resetClock() {
272 std::cout << "reset" << std::endl;
273 stopClocks();
274 updateTime(0, 0);
275 for(int i=0;i<2;i++)
276 m_clocks[i]->setPlayer(Player());
279 void ChessTable::setPlayers(const Player& white, const Player& black) {
280 std::cout << "set players " << std::endl;
281 m_clocks[0]->setPlayer(white);
282 m_clocks[1]->setPlayer(black);
285 void ChessTable::run() {
286 std::cout << "run" << std::endl;
287 for(int i=0;i<2;i++)
288 if(m_clocks[i]->active() && !m_clocks[i]->running())
289 m_clocks[i]->start();
292 void ChessTable::displayMessage(const QString& msg) {
293 std::cout << msg << std::endl;
294 emit message(msg);