1 /**************************************************************************
5 Copyright (c) Arto Hyvättinen 2010
7 This file is part of Chess Clock software.
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.
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.
20 **************************************************************************/
22 #include "clockswidget.h"
23 #include "chessclock.h"
25 #include "screenlitkeeper.h"
29 #include <QApplication>
30 #include <QHBoxLayout>
31 #include <QVBoxLayout>
34 #include <QMouseEvent>
35 #include <QToolButton>
39 ClocksWidget::ClocksWidget(ChessClock *white, ChessClock *black, QWidget *parent):
47 // Make layout for clocks
48 QHBoxLayout* clockLayout = new QHBoxLayout;
49 clockLayout->addWidget(white_ );
50 clockLayout->addWidget( black_ );
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 );
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
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);
73 QVBoxLayout* mainLayout = new QVBoxLayout;
74 mainLayout->addLayout(clockLayout);
76 // Extra layout and widget for information
77 QVBoxLayout* extraLayout = new QVBoxLayout;
78 extraLayout->addWidget(pauseLabel_);
79 extraLayout->addWidget(welcomeLabel_);
81 QHBoxLayout* pbLayout = new QHBoxLayout;
82 pbLayout->addStretch();
83 pbLayout->addWidget(pauseButton_);
84 pbLayout->addStretch();
85 extraLayout->addLayout(pbLayout);
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);
94 mainLayout->addWidget(extraWidget);
95 setLayout( mainLayout);
99 white_->repaintClock();
100 black_->repaintClock();
103 white_->setAnother(black_);
104 black_->setAnother(white_);
106 delayTimer_.start(); // Initial start
108 recentX = recentY = -1;
110 // ScreenLitKeeper to keep screen lit when playing
111 keeper_ = new ScreenLitKeeper(this);
113 connect( white, SIGNAL(dontEatBattery()), this, SLOT(saveScreen()));
114 connect( black, SIGNAL(dontEatBattery()), this, SLOT(saveScreen()));
117 ClocksWidget::~ClocksWidget()
123 void ClocksWidget::pause()
125 if(status_ == WhiteTurn)
129 pauseLabel_->setVisible(true);
130 pauseButton_->setVisible(false);
131 keeper_->keepScreenLit(false);
134 else if( status_ == BlackTurn)
136 status_ = BlackPause;
138 pauseLabel_->setVisible(true);
139 pauseButton_->setVisible(false);
140 keeper_->keepScreenLit(false);
144 void ClocksWidget::stopPlay()
146 if( status_ == BlackTurn || status_ == BlackPause )
147 emit TurnFinished( black_->endTurn());
148 else if( status_ == WhiteTurn || status_ == WhitePause )
149 emit TurnFinished( white_->endTurn());
153 void ClocksWidget::saveScreen()
155 keeper_->keepScreenLit(false);
159 void ClocksWidget::mouseReleaseEvent(QMouseEvent *event)
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
170 delayTimer_.start(); // to reset delay timer!
175 welcomeLabel_->setVisible(false);
176 pauseButton_->setVisible(true);
177 keeper_->keepScreenLit(true);
182 // White turn finished, then black
183 emit TurnFinished( white_->endTurn());
188 // Black finished, then white
189 emit TurnFinished( black_->endTurn());
195 keeper_->keepScreenLit(true);
196 pauseLabel_->setVisible(false);
197 pauseButton_->setVisible(true);
198 white_->continueTurn();
203 keeper_->keepScreenLit(true);
204 pauseLabel_->setVisible(false);
205 pauseButton_->setVisible(true);
206 black_->continueTurn();
210 emit ClickedWhenStopped();
215 recentX = event->x();
216 recentY = event->y();
219 // to grap clicking pause or welcome label
220 bool ClocksWidget::eventFilter(QObject *obj, QEvent *event)
222 if (event->type() == QEvent::MouseButtonRelease) {
223 QMouseEvent *mEvent = static_cast<QMouseEvent *>(event);
224 mouseReleaseEvent( mEvent );
227 // standard event processing
228 return QObject::eventFilter(obj, event);
233 int const ClocksWidget::CLICKDELAY;