Added some fun event filtering to grab pause and welcome message clicks
[chessclock] / classes / clockswidget.cpp
index d39c1f2..f094f8d 100644 (file)
 #include "clockswidget.h"
 #include "chessclock.h"
 
+#include "screenlitkeeper.h"
+
 #include <QLabel>
 #include <QPixmap>
 #include <QApplication>
 #include <QHBoxLayout>
 #include <QVBoxLayout>
 #include <QFont>
-
+#include <cstdlib>
+#include <QMouseEvent>
+#include <QToolButton>
+#include <QSize>
+#include <QWidget>
 
 ClocksWidget::ClocksWidget(ChessClock *white, ChessClock *black, QWidget *parent):
     QWidget(parent)
@@ -44,24 +50,48 @@ ClocksWidget::ClocksWidget(ChessClock *white, ChessClock *black, QWidget *parent
     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=green>Welcome! Please touch to start game.<br>"
-                                   "Then touch to end turn.</font>"));
+                                   "Then touch to end turn.</font>"),this);
     welcomeLabel_->setFont( QFont("Helvetica",25));
     welcomeLabel_->setAlignment( Qt::AlignCenter);
     welcomeLabel_->setVisible( true );  // Show welcome message
 
+    // 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_);
 
+    // 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;
 
@@ -74,6 +104,17 @@ ClocksWidget::ClocksWidget(ChessClock *white, ChessClock *black, QWidget *parent
     black_->setAnother(white_);
 
     delayTimer_.start(); // Initial start
+
+    recentX = recentY = -1;
+
+    // ScreenLitKeeper to keep screen lit when playing
+    keeper_ = new ScreenLitKeeper(this);
+}
+
+ClocksWidget::~ClocksWidget()
+{
+    delete white_;
+    delete black_;
 }
 
 void ClocksWidget::pause()
@@ -83,12 +124,17 @@ void ClocksWidget::pause()
         status_= WhitePause;
         white_->pauseTurn();
         pauseLabel_->setVisible(true);
+        pauseButton_->setVisible(false);
+        keeper_->keepScreenLit(false);
+
     }
     else if( status_ == BlackTurn)
     {
         status_ = BlackPause;
         black_->pauseTurn();
         pauseLabel_->setVisible(true);
+        pauseButton_->setVisible(false);
+        keeper_->keepScreenLit(false);
     }
 }
 
@@ -104,13 +150,23 @@ void ClocksWidget::stopPlay()
 
 void ClocksWidget::mouseReleaseEvent(QMouseEvent *event)
 {
-    if( delayTimer_.elapsed() > CLICKDELAY )  // To avoid double clicks
+
+    // 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;
@@ -128,13 +184,17 @@ void ClocksWidget::mouseReleaseEvent(QMouseEvent *event)
             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(false);
             pauseLabel_->setVisible(false);
+            pauseButton_->setVisible(true);
             black_->continueTurn();
             status_=BlackTurn;
             break;
@@ -144,6 +204,22 @@ void ClocksWidget::mouseReleaseEvent(QMouseEvent *event)
 
         }
     }
+    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;