Distance double clicks control
[chessclock] / classes / clockswidget.cpp
index 9882de5..859925f 100644 (file)
@@ -28,7 +28,8 @@
 #include <QHBoxLayout>
 #include <QVBoxLayout>
 #include <QFont>
-
+#include <cstdio>
+#include <QMouseEvent>
 
 ClocksWidget::ClocksWidget(ChessClock *white, ChessClock *black, QWidget *parent):
     QWidget(parent)
@@ -74,6 +75,14 @@ ClocksWidget::ClocksWidget(ChessClock *white, ChessClock *black, QWidget *parent
     black_->setAnother(white_);
 
     delayTimer_.start(); // Initial start
+
+    recentX = recentY = -1;
+}
+
+ClocksWidget::~ClocksWidget()
+{
+    delete white_;
+    delete black_;
 }
 
 void ClocksWidget::pause()
@@ -92,11 +101,28 @@ void ClocksWidget::pause()
     }
 }
 
+void ClocksWidget::stopPlay()
+{
+    if( status_ == BlackTurn || status_ == BlackPause )
+       emit TurnFinished( black_->endTurn());
+    else if( status_ == WhiteTurn || status_ == WhitePause )
+        emit TurnFinished( white_->endTurn());
+    status_ = Stopped;
+}
+
 
 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 :
@@ -117,10 +143,26 @@ void ClocksWidget::mouseReleaseEvent(QMouseEvent *event)
             white_->startTurn();
             status_=WhiteTurn;
             break;
+        case WhitePause:
+            // Continue play
+            pauseLabel_->setVisible(false);
+            white_->continueTurn();
+            status_=WhiteTurn;
+            break;
+        case BlackPause:
+            // Continue play
+            pauseLabel_->setVisible(false);
+            black_->continueTurn();
+            status_=BlackTurn;
+            break;
+        case Stopped:
+            emit ClickedWhenStopped();
 
 
         }
     }
+    recentX = event->x();
+    recentY = event->y();
 }
 
 int const ClocksWidget::CLICKDELAY;