00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "canvascardwindow.h"
00022 #include "freecellcardgame.h"
00023 #include "chicanecardgame.h"
00024 #include "harpcardgame.h"
00025 #include "teeclubcardgame.h"
00026
00027 #include <opie2/oresource.h>
00028
00029 CanvasCardWindow::CanvasCardWindow(QWidget* parent, const char* name, WFlags f) :
00030 QMainWindow(parent, name, f), canvas(230, 260), snapOn(TRUE), cardBack(4), gameType(0),
00031 cardGame(NULL)
00032 {
00033 setIcon( Opie::Core::OResource::loadPixmap( "cards" ) );
00034 setCaption(tr("Patience"));
00035
00036
00037 if ( QPixmap::defaultDepth() < 12 ) {
00038
00039
00040 canvas.setBackgroundColor(QColor(0x08, 0x98, 0x2D));
00041 } else {
00042 QPixmap bg;
00043 bg.convertFromImage( Opie::Core::OResource::loadImage( "table_pattern" ), ThresholdDither );
00044 canvas.setBackgroundPixmap(bg);
00045 }
00046
00047 #if defined( QT_QWS_CASSIOPEIA )
00048 canvas.setAdvancePeriod(70);
00049 #else
00050 canvas.setAdvancePeriod(30);
00051 #endif
00052
00053
00054 #ifdef _PATIENCE_USE_ACCELS_
00055 QMenuBar* menu = menuBar();
00056
00057 QPopupMenu* file = new QPopupMenu;
00058 file->insertItem(tr("Patience"), this, SLOT(initPatience()), CTRL+Key_F);
00059 file->insertItem(tr("Freecell"), this, SLOT(initFreecell()), CTRL+Key_F);
00060 file->insertItem(tr("Chicane"), this, SLOT(initChicane()), CTRL+Key_F);
00061 file->insertItem(tr("Harp"), this, SLOT(initHarp()), CTRL+Key_F);
00062 file->insertItem(tr("Teeclub"), this, SLOT(initTeeclub()), CTRL+Key_F);
00063 menu->insertItem(tr("&Game"), file);
00064
00065 menu->insertSeparator();
00066
00067 settings = new QPopupMenu;
00068 settings->insertItem(tr("&Change card backs"), this, SLOT(changeCardBacks()), Key_F2);
00069 snap_id = settings->insertItem(tr("&Snap to position"), this, SLOT(snapToggle()), Key_F3);
00070 settings->setCheckable(TRUE);
00071 menu->insertItem(tr("&Settings"),settings);
00072
00073 menu->insertSeparator();
00074
00075 QPopupMenu* help = new QPopupMenu;
00076 help->insertItem(tr("&About"), this, SLOT(help()), Key_F1);
00077 help->setItemChecked(dbf_id, TRUE);
00078 menu->insertItem(tr("&Help"),help);
00079 #else
00080 QMenuBar* menu = menuBar();
00081
00082 QPopupMenu* file = new QPopupMenu;
00083 file->insertItem(tr("Patience"), this, SLOT(initPatience()));
00084 file->insertItem(tr("Freecell"), this, SLOT(initFreecell()));
00085 file->insertItem(tr("Chicane"), this, SLOT(initChicane()));
00086 file->insertItem(tr("Harp"), this, SLOT(initHarp()));
00087 file->insertItem(tr("Teeclub"), this, SLOT(initTeeclub()));
00088 menu->insertItem(tr("Play"), file);
00089
00090 menu->insertSeparator();
00091
00092 settings = new QPopupMenu;
00093 settings->setCheckable(TRUE);
00094 settings->insertItem(tr("Change card backs"), this, SLOT(changeCardBacks()));
00095 snap_id = settings->insertItem(tr("Snap to position"), this, SLOT(snapToggle()));
00096 QString m;
00097
00098 drawId = settings->insertItem(tr("Turn one card"), this, SLOT(drawnToggle()));
00099 menu->insertItem(tr("Settings"),settings);
00100 settings->setCheckable(TRUE);
00101
00102 #endif
00103
00104 menu->show();
00105
00106 Config cfg( "Patience" );
00107 cfg.setGroup( "GlobalSettings" );
00108 snapOn = cfg.readBoolEntry( "SnapOn", TRUE);
00109 settings->setItemChecked(snap_id, snapOn);
00110
00111 gameType = cfg.readNumEntry( "GameType", -1 );
00112 drawThree = cfg.readBoolEntry( "DrawThree", FALSE);
00113 if ( gameType == 0 ) {
00114 cardGame = new PatienceCardGame( &canvas, snapOn, this );
00115 cardGame->setNumberToDraw(drawThree ? 3 : 1);
00116
00117 setCaption(tr("Patience"));
00118 setCentralWidget(cardGame);
00119 cardGame->readConfig( cfg );
00120 setCardBacks();
00121 } else if ( gameType == 1 ) {
00122 cardGame = new FreecellCardGame( &canvas, snapOn, this );
00123 setCaption(tr("Freecell"));
00124 setCentralWidget(cardGame);
00125
00126 cardGame->readConfig( cfg );
00127 setCardBacks();
00128 } else if ( gameType == 2 ) {
00129 cardGame = new ChicaneCardGame( &canvas, snapOn, this );
00130 cardGame->setNumberToDraw(1);
00131 setCaption(tr("Chicane"));
00132 setCentralWidget(cardGame);
00133 cardGame->readConfig( cfg );
00134 setCardBacks();
00135 } else if ( gameType == 3 ) {
00136 cardGame = new HarpCardGame( &canvas, snapOn, this );
00137 cardGame->setNumberToDraw(1);
00138 setCaption(tr("Harp"));
00139 setCentralWidget(cardGame);
00140 cardGame->readConfig( cfg );
00141 setCardBacks();
00142 } else if ( gameType == 4 ) {
00143 cardGame = new TeeclubCardGame( &canvas, snapOn, this );
00144 cardGame->setNumberToDraw(1);
00145 setCaption(tr("Teeclub"));
00146 setCentralWidget(cardGame);
00147 cardGame->readConfig( cfg );
00148 setCardBacks();
00149 } else {
00150
00151
00152 initPatience();
00153 }
00154
00155 updateDraw();
00156 }
00157
00158
00159 CanvasCardWindow::~CanvasCardWindow()
00160 {
00161 if (cardGame) {
00162 Config cfg("Patience");
00163 cfg.setGroup( "GlobalSettings" );
00164 cfg.writeEntry( "GameType", gameType );
00165 cfg.writeEntry( "SnapOn", snapOn );
00166 cfg.writeEntry( "DrawThree", drawThree);
00167 cfg.write();
00168 cardGame->writeConfig( cfg );
00169 delete cardGame;
00170 }
00171 }
00172
00173
00174 void CanvasCardWindow::resizeEvent(QResizeEvent *)
00175 {
00176 QSize s = centralWidget()->size();
00177 int fw = style().defaultFrameWidth();
00178 canvas.resize( s.width() - fw - 2, s.height() - fw - 2);
00179 }
00180
00181
00182 void CanvasCardWindow::initPatience()
00183 {
00184
00185 if ( cardGame )
00186 delete cardGame;
00187 cardGame = new PatienceCardGame( &canvas, snapOn, this );
00188 cardGame->setNumberToDraw(drawThree ? 3 : 1);
00189 gameType = 0;
00190 setCaption(tr("Patience"));
00191 setCentralWidget(cardGame);
00192 cardGame->newGame();
00193 setCardBacks();
00194 updateDraw();
00195 }
00196
00197
00198 void CanvasCardWindow::initFreecell()
00199 {
00200
00201 if ( cardGame ) {
00202 delete cardGame;
00203 }
00204 cardGame = new FreecellCardGame( &canvas, snapOn, this );
00205 gameType = 1;
00206 setCaption(tr("Freecell"));
00207 setCentralWidget(cardGame);
00208 cardGame->newGame();
00209 setCardBacks();
00210 }
00211
00212
00213 void CanvasCardWindow::initChicane()
00214 {
00215
00216 if ( cardGame ) {
00217 delete cardGame;
00218 }
00219 cardGame = new ChicaneCardGame( &canvas, snapOn, this );
00220 cardGame->setNumberToDraw(1);
00221 gameType = 2;
00222 setCaption(tr("Chicane"));
00223 setCentralWidget(cardGame);
00224 cardGame->newGame();
00225 setCardBacks();
00226 }
00227
00228 void CanvasCardWindow::initHarp()
00229 {
00230
00231 if ( cardGame ) {
00232 delete cardGame;
00233 }
00234 cardGame = new HarpCardGame( &canvas, snapOn, this );
00235 cardGame->setNumberToDraw(1);
00236 gameType = 3;
00237 setCaption(tr("Harp"));
00238 setCentralWidget(cardGame);
00239 cardGame->newGame();
00240 setCardBacks();
00241 }
00242
00243
00244 void CanvasCardWindow::initTeeclub()
00245 {
00246
00247 if ( cardGame ) {
00248 delete cardGame;
00249 }
00250 cardGame = new TeeclubCardGame( &canvas, snapOn, this );
00251 cardGame->setNumberToDraw(1);
00252 gameType = 4;
00253 setCaption(tr("Teeclub"));
00254 setCentralWidget(cardGame);
00255 cardGame->newGame();
00256 setCardBacks();
00257 }
00258
00259
00260 void CanvasCardWindow::snapToggle()
00261 {
00262 snapOn = !snapOn;
00263 settings->setItemChecked(snap_id, snapOn);
00264 cardGame->toggleSnap();
00265 }
00266
00267
00268 void CanvasCardWindow::drawnToggle()
00269 {
00270 drawThree=!drawThree;
00271 Config cfg( "Patience" );
00272 cfg.setGroup( "GlobalSettings" );
00273 cardGame->toggleCardsDrawn();
00274 updateDraw();
00275 cfg.writeEntry( "DrawThree", drawThree);
00276 cfg.write();
00277 }
00278
00279 void CanvasCardWindow::updateDraw() {
00280 if(cardGame->cardsDrawn() == 3){
00281 settings->changeItem(drawId, tr("Turn one card"));
00282 } else {
00283 settings->changeItem(drawId, tr("Turn three cards"));
00284 }
00285 }
00286
00287
00288 void CanvasCardWindow::setCardBacks()
00289 {
00290 QCanvasItemList l = canvas.allItems();
00291
00292 for (QCanvasItemList::Iterator it = l.begin(); it != l.end(); ++it) {
00293 if ( (*it)->rtti() == canvasCardId )
00294 ((CanvasCard *)(*it))->setCardBack( cardBack );
00295 }
00296 }
00297
00298
00299 void CanvasCardWindow::changeCardBacks()
00300 {
00301 cardBack++;
00302
00303 if (cardBack == 5)
00304 cardBack = 0;
00305
00306 setCardBacks();
00307 }
00308
00309