From e73c22c391bf535f610f3ad49c730d7d2d46d978 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Arto=20Hyv=C3=A4ttinen?= Date: Sat, 14 Aug 2010 00:01:48 +0300 Subject: [PATCH] ChessClock class New png images --- chessclock.pro | 6 ++- classes/chessclock.cpp | 105 ++++++++++++++++++++++++++++++++++++++++ classes/chessclock.h | 112 +++++++++++++++++++++++++++++++++++++++++++ classes/turninformation.cpp | 5 +- classes/turninformation.h | 10 ++-- pic/black_blue.png | Bin 0 -> 7251 bytes pic/black_gray.png | Bin 0 -> 7178 bytes pic/white_blue.png | Bin 0 -> 10376 bytes pic/white_gray.png | Bin 0 -> 10040 bytes 9 files changed, 229 insertions(+), 9 deletions(-) create mode 100644 classes/chessclock.cpp create mode 100644 classes/chessclock.h create mode 100644 pic/black_blue.png create mode 100644 pic/black_gray.png create mode 100644 pic/white_blue.png create mode 100644 pic/white_gray.png diff --git a/chessclock.pro b/chessclock.pro index 81c5831..4248040 100644 --- a/chessclock.pro +++ b/chessclock.pro @@ -12,10 +12,12 @@ TEMPLATE = app SOURCES += main.cpp\ chessclockwindow.cpp \ - classes/turninformation.cpp + classes/turninformation.cpp \ + classes/chessclock.cpp HEADERS += chessclockwindow.h \ - classes/turninformation.h + classes/turninformation.h \ + classes/chessclock.h CONFIG += mobility MOBILITY = diff --git a/classes/chessclock.cpp b/classes/chessclock.cpp new file mode 100644 index 0000000..d7df9d3 --- /dev/null +++ b/classes/chessclock.cpp @@ -0,0 +1,105 @@ + /************************************************************************** + + Chess Clock + + Copyright (c) Arto Hyvättinen 2010 + + This file is part of Chess Clock software. + + Chess Clock is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Chess Clock is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + +**************************************************************************/ + +#include "chessclock.h" + +#include "turninformation.h" + +const int ChessClock::UPDATEINTERVAL; + +ChessClock::ChessClock(bool white, QWidget *parent) : + QWidget(parent) +{ + isWhite_ = white; + loser_ = false; + turn_ = 0; + timePlayed_ = 0; + status_ = NotRunning; + + // Set clock timer calculating played time + clockTime_.start(); + + // Set updating timer + updateTimer_.setInterval( UPDATEINTERVAL ); + connect( &updateTimer_, SIGNAL(timeout),this,SLOT(updateClock())); +} + +void ChessClock::startTurn() +{ + turn_++; + + // Turn information for this new turn + currentTurn_ = new TurnInformation(turn_, isWhite_); + clockTime_.restart(); + status_=Running; + + // Repaint clock + repaintClock(); +} + +void ChessClock::pauseTurn() +{ + // Update turn time + currentTurn_->addTime( clockTime_.restart() ); + status_ = Paused; + repaintClock(); +} + +void ChessClock::continueTurn() +{ + // Continue paused game + // Add pause duration to information object + currentTurn_->addPause( clockTime_.restart() ); + status_ = Running; + repaintClock(); +} + + +TurnInformation* ChessClock::endTurn() +{ + status_ = NotRunning; + // Update turn time + currentTurn_->addTime( clockTime_.restart()); + // Count time available + timeAvailableBeforeTurn_ = getTimeAvailable(); + repaintClock(); + + // Close and return turn information + currentTurn_->turnReady(timeAvailableBeforeTurn_ ); + TurnInformation* information = currentTurn_; + currentTurn_ = 0; + return information; +} + +void ChessClock::setAnother(ChessClock *another) +{ + another_ = another; +} + +int ChessClock::getTimeAvailable() +{ + // Most simple - will be overwritten in more complex time controls: + // subtract duration time! + if( currentTurn_) + return timeAvailableBeforeTurn_-currentTurn_->getDuration(); + else + return timeAvailableBeforeTurn_; +} diff --git a/classes/chessclock.h b/classes/chessclock.h new file mode 100644 index 0000000..528b58b --- /dev/null +++ b/classes/chessclock.h @@ -0,0 +1,112 @@ + /************************************************************************** + + Chess Clock + + Copyright (c) Arto Hyvättinen 2010 + + This file is part of Chess Clock software. + + Chess Clock is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Chess Clock is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + +**************************************************************************/ + +#ifndef CHESSCLOCK_H +#define CHESSCLOCK_H + +#include +#include +#include + +class TurnInformation; + + +/*! Clock of a individual player + + @author Arto Hyvättinen + @date 2010-08-13 + + Base class of chess clock. + + */ +class ChessClock : public QWidget +{ + Q_OBJECT +public: + ChessClock(bool white, QWidget *parent = 0); + +public: + enum RunningStatus { + NotRunning /*! Not turn */ = 0, + Running /*! Turn running */ = 1, + Paused /*! Turn paused */ = 2 + }; + + bool isLoser() const { return loser_; } + int getTurn() const { return turn_; } + + + /*! Start new turn */ + virtual void startTurn(); + + /*! End this turn. + + Player has done his move. + @return Locked turn information */ + virtual TurnInformation* endTurn(); + + /*! Pause clock */ + virtual void pauseTurn(); + + /*! Continue paused game */ + virtual void continueTurn(); + + /*! Set another chess clock for connecting + @param another Clock of opposite player */ + void setAnother( ChessClock* another); + + /*! Get total time available + + Time does't contain delays. + + @return Time available in msecs */ + virtual int getTimeAvailable(); + +signals: + void timeOut(); + +public slots: + + /*! Refresh clock information */ + virtual void repaintClock() = 0; + + +protected: + ChessClock* another_; /*! Another player's clock */ + + bool loser_; /*! Is player losed because of timeout */ + int turn_; /*! Current turn */ + RunningStatus status_; + TurnInformation* currentTurn_; + + int timePlayed_; /*! Time played in this game */ + int timeAvailableBeforeTurn_; /*! Time available for play BEFORE this turn!*/ + + bool isWhite_; /*! True if white player */ + + QTime clockTime_; + QTimer updateTimer_; + + static const int UPDATEINTERVAL = 1000; /** Clock updating interval in msecs */ + +}; + +#endif // CHESSCLOCK_H diff --git a/classes/turninformation.cpp b/classes/turninformation.cpp index a1e4411..96d95b8 100644 --- a/classes/turninformation.cpp +++ b/classes/turninformation.cpp @@ -40,7 +40,8 @@ void TurnInformation::addTime(int msecs) void TurnInformation::addPause(int msecs) { if( !turnReady_ ) - pause_ += msecs; + paused_ += msecs; + } void TurnInformation::turnReady(int msecs) @@ -49,7 +50,7 @@ void TurnInformation::turnReady(int msecs) turnReady_ = true; } -int TurnInformation::getTimeAfter() +int TurnInformation::getTimeAfter() const { if( turnReady_ ) return timeAfter_; diff --git a/classes/turninformation.h b/classes/turninformation.h index 63d21ad..90291c9 100644 --- a/classes/turninformation.h +++ b/classes/turninformation.h @@ -40,20 +40,20 @@ public: @param white true if turn on white, false id black */ TurnInformation(int turnId, bool white); - int getTurnId() { return turnId_; } + int getTurnId() const { return turnId_; } /*! Duration of turn @return Duration of turn in msecs */ - int getDuration() { return duration_; } + int getDuration() const { return duration_; } /*! Duration of pauses during this turn @return Duration of pauses in msecs */ - int getPaused() { return paused_; } + int getPaused() const { return paused_; } /*! Time available for this player after this turn @return Time available in msecs */ - int getTimeAfter(); - bool isWhiteTurn() { return white_; } + int getTimeAfter() const; + bool isWhiteTurn() const { return white_; } void addTime( int msecs ); void addPause( int msecs ); diff --git a/pic/black_blue.png b/pic/black_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..b18945954da64af5d43de8f9fd2d837f3b1f3afb GIT binary patch literal 7251 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 literal 0 HcmV?d00001 diff --git a/pic/black_gray.png b/pic/black_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..25953dcf1107891c513bd1b0958fa161eeedcac5 GIT binary patch literal 7178 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 a_s>fmoal#~7%yi6A@b77Ql%0`0sjX_n>RTC literal 0 HcmV?d00001 diff --git a/pic/white_gray.png b/pic/white_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..c033fc0e3768aa27c38869fa0bb4da96bd36f38d GIT binary patch literal 10040 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 iqe@EZJSB#2P$Im9Hfr)@-orC&h-Wg&(%+