#include "clockswidget.h"
#include "chessclock.h"
-#include "welcomescreenwidget.h"
+
+#include "screenlitkeeper.h"
#include <QLabel>
#include <QPixmap>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QFont>
+#include <cstdlib>
+#include <QMouseEvent>
+#include <QToolButton>
+#include <QSize>
+#include <QWidget>
-
-ClocksWidget::ClocksWidget(QWidget *parent) :
+ClocksWidget::ClocksWidget(ChessClock *white, ChessClock *black, QWidget *parent):
QWidget(parent)
{
- white_ = 0;
- black_ = 0;
- status_ = NoClocks;
+ // Set up clocks
+ white_ = white;
+ black_ = black;
+ // SET UP UI
// Make layout for clocks
- QHBoxLayout* clockLayout_ = new QHBoxLayout;
+ QHBoxLayout* clockLayout = new QHBoxLayout;
+ clockLayout->addWidget(white_ );
+ clockLayout->addWidget( black_ );
// Pause information label
- pauseLabel_ = new QLabel( tr("<font color=yellow>Paused. Touch to continue.</font>"));
+ pauseLabel_ = new QLabel( tr("<font color=yellow>Paused. Touch to continue.</font>"),this);
pauseLabel_->setFont( QFont("Helvetica",25));
pauseLabel_->setAlignment( Qt::AlignCenter);
pauseLabel_->setVisible( false );
// Welcome label for first touch
- welcomeLabel_ = new QLabel( tr("<font color=yellow>Welcome! Please touch to start game.<br>"
- "Then touch to end turn.</font>"));
+ welcomeLabel_ = new QLabel( tr("<font color=green>Welcome! Please touch to start game.<br>"
+ "Then touch to end turn.</font>"),this);
welcomeLabel_->setFont( QFont("Helvetica",25));
welcomeLabel_->setAlignment( Qt::AlignCenter);
- welcomeLabel_->setVisible( false );
+ welcomeLabel_->setVisible( true ); // Show welcome message
- // Welcome screen if no clocks set
- welcomeScreen_ = new WelcomeScreenWidget(this);
+ // Pause button
+ pauseButton_ = new QToolButton;
+ pauseButton_->setIcon( QIcon(":/rc/pic/pausebutton.png"));
+ pauseButton_->setIconSize(QSize(75,75));
+ connect(pauseButton_, SIGNAL(clicked()), this, SLOT(pause()));
+ pauseButton_->setVisible(false);
// Put all in layout
QVBoxLayout* mainLayout = new QVBoxLayout;
- mainLayout->addLayout(clockLayout_);
- mainLayout->addWidget(pauseLabel_);
- mainLayout->addWidget(welcomeLabel_);
- mainLayout->addWidget(welcomeScreen_);
-
+ mainLayout->addLayout(clockLayout);
+
+ // Extra layout and widget for information
+ QVBoxLayout* extraLayout = new QVBoxLayout;
+ extraLayout->addWidget(pauseLabel_);
+ extraLayout->addWidget(welcomeLabel_);
+
+ QHBoxLayout* pbLayout = new QHBoxLayout;
+ pbLayout->addStretch();
+ pbLayout->addWidget(pauseButton_);
+ pbLayout->addStretch();
+ extraLayout->addLayout(pbLayout);
+
+ QWidget* extraWidget = new QWidget(this);
+ extraWidget->setLayout(extraLayout);
+ // Some fun event filtering to grap clicking welcome and pause labels...
+ extraWidget->installEventFilter(this);
+ pauseLabel_->installEventFilter(this);
+ welcomeLabel_->installEventFilter(this);
+
+ mainLayout->addWidget(extraWidget);
setLayout( mainLayout);
+ status_ = Welcome;
-}
+ // First paint
+ white_->repaintClock();
+ black_->repaintClock();
+
+ // Set up others
+ white_->setAnother(black_);
+ black_->setAnother(white_);
+
+ delayTimer_.start(); // Initial start
+ recentX = recentY = -1;
+ // ScreenLitKeeper to keep screen lit when playing
+ keeper_ = new ScreenLitKeeper(this);
+
+ connect( white, SIGNAL(dontEatBattery()), this, SLOT(saveScreen()));
+ connect( black, SIGNAL(dontEatBattery()), this, SLOT(saveScreen()));
+}
-void ClocksWidget::setClocks(ChessClock *white, ChessClock *black)
+ClocksWidget::~ClocksWidget()
{
- // Remove old clocks
- if( white_ )
+ delete white_;
+ delete black_;
+}
+
+void ClocksWidget::pause()
+{
+ if(status_ == WhiteTurn)
{
- clockLayout_->removeWidget( white_ );
- delete white_;
+ status_= WhitePause;
+ white_->pauseTurn();
+ pauseLabel_->setVisible(true);
+ pauseButton_->setVisible(false);
+ keeper_->keepScreenLit(false);
+
}
- if( black_ )
+ else if( status_ == BlackTurn)
{
- clockLayout_->removeWidget( black_ );
- delete black_;
+ status_ = BlackPause;
+ black_->pauseTurn();
+ pauseLabel_->setVisible(true);
+ pauseButton_->setVisible(false);
+ keeper_->keepScreenLit(false);
}
+}
- // Set up new ones
- white_ = white;
- black_ = black;
+void ClocksWidget::stopPlay()
+{
+ if( status_ == BlackTurn || status_ == BlackPause )
+ emit TurnFinished( black_->endTurn());
+ else if( status_ == WhiteTurn || status_ == WhitePause )
+ emit TurnFinished( white_->endTurn());
+ status_ = Stopped;
+}
- clockLayout_->addWidget(white_);
- clockLayout_->addWidget( black_ );
+void ClocksWidget::saveScreen()
+{
+ keeper_->keepScreenLit(false);
+}
- // First paint
- white_->repaintClock();
- black_->repaintClock();
- // Welcome status for first touch
- welcomeLabel_->setVisible(true);
- status_ = Welcome;
+void ClocksWidget::mouseReleaseEvent(QMouseEvent *event)
+{
+ // To avoid double clicks
+ // a) delay (default 1,2 secs) OR
+ // b) distance more than 90 pixels in axis.
+ if( delayTimer_.elapsed() > CLICKDELAY ||
+ std::abs( event->x() - recentX ) > 90 ||
+ std::abs( event->y() - recentY ) > 90
+ )
+ {
+ delayTimer_.start(); // to reset delay timer!
+ switch( status_)
+ {
+ case Welcome :
+ // Start game!
+ welcomeLabel_->setVisible(false);
+ pauseButton_->setVisible(true);
+ keeper_->keepScreenLit(true);
+ white_->startTurn();
+ status_ = WhiteTurn;
+ break;
+ case WhiteTurn:
+ // White turn finished, then black
+ emit TurnFinished( white_->endTurn());
+ black_->startTurn();
+ status_=BlackTurn;
+ break;
+ case BlackTurn:
+ // Black finished, then white
+ emit TurnFinished( black_->endTurn());
+ white_->startTurn();
+ status_=WhiteTurn;
+ break;
+ case WhitePause:
+ // Continue play
+ keeper_->keepScreenLit(true);
+ pauseLabel_->setVisible(false);
+ pauseButton_->setVisible(true);
+ white_->continueTurn();
+ status_=WhiteTurn;
+ break;
+ case BlackPause:
+ // Continue play
+ keeper_->keepScreenLit(true);
+ pauseLabel_->setVisible(false);
+ pauseButton_->setVisible(true);
+ black_->continueTurn();
+ status_=BlackTurn;
+ break;
+ case Stopped:
+ emit ClickedWhenStopped();
+
+
+ }
+ }
+ recentX = event->x();
+ recentY = event->y();
+}
+// to grap clicking pause or welcome label
+bool ClocksWidget::eventFilter(QObject *obj, QEvent *event)
+{
+ if (event->type() == QEvent::MouseButtonRelease) {
+ QMouseEvent *mEvent = static_cast<QMouseEvent *>(event);
+ mouseReleaseEvent( mEvent );
+ return true;
+ } else {
+ // standard event processing
+ return QObject::eventFilter(obj, event);
+ }
}
+
int const ClocksWidget::CLICKDELAY;