diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | c90c389a8a8d9d8661e9772ec4144c5cf2039f23 (patch) | |
tree | 6d8391395bce9eaea4ad78958617edb20c6a7573 /kjumpingcube/kjumpingcube.cpp | |
download | tdegames-c90c389a8a8d9d8661e9772ec4144c5cf2039f23.tar.gz tdegames-c90c389a8a8d9d8661e9772ec4144c5cf2039f23.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdegames@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kjumpingcube/kjumpingcube.cpp')
-rw-r--r-- | kjumpingcube/kjumpingcube.cpp | 278 |
1 files changed, 278 insertions, 0 deletions
diff --git a/kjumpingcube/kjumpingcube.cpp b/kjumpingcube/kjumpingcube.cpp new file mode 100644 index 00000000..13619d99 --- /dev/null +++ b/kjumpingcube/kjumpingcube.cpp @@ -0,0 +1,278 @@ +/***************************************************************************** + This file is part of the game 'KJumpingCube' + + Copyright (C) 1998-2000 by Matthias Kiefer + <matthias.kiefer@gmx.de> + + This program 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 2 of the License, or + (at your option) any later version. + + This program 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. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +**************************************************************************** */ +#include "kjumpingcube.h" +#include "kcubeboxwidget.h" +#include "version.h" + +// Settings +#include "settings.h" +#include <kconfigdialog.h> + +#include "prefs.h" + +#include <qregexp.h> + +#include <klocale.h> +#include <kfiledialog.h> +#include <kmessagebox.h> +#include <ktempfile.h> +#include <kstdgameaction.h> +#include <kaction.h> +#include <kio/netaccess.h> +#include <kstatusbar.h> + +#define ID_STATUS_TURN_TEXT 1000 +#define ID_STATUS_TURN 2000 + +#define MESSAGE_TIME 2000 + + +KJumpingCube::KJumpingCube() + : view(new KCubeBoxWidget(5, this, "KCubeBoxWidget")) +{ + connect(view,SIGNAL(playerChanged(int)),SLOT(changePlayer(int))); + connect(view,SIGNAL(stoppedMoving()),SLOT(disableStop())); + connect(view,SIGNAL(stoppedThinking()),SLOT(disableStop())); + connect(view,SIGNAL(startedMoving()),SLOT(enableStop_Moving())); + connect(view,SIGNAL(startedThinking()),SLOT(enableStop_Thinking())); + connect(view,SIGNAL(playerWon(int)),SLOT(showWinner(int))); + + // tell the KMainWindow that this is indeed the main widget + setCentralWidget(view); + + // init statusbar + QString s = i18n("Current player:"); + statusBar()->insertItem(s,ID_STATUS_TURN_TEXT, false); + statusBar()->changeItem(s,ID_STATUS_TURN_TEXT); + statusBar()->setItemAlignment (ID_STATUS_TURN_TEXT, AlignLeft | AlignVCenter); + statusBar()->setFixedHeight( statusBar()->sizeHint().height() ); + + currentPlayer = new QWidget(this, "currentPlayer"); + currentPlayer->setFixedWidth(40); + statusBar()->addWidget(currentPlayer, ID_STATUS_TURN, false); + statusBar()->setItemAlignment(ID_STATUS_TURN, AlignLeft | AlignVCenter); + + initKAction(); + changePlayer(1); +} + +void KJumpingCube::initKAction() { + KStdGameAction::gameNew(this, SLOT(newGame()), actionCollection()); + KStdGameAction::load(this, SLOT(openGame()), actionCollection()); + KStdGameAction::save(this, SLOT(save()), actionCollection()); + KStdGameAction::saveAs(this, SLOT(saveAs()), actionCollection()); + KStdGameAction::quit(this, SLOT(close()), actionCollection()); + + hintAction = KStdGameAction::hint(view, SLOT(getHint()), actionCollection()); + stopAction = new KAction(i18n("Stop &Thinking"), "stop", + Qt::Key_Escape, this, SLOT(stop()), actionCollection(), "game_stop"); + stopAction->setEnabled(false); + undoAction = KStdGameAction::undo(this, SLOT(undo()), actionCollection()); + undoAction->setEnabled(false); + KStdAction::preferences(this, SLOT(showOptions()), actionCollection()); + + setupGUI(); +} + +void KJumpingCube::newGame(){ + undoAction->setEnabled(false); + view->reset(); + statusBar()->message(i18n("New Game"),MESSAGE_TIME); +} + +void KJumpingCube::saveGame(bool saveAs) +{ + if(saveAs || gameURL.isEmpty()) + { + int result=0; + KURL url; + + do + { + url = KFileDialog::getSaveURL(gameURL.url(),"*.kjc",this,0); + + if(url.isEmpty()) + return; + + // check filename + QRegExp pattern("*.kjc",true,true); + if(!pattern.exactMatch(url.filename())) + { + url.setFileName( url.filename()+".kjc" ); + } + + if(KIO::NetAccess::exists(url,false,this)) + { + QString mes=i18n("The file %1 exists.\n" + "Do you want to overwrite it?").arg(url.url()); + result = KMessageBox::warningContinueCancel(this, mes, QString::null, i18n("Overwrite")); + if(result==KMessageBox::Cancel) + return; + } + } + while(result==KMessageBox::No); + + gameURL=url; + } + + KTempFile tempFile; + tempFile.setAutoDelete(true); + KSimpleConfig config(tempFile.name()); + + config.setGroup("KJumpingCube"); + config.writeEntry("Version",KJC_VERSION); + config.setGroup("Game"); + view->saveGame(&config); + config.sync(); + + if(KIO::NetAccess::upload( tempFile.name(),gameURL,this )) + { + QString s=i18n("game saved as %1"); + s=s.arg(gameURL.url()); + statusBar()->message(s,MESSAGE_TIME); + } + else + { + KMessageBox::sorry(this,i18n("There was an error in saving file\n%1").arg(gameURL.url())); + } +} + +void KJumpingCube::openGame() +{ + bool fileOk=true; + KURL url; + + do + { + url = KFileDialog::getOpenURL( gameURL.url(), "*.kjc", this, 0 ); + if( url.isEmpty() ) + return; + if(!KIO::NetAccess::exists(url,true,this)) + { + QString mes=i18n("The file %1 does not exist!").arg(url.url()); + KMessageBox::sorry(this,mes); + fileOk=false; + } + } + while(!fileOk); + + QString tempFile; + if( KIO::NetAccess::download( url, tempFile, this ) ) + { + KSimpleConfig config(tempFile,true); + config.setGroup("KJumpingCube"); + if(!config.hasKey("Version")) + { + QString mes=i18n("The file %1 isn't a KJumpingCube gamefile!") + .arg(url.url()); + KMessageBox::sorry(this,mes); + return; + } + + gameURL=url; + config.setGroup("Game"); + view->restoreGame(&config); + + undoAction->setEnabled(false); + + KIO::NetAccess::removeTempFile( tempFile ); + } + else + KMessageBox::sorry(this,i18n("There was an error loading file\n%1").arg( url.url() )); +} + +void KJumpingCube::stop() +{ + + if(view->isMoving()) + undoAction->setEnabled(true); + + view->stopActivities(); + + statusBar()->message(i18n("stopped activity"),MESSAGE_TIME); +} + +void KJumpingCube::undo() +{ + if(view->isActive()) + return; + view->undo(); + undoAction->setEnabled(false); +} + +void KJumpingCube::changePlayer(int newPlayer) +{ + undoAction->setEnabled(true); + currentPlayer->setBackgroundColor(newPlayer == 1 ? Prefs::color1() : Prefs::color2()); + currentPlayer->repaint(); +} + +void KJumpingCube::showWinner(int player) { + QString s=i18n("Winner is Player %1!").arg(player); + KMessageBox::information(this,s,i18n("Winner")); + view->reset(); +} + +void KJumpingCube::disableStop() +{ +// toolBar()->setItemEnabled(ID_GAME_STOP_HINT,false); +// game->setItemEnabled(ID_GAME_STOP_HINT,false); +// toolBar()->setItemEnabled(ID_GAME_HINT,true); +// game->setItemEnabled(ID_GAME_HINT,true); + stopAction->setEnabled(false); + hintAction->setEnabled(true); + statusBar()->clear(); +} + + +void KJumpingCube::enableStop_Moving() +{ +// toolBar()->setItemEnabled(ID_GAME_STOP_HINT,true); +// game->setItemEnabled(ID_GAME_STOP_HINT,true); +// toolBar()->setItemEnabled(ID_GAME_HINT,false); +// game->setItemEnabled(ID_GAME_HINT,false); + stopAction->setEnabled(true); + hintAction->setEnabled(false); + statusBar()->message(i18n("Performing move.")); +} + +void KJumpingCube::enableStop_Thinking(){ + stopAction->setEnabled(true); + hintAction->setEnabled(false); + statusBar()->message(i18n("Computing next move.")); +} + +/** + * Show Configure dialog. + */ +void KJumpingCube::showOptions(){ + if(KConfigDialog::showDialog("settings")) + return; + + KConfigDialog *dialog = new KConfigDialog(this, "settings", Prefs::self(), KDialogBase::Swallow); + dialog->addPage(new Settings(0, "General"), i18n("General"), "package_settings"); + connect(dialog, SIGNAL(settingsChanged()), view, SLOT(loadSettings())); + dialog->show(); +} + +#include "kjumpingcube.moc" + |