From ba3a771506c5a43c9f93d99930537215400f75e6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Arto=20Hyv=C3=A4ttinen?= Date: Mon, 16 Aug 2010 02:09:52 +0300 Subject: [PATCH] Time control base classes Added time control base class, basic dialog and no-time controll. Compiled but untested --- chessclock.pro | 9 +- chessclock.qrc | 2 + classes/chessclockwidget.h | 2 +- classes/timecontrol.h | 53 +++++++++ classes/timecontrol/basicdialog.cpp | 211 +++++++++++++++++++++++++++++++++ classes/timecontrol/basicdialog.h | 98 +++++++++++++++ classes/timecontrol/notimecontrol.cpp | 62 ++++++++++ classes/timecontrol/notimecontrol.h | 38 ++++++ main.cpp | 2 + pic/black_small.png | Bin 2177 -> 2141 bytes pic/white_small.png | Bin 1927 -> 1988 bytes 11 files changed, 474 insertions(+), 3 deletions(-) create mode 100644 classes/timecontrol.h create mode 100644 classes/timecontrol/basicdialog.cpp create mode 100644 classes/timecontrol/basicdialog.h create mode 100644 classes/timecontrol/notimecontrol.cpp create mode 100644 classes/timecontrol/notimecontrol.h diff --git a/chessclock.pro b/chessclock.pro index 82b2d01..4d0f3c7 100644 --- a/chessclock.pro +++ b/chessclock.pro @@ -16,14 +16,19 @@ SOURCES += main.cpp\ classes/chessclock.cpp \ classes/chessclockwidget.cpp \ classes/clockswidget.cpp \ - classes/welcomescreenwidget.cpp + classes/welcomescreenwidget.cpp \ + classes/timecontrol/basicdialog.cpp \ + classes/timecontrol/notimecontrol.cpp HEADERS += chessclockwindow.h \ classes/turninformation.h \ classes/chessclock.h \ classes/chessclockwidget.h \ classes/clockswidget.h \ - classes/welcomescreenwidget.h + classes/welcomescreenwidget.h \ + classes/timecontrol.h \ + classes/timecontrol/basicdialog.h \ + classes/timecontrol/notimecontrol.h CONFIG += mobility MOBILITY = diff --git a/chessclock.qrc b/chessclock.qrc index 1b1983b..c0e9b9d 100644 --- a/chessclock.qrc +++ b/chessclock.qrc @@ -7,5 +7,7 @@ pic/white_gray.png pic/chessclock.png pic/logo.png + pic/white_small.png + pic/black_small.png diff --git a/classes/chessclockwidget.h b/classes/chessclockwidget.h index 356b8d6..d8f9e4c 100644 --- a/classes/chessclockwidget.h +++ b/classes/chessclockwidget.h @@ -65,7 +65,7 @@ protected: virtual void initBottom(); /*! Convert msecs to h:mm:ss QString */ - QString timeString(int msecs); + static QString timeString(int msecs); protected: diff --git a/classes/timecontrol.h b/classes/timecontrol.h new file mode 100644 index 0000000..7881e68 --- /dev/null +++ b/classes/timecontrol.h @@ -0,0 +1,53 @@ + /************************************************************************** + + 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 TIMECONTROL_H +#define TIMECONTROL_H + +#include +#include +class ClocksWidget; + +/*! Base class of virtual controls + + @author Arto Hyvättinen + @date 2010-08-15 + + */ +class TimeControl +{ +public: + /*! Name of the time control */ + virtual QString getName() = 0; + /*! Description of the time control */ + virtual QString getDescription() = 0; + /*! Icon of the time control */ + virtual QIcon getIcon() { return QIcon(":/rc/pic/chessclock.png"); } + /*! Init new game + + Ask options, and init new game. + @param useLastSettings Use last settings, don't ask + @return Clocks widget for new game, or NULL if unsuccess. */ + virtual ClocksWidget* initGame(bool useLastSettings=false) = 0; +}; + + +#endif // TIMECONTROL_H diff --git a/classes/timecontrol/basicdialog.cpp b/classes/timecontrol/basicdialog.cpp new file mode 100644 index 0000000..ebfdf8a --- /dev/null +++ b/classes/timecontrol/basicdialog.cpp @@ -0,0 +1,211 @@ + /************************************************************************** + + 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 "basicdialog.h" + +#include +#include +#include +#include +#include +#include +#include +#include + + +BasicDialog::BasicDialog(QString timeControlName, QWidget *parent) : + QDialog(parent) +{ + timeControlName_ = timeControlName; + + // Initial times + initialLabel_ = new QLabel( tr("Initial time")); + whiteInitial_ = initTimeEdit(); + blackInitial_ = initTimeEdit(); + // Additional times + additionLabel_ = new QLabel( tr("Additional time")); + whiteAddition_ = initTimeEdit(); + blackAddition_ = initTimeEdit(); + // Turns per addition + perTurnLabel_ = new QLabel( tr("Addition per turn")); + whiteTurns_=new QSpinBox; + whiteTurns_->setRange(1,99); + + blackTurns_=new QSpinBox; + blackTurns_->setRange(1,99); + + // Equal times + equals_ = new QCheckBox( tr("Equal times")); + + connect( equals_, SIGNAL(stateChanged(bool)),blackInitial_,SLOT(setDisabled(bool))); + connect( equals_, SIGNAL(stateChanged(bool)),blackAddition_,SLOT(setDisabled(bool))); + connect( equals_, SIGNAL(stateChanged(bool)),blackTurns_,SLOT(setDisabled(bool))); + + equals_->setChecked(true); + + whiteLabel_ = new QLabel; + whiteLabel_->setPixmap(QPixmap(":/rc/pic/white_small.png")); + blackLabel_ = new QLabel; + blackLabel_->setPixmap(QPixmap(":/rc/pic/black_small.png")); + + // Lay out + QGridLayout* layout = new QGridLayout; + layout->addWidget(equals_,0,0); + layout->addWidget(whiteLabel_,0,1,1,1,Qt::AlignCenter); + layout->addWidget(blackLabel_,0,2,1,1,Qt::AlignCenter); + + layout->addWidget(initialLabel_,1,0); + layout->addWidget(whiteInitial_,1,1); + layout->addWidget(blackInitial_,1,2); + + layout->addWidget(additionLabel_,2,0); + layout->addWidget(whiteAddition_,2,1); + layout->addWidget(blackAddition_,2,2); + + layout->addWidget(perTurnLabel_,3,0); + layout->addWidget(whiteTurns_,3,1); + layout->addWidget(blackTurns_,3,2); + + QPushButton* button = new QPushButton( tr("Start game")); + connect( button, SIGNAL(clicked()), this, SLOT(accept())); + + setLayout( layout ); + setWindowTitle( timeControlName_); + +} + +void BasicDialog::disablePerTurns() +{ + perTurnLabel_->setVisible(false); + whiteTurns_->setVisible(false); + blackTurns_->setVisible(false); +} + +void BasicDialog::disableAddition() +{ + disablePerTurns(); + whiteAddition_->setVisible(false); + blackAddition_->setVisible(false); + additionLabel_->setVisible(false); +} + +void BasicDialog::disableUnEquals() +{ + equals_->setChecked(true); + equals_->setVisible(false); + whiteLabel_->setVisible(false); + blackLabel_->setVisible(false); + blackInitial_->setVisible(false); + blackAddition_->setVisible(false); + blackTurns_->setVisible(false); +} + +void BasicDialog::store() +{ + // Store into QSettings + QSettings s; + s.beginGroup(timeControlName_); + s.setValue("Equals",equals_->isChecked()); + s.setValue("WhiteInitial",whiteInitial_->time()); + s.setValue("WhiteAddition",whiteAddition_->time()); + s.setValue("WhitePerTurns",whiteTurns_->value()); + + s.setValue("BlackInitial",blackInitial_->time()); + s.setValue("BlackAddition",blackAddition_->time()); + s.setValue("BlackPerTurns",blackTurns_->value()); +} + +void BasicDialog::init(QTime whiteInitial, QTime blackInitial, QTime whiteAddition, QTime blackAddition, int whitePerTurns, int blackPerTurns) +{ + // Load from QSettings + // first time use defaults + QSettings s; + s.beginGroup(timeControlName_); + + equals_->setChecked(s.value("Equals",true).toBool() ); + whiteInitial_->setTime( s.value("WhiteInitial",whiteInitial).toTime()); + blackInitial_->setTime(s.value("BlackInitial",blackInitial).toTime()); + whiteAddition_->setTime(s.value("WhiteAddition",whiteAddition).toTime()); + blackAddition_->setTime(s.value("BlackAddition",blackAddition).toTime()); + whiteTurns_->setValue(s.value("WhitePerTurns",whitePerTurns).toInt()); + blackTurns_->setValue(s.value("BlackPerTurns",blackPerTurns).toInt()); + +} + +int BasicDialog::getWhiteInitial() +{ + return toMsecs( whiteInitial_); +} + +int BasicDialog::getWhiteAddition() +{ + return toMsecs( whiteAddition_); +} + +int BasicDialog::getWhitePerTurns() +{ + return whiteTurns_->value(); +} + +int BasicDialog::getBlackInitial() +{ + // if Equals is checked, black values are disabled + // and white values returned. + if( equals_->isChecked()) + return toMsecs( whiteInitial_); + else + return toMsecs( blackInitial_); +} + +int BasicDialog::getBlackAddition() +{ + if( equals_->isChecked()) + return toMsecs( whiteAddition_); + else + return toMsecs( blackAddition_ ); + +} + +int BasicDialog::getBlackPerTurns() +{ + if( equals_->isChecked()) + return whiteTurns_->value(); + else + return blackTurns_->value(); +} + + +int BasicDialog::toMsecs(QTimeEdit *timeEdit) +{ + QTime qtime=timeEdit->time(); + return 0-qtime.msecsTo(QTime(0,0,0)); +} + + +QTimeEdit* BasicDialog::initTimeEdit() +{ + // Make QTimeEdit and set up range and display format + QTimeEdit* timeEdit = new QTimeEdit; + timeEdit->setMinimumTime( QTime(0,0,0)); + timeEdit->setMaximumTime( QTime(12,0,0)); + timeEdit->setDisplayFormat( tr("hh:mm:ss","Time Edit display format")); + return timeEdit; +} diff --git a/classes/timecontrol/basicdialog.h b/classes/timecontrol/basicdialog.h new file mode 100644 index 0000000..54ab82b --- /dev/null +++ b/classes/timecontrol/basicdialog.h @@ -0,0 +1,98 @@ + /************************************************************************** + + 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 BASICDIALOG_H +#define BASICDIALOG_H + +#include +#include +#include + +class QTimeEdit; +class QSpinBox; +class QCheckBox; +class QLabel; + +/*! Basic dialog for Time Control settings + + @author Arto Hyvättinen + @date 2010-08-16 + + Basic dialog setting up clock. + Time control can use this dialog. + Using disableAddition(), disablePerTurns() or disableUnEquals() + it is possible to customize dialog. + + All the widgets are public for customization. + */ + +class BasicDialog : public QDialog +{ + Q_OBJECT +public: + /*! Constructor + + @param timeControlName Name of time controller, will be window title */ + BasicDialog(QString timeContolName, QWidget *parent = 0); + + void disableAddition(); + void disablePerTurns(); + void disableUnEquals(); + + int getWhiteInitial(); + int getBlackInitial(); + int getWhiteAddition(); + int getBlackAddition(); + int getWhitePerTurns(); + int getBlackPerTurns(); + /*! Store values to settings */ + void store(); + /*! Load values from settings, or init to initial values */ + void init(QTime whiteInitial=QTime(1,30), + QTime blackInitial=QTime(1,30), + QTime whiteAddition=QTime(0,0,30), + QTime blackAddition=QTime(0,0,30), + int whitePerTurns = 1, + int blackPerTurns = 1); +signals: + +public slots: + +protected: + static QTimeEdit* initTimeEdit(); + static int toMsecs(QTimeEdit* timeEdit); + +public: + QTimeEdit *whiteInitial_, *blackInitial_; + QTimeEdit *whiteAddition_, *blackAddition_; + QSpinBox *whiteTurns_, *blackTurns_; + QCheckBox *equals_; + + QLabel *initialLabel_, *additionLabel_, *perTurnLabel_, *equalsLabel_; + QLabel *whiteLabel_, *blackLabel_; + +protected: + QString timeControlName_; + + +}; + +#endif // BASICDIALOG_H diff --git a/classes/timecontrol/notimecontrol.cpp b/classes/timecontrol/notimecontrol.cpp new file mode 100644 index 0000000..3163070 --- /dev/null +++ b/classes/timecontrol/notimecontrol.cpp @@ -0,0 +1,62 @@ + /************************************************************************** + + 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 "notimecontrol.h" + +#include "../chessclock.h" +#include "basicdialog.h" +#include "../chessclockwidget.h" +#include "../clockswidget.h" + +#include + +NoTimeControl::NoTimeControl() +{ +} + + +QString NoTimeControl::getDescription() +{ + return qApp->translate("NoneTimeControl","Never add time."); +} + +ClocksWidget* NoTimeControl::initGame(bool useLastSettings) +{ + BasicDialog dialog(getName()); + + dialog.disableAddition(); + dialog.init(); + + if( useLastSettings || dialog.exec() == QDialog::Accepted) + { + dialog.store(); + ChessClockWidget* white = new ChessClockWidget(true); + white->addTime(dialog.getWhiteInitial()); + + ChessClockWidget* black = new ChessClockWidget(false); + black->addTime( dialog.getBlackInitial()); + + return( new ClocksWidget(white,black)); + + } + else + return 0; +} diff --git a/classes/timecontrol/notimecontrol.h b/classes/timecontrol/notimecontrol.h new file mode 100644 index 0000000..1befb70 --- /dev/null +++ b/classes/timecontrol/notimecontrol.h @@ -0,0 +1,38 @@ + /************************************************************************** + + 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 NOTIMECONTROL_H +#define NOTIMECONTROL_H + +#include "../timecontrol.h" +#include + +class NoTimeControl : public TimeControl +{ +public: + NoTimeControl(); + + QString getName() { return qApp->translate("NoTimeControl","Normal clock"); } + QString getDescription(); + ClocksWidget* initGame(bool useLastSettings); +}; + +#endif // NOTIMECONTROL_H diff --git a/main.cpp b/main.cpp index dab223c..b54e0f9 100644 --- a/main.cpp +++ b/main.cpp @@ -54,6 +54,8 @@ int main(int argc, char *argv[]) { QApplication a(argc, argv); a.setApplicationName( a.tr("Chess Clock","Application name") ); + a.setOrganizationName("Chess Clock"); + a.setOrganizationDomain("chessclock.garage.maemo.org"); a.setApplicationVersion("0.1.0"); ChessClockWindow w; diff --git a/pic/black_small.png b/pic/black_small.png index 7c02939ac42472b4073730eaec415bfda8a16d4d..1799de5484a9dd931efafd4914054933f1807d8d 100644 GIT binary patch delta 2044 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 LMNUMnLSO-cqZHDW diff --git a/pic/white_small.png b/pic/white_small.png index 53e98b8114fa26783b48588de8bd973325cbd522..946b64364add7e204e1a2723d06d6d901624a604 100644 GIT binary patch delta 1891 zcmV-p2b}na55y0UHwgd$0002_L%V;GKp+SY6A&PHuHnv+XeWOMA4x<(R9M69nR`f^ z`x(bSHnCn~)Otf_h_)OmJ<-I7y|B@XEy&!C3@U|nxWk}lryHeE`q%y_)X~ukW2~!_ z?t;wLKib0z9ty z`&@p{`#jJ41ipX6ESj5}e+(plE0pc-?iS#u?~70S0dzD2YXC}1O96~Psj~JE@U0qe zc6N5Y8XFrE5s~5HVR1Md(%s!HA|k-|SHi7%-^%XTv19DQg$w7MPUlwz1qDATD=Rxz zP*Cu8KIB?A4@sOFBId8#aGSS=HdmGsLhT^mf_<CxH6A0R91NcqYvj*pL*xVX5vvfAeu zu&9--fb8GDUwV3aBoqpXh{)5YPv!dc>rz`=s}cr)KLGK{**^g?Jw3fZ*{xf*ic%C* zdgpsuK3039UXrii^eQKTSi8PxLmHNh{NHqSS%LNXf)z> zyTxL$NJ2t_xZUok`F8Hyspj^D{WBod)zwjZ;?ku{0?5IG2L+G=2M$Edb@uF8)vLdG zQ(^c$AdQWUQ3(hH0+HASq_wp*DxQZAA4*bEk|-s9&D+ZDe|0*YJbLsfDnaGt<&l5P z@a);Ms0_ARt!lUS(YyMCjex(ryj+68;If4sK73dJDJdz5%GjevkE%EGi=}pDpDm^I zzU~p1%O$5zpB6xBYHDO;WJCgiz>+z-y1GQ8(WvEl$t@y4TVi734u`{m(P#v~>-A!{ z+p*bfI2;Z}M@JbO8)JNY9Iw~=MxuX=j0|#ea>&iiB_}5bqtQrdX(<+q1%qL>u?hx* zY~H+?o}Qj>fFi)N9A!TO?pZ9BwOLtN*zI;)E>~nRHZ~Tc(MWD?F4@`HWM*cPoIE=* zN=;40=kxLE)hhyl0A8<`iHQkDM@JbP9OU`)=MkQD>(;455n5VW0DcMlWx0QzRr}P> z)6>)0vSkZas}-x&ipgZcU@)N7MmN}TyWKb(4({H)OLuoSot>Qw4Gp0*+?#-KG`zn8 z#AdU}helRbmH_`;$*jw*dZMJHWZptB807x_`wR{aGBh-V+wEp*YKp0;DT2Wu0BLDy zq^72lk&%JHV8CcJQdCq#N=kpq0xl)yJ?}-?$;nCD+uLbtYonv1gM0Vx@$%*36QQ)U zG{WI9Q&Uq5rz>mLuwlan%F4>vwQCm@6&1wA#W6c-SX|kq#_R^*QC?miZnv9ID1=t4 zrMS2lv)N2>aWU)Hucx4(fb8sS^m;w9v9a?ACMPGEn3!OAc$lG~A$os%d$HMU+_`fH zzuyl)ette9BO?I62L2qavbn%$T3Q-EIN#gUwxj9#y&sHg~&$wYd3dgSW6y1Hm-Y2o6QJkr?MD7CeW&?OG870JbwH*(hIz;Y0)mjv$VIj)7;$5 z?c28rhr=W$CSo#~sI08SY&NrL(9r+C=|lyi%jpI0$;8q8>oi;5I6|z zR@zAN^YbYzEF?capPZZ=G@99Ax=yD?{<-+N7(%;`tC=^op?*e~S zUaaRURrd9<&u&9tv-0Ogp)xUvU&7g!O5Pp<>_9j06)?8a!Q66@qTGO1`K{tPFf-?x dzr(7+{{e7y<;T0U$D9BF002ovPDHLkV1m4Nxs?C_ delta 1830 zcmV+>2if?<4~GwsHwpg${{a7>y{D6rKp+ST3K=SGklR#|XeWOL;z>k7R9M69nQds3 z>lw#?ZBqN1rmcOWT|=zpVDY3)8mS5!9<4%I$NI%097lH;cy`PuT2OH7*76H}Ag7?W!sd=e7-a@y363j4zY3HN>f zub2C}ulstg2R?rws8*T35(ojWKLlq8@ag*^Q?G)8Mj$orzaFSlem?^IYss5F#iR2* z-(3lD$|`&IF7Qj>Z)?@Fs}{4VtEgz!hmsNtfZr;f?EyYstBQUMOah|Q=|rtoi;`>i zu0>@Bb8~a0x3^bBMC^9E)YjGt5CFcjmK3cAeh8S9 z1LFez1^ff}W}f-SfG^!{H$_E72?GX$fuW(HTfp`OE~j0<_Y|1`4}r_TgKslp9nh}C zny6GN(P%XB$^8}ZXQ1kxbsd1rho+_`Q51+rj$+_slsh9ML(U`#|2HkdT`uchag+j{~cKGmN0i?FJHYsC|9z7b}nV&4RD*JpXSMR$XaXNpU za_ZD60i>m+MJ6UDBp3`XnPXsJKvXJK^m<;_+ih=FR@Nsrn+?5Q4}izx!D_W)u~@L# zY&aYao;`cU(8hX8+va&KtN=hgyDk3K*2Y|f1Jp6t? zZ{EBi7!2a^c$k`+!r^c*Ha5o0%uI}D{rdIP)xGV7ba!_H{1o^@GJS&%;ERHS0=8}2 zhS_Y!Y&K&s7|`i-sMX0ec3dtOHk*xm_wI4`?p!9KR=(mygUjE z3(@Ix==FN4tEFevGx3`!6{(kP?zt8K}^LI4!^Ye*BBKUm1 zx!sl2RH~|~*s^5{yLRoOp`m|)^z?K@WI<(@8nacvSYOoWy_Y^%4q&@caE} zwOZ2C)5*!nL95kLU0sdAV4$F&Ahz`b0|Rt-cXR&yc}7P^0e%d0t*9RmeO+<8-O}0F zDXp!oQdwCki?lcwe9FtqrMbCTIyyS!$&)9sT41rFMZFBq(%09=g$ozBb?X+9NQA7c zEDQz%jg5^MjYc+a-b{aXb~YM~2CY_0W@aYAV36tQX##-&e!rj5(NQcG3xk7$+`M^{ zD_5?(z1uf!V$YsEQF-MnX@-0j?~y}?4oOc>Pf|6*yRcfV($>}{Mx!y_^A}dq^86b3 z4}jnACmaqlJ3Gtt^z@2)O|M?PA`l1=4u|pkV?E{