Updated the web pages
[chessclock] / classes / clockswidget.cpp
1  /**************************************************************************
2
3     Chess Clock
4
5     Copyright (c) Arto Hyvättinen 2010
6
7     This file is part of Chess Clock software.
8
9     Chess Clock is free software: you can redistribute it and/or modify
10     it under the terms of the GNU General Public License as published by
11     the Free Software Foundation, either version 3 of the License, or
12     (at your option) any later version.
13
14     Chess Clock is distributed in the hope that it will be useful,
15     but WITHOUT ANY WARRANTY; without even the implied warranty of
16     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17     GNU General Public License for more details.
18
19
20 **************************************************************************/
21
22 #include "clockswidget.h"
23 #include "chessclock.h"
24
25 #include "screenlitkeeper.h"
26
27 #include <QLabel>
28 #include <QPixmap>
29 #include <QApplication>
30 #include <QHBoxLayout>
31 #include <QVBoxLayout>
32 #include <QFont>
33 #include <cstdlib>
34 #include <QMouseEvent>
35 #include <QToolButton>
36 #include <QSize>
37 #include <QWidget>
38
39 ClocksWidget::ClocksWidget(ChessClock *white, ChessClock *black, QWidget *parent):
40     QWidget(parent)
41 {
42     // Set up clocks
43     white_ = white;
44     black_ = black;
45
46     // SET UP UI
47     // Make layout for clocks
48     QHBoxLayout* clockLayout = new QHBoxLayout;
49     clockLayout->addWidget(white_ );
50     clockLayout->addWidget( black_ );
51
52     // Pause information label
53     pauseLabel_ = new QLabel( tr("<font color=yellow>Paused. Touch to continue.</font>"),this);
54     pauseLabel_->setFont( QFont("Helvetica",25));
55     pauseLabel_->setAlignment( Qt::AlignCenter);
56     pauseLabel_->setVisible( false );
57
58     // Welcome label for first touch
59     welcomeLabel_ = new QLabel( tr("<font color=green>Welcome! Please touch to start game.<br>"
60                                    "Then touch to end turn.</font>"),this);
61     welcomeLabel_->setFont( QFont("Helvetica",25));
62     welcomeLabel_->setAlignment( Qt::AlignCenter);
63     welcomeLabel_->setVisible( true );  // Show welcome message
64
65     // Pause button
66     pauseButton_ = new QToolButton;
67     pauseButton_->setIcon( QIcon(":/rc/pic/pausebutton.png"));
68     pauseButton_->setIconSize(QSize(75,75));
69     connect(pauseButton_, SIGNAL(clicked()), this, SLOT(pause()));
70     pauseButton_->setVisible(false);
71
72     // Put all in layout
73     QVBoxLayout* mainLayout = new QVBoxLayout;
74     mainLayout->addLayout(clockLayout);
75
76     // Extra layout and widget for information
77     QVBoxLayout* extraLayout = new QVBoxLayout;
78     extraLayout->addWidget(pauseLabel_);
79     extraLayout->addWidget(welcomeLabel_);
80
81     QHBoxLayout* pbLayout = new QHBoxLayout;
82     pbLayout->addStretch();
83     pbLayout->addWidget(pauseButton_);
84     pbLayout->addStretch();
85     extraLayout->addLayout(pbLayout);
86
87     QWidget* extraWidget = new QWidget(this);
88     extraWidget->setLayout(extraLayout);
89     // Some fun event filtering to grap clicking welcome and pause labels...
90     extraWidget->installEventFilter(this);
91     pauseLabel_->installEventFilter(this);
92     welcomeLabel_->installEventFilter(this);
93
94     mainLayout->addWidget(extraWidget);
95     setLayout( mainLayout);
96     status_ = Welcome;
97
98     // First paint
99     white_->repaintClock();
100     black_->repaintClock();
101
102     // Set up others
103     white_->setAnother(black_);
104     black_->setAnother(white_);
105
106     delayTimer_.start(); // Initial start
107
108     recentX = recentY = -1;
109
110     // ScreenLitKeeper to keep screen lit when playing
111     keeper_ = new ScreenLitKeeper(this);
112
113     connect( white, SIGNAL(dontEatBattery()), this, SLOT(saveScreen()));
114     connect( black, SIGNAL(dontEatBattery()), this, SLOT(saveScreen()));
115 }
116
117 ClocksWidget::~ClocksWidget()
118 {
119     delete white_;
120     delete black_;
121 }
122
123 void ClocksWidget::pause()
124 {
125     if(status_ == WhiteTurn)
126     {
127         status_= WhitePause;
128         white_->pauseTurn();
129         pauseLabel_->setVisible(true);
130         pauseButton_->setVisible(false);
131         keeper_->keepScreenLit(false);
132
133     }
134     else if( status_ == BlackTurn)
135     {
136         status_ = BlackPause;
137         black_->pauseTurn();
138         pauseLabel_->setVisible(true);
139         pauseButton_->setVisible(false);
140         keeper_->keepScreenLit(false);
141     }
142 }
143
144 void ClocksWidget::stopPlay()
145 {
146     if( status_ == BlackTurn || status_ == BlackPause )
147        emit TurnFinished( black_->endTurn());
148     else if( status_ == WhiteTurn || status_ == WhitePause )
149         emit TurnFinished( white_->endTurn());
150     status_ = Stopped;
151 }
152
153 void ClocksWidget::saveScreen()
154 {
155     keeper_->keepScreenLit(false);
156 }
157
158
159 void ClocksWidget::mouseReleaseEvent(QMouseEvent *event)
160 {
161
162     // To avoid double clicks
163     // a) delay (default 1,2 secs) OR
164     // b) distance more than 90 pixels in axis.
165     if( delayTimer_.elapsed() > CLICKDELAY ||
166         std::abs( event->x() - recentX ) > 90 ||
167         std::abs( event->y() - recentY ) > 90
168         )
169     {
170         delayTimer_.start();    // to reset delay timer!
171         switch( status_)
172         {
173         case Welcome :
174             // Start game!
175             welcomeLabel_->setVisible(false);
176             pauseButton_->setVisible(true);
177             keeper_->keepScreenLit(true);
178             white_->startTurn();
179             status_ = WhiteTurn;
180             break;
181         case WhiteTurn:
182             // White turn finished, then black
183             emit TurnFinished( white_->endTurn());
184             black_->startTurn();
185             status_=BlackTurn;
186             break;
187         case BlackTurn:
188             // Black finished, then white
189             emit TurnFinished( black_->endTurn());
190             white_->startTurn();
191             status_=WhiteTurn;
192             break;
193         case WhitePause:
194             // Continue play
195             keeper_->keepScreenLit(true);
196             pauseLabel_->setVisible(false);
197             pauseButton_->setVisible(true);
198             white_->continueTurn();
199             status_=WhiteTurn;
200             break;
201         case BlackPause:
202             // Continue play
203             keeper_->keepScreenLit(true);
204             pauseLabel_->setVisible(false);
205             pauseButton_->setVisible(true);
206             black_->continueTurn();
207             status_=BlackTurn;
208             break;
209         case Stopped:
210             emit ClickedWhenStopped();
211
212
213         }
214     }
215     recentX = event->x();
216     recentY = event->y();
217 }
218
219 // to grap clicking pause or welcome label
220 bool ClocksWidget::eventFilter(QObject *obj, QEvent *event)
221 {
222     if (event->type() == QEvent::MouseButtonRelease) {
223         QMouseEvent *mEvent = static_cast<QMouseEvent *>(event);
224         mouseReleaseEvent( mEvent );
225         return true;
226     } else {
227         // standard event processing
228         return QObject::eventFilter(obj, event);
229     }
230 }
231
232
233 int const ClocksWidget::CLICKDELAY;