Updated the web pages
[chessclock] / classes / clockswidget.cpp
index ed1352b..0daf329 100644 (file)
@@ -21,7 +21,8 @@
 
 #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;