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);
114 ClocksWidget::~ClocksWidget()
120 void ClocksWidget::pause()
122 if(status_ == WhiteTurn)
126 pauseLabel_->setVisible(true);
127 pauseButton_->setVisible(false);
128 keeper_->keepScreenLit(false);
131 else if( status_ == BlackTurn)
133 status_ = BlackPause;
135 pauseLabel_->setVisible(true);
136 pauseButton_->setVisible(false);
137 keeper_->keepScreenLit(false);
141 void ClocksWidget::stopPlay()
143 if( status_ == BlackTurn || status_ == BlackPause )
144 emit TurnFinished( black_->endTurn());
145 else if( status_ == WhiteTurn || status_ == WhitePause )
146 emit TurnFinished( white_->endTurn());
151 void ClocksWidget::mouseReleaseEvent(QMouseEvent *event)
154 // To avoid double clicks
155 // a) delay (default 1,2 secs) OR
156 // b) distance more than 90 pixels in axis.
157 if( delayTimer_.elapsed() > CLICKDELAY ||
158 std::abs( event->x() - recentX ) > 90 ||
159 std::abs( event->y() - recentY ) > 90
162 delayTimer_.start(); // to reset delay timer!
167 welcomeLabel_->setVisible(false);
168 pauseButton_->setVisible(true);
169 keeper_->keepScreenLit(true);
174 // White turn finished, then black
175 emit TurnFinished( white_->endTurn());
180 // Black finished, then white
181 emit TurnFinished( black_->endTurn());
187 keeper_->keepScreenLit(true);
188 pauseLabel_->setVisible(false);
189 pauseButton_->setVisible(true);
190 white_->continueTurn();
195 keeper_->keepScreenLit(false);
196 pauseLabel_->setVisible(false);
197 pauseButton_->setVisible(true);
198 black_->continueTurn();
202 emit ClickedWhenStopped();
207 recentX = event->x();
208 recentY = event->y();
211 // to grap clicking pause or welcome label
212 bool ClocksWidget::eventFilter(QObject *obj, QEvent *event)
214 if (event->type() == QEvent::MouseButtonRelease) {
215 QMouseEvent *mEvent = static_cast<QMouseEvent *>(event);
216 mouseReleaseEvent( mEvent );
219 // standard event processing
220 return QObject::eventFilter(obj, event);
225 int const ClocksWidget::CLICKDELAY;