You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdegames/katomic/gamewidget.cpp

231 lines
5.4 KiB

/* toplevel.cpp
Copyright (C) 1998 Andreas W<EFBFBD>st (AndreasWuest@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 "settings.h"
#include "gamewidget.h"
#include "feld.h"
#include "molek.h"
#include <qscrollbar.h>
#include <qgroupbox.h>
#include <qlayout.h>
#include <qvbox.h>
#include <qlabel.h>
#include <kapplication.h>
#include <kscoredialog.h>
#include <kmessagebox.h>
#include <klocale.h>
#include <kstandarddirs.h>
#include <kglobal.h>
#include <ksimpleconfig.h>
#include <kglobalsettings.h>
Options settings;
#define MPOSX 480
#define MPOSY 90
// ##########################
// # class GameWidget #
// ##########################
int level;
void GameWidget::moveUp()
{
feld->startAnimation (Feld::MoveUp);
}
void GameWidget::moveDown()
{
feld->startAnimation (Feld::MoveDown);
}
void GameWidget::moveLeft()
{
feld->startAnimation (Feld::MoveLeft);
}
void GameWidget::moveRight()
{
feld->startAnimation (Feld::MoveRight);
}
void GameWidget::nextAtom()
{
feld->nextAtom();
}
void GameWidget::previousAtom()
{
feld->previousAtom();
}
void GameWidget::getButton (int button)
{
feld->startAnimation ((Feld::Direction)button);
}
void GameWidget::doUndo ()
{
feld->doUndo ();
}
void GameWidget::doRedo ()
{
feld->doRedo ();
}
void GameWidget::gameOver(int moves) {
KMessageBox::information(this, i18n("You solved level %1 with %2 moves!").arg(level).arg(moves), i18n("Congratulations"));
KScoreDialog high(KScoreDialog::Name | KScoreDialog::Score, this);
high.setCaption(i18n("Level %1 Highscores").arg(level));
high.setConfigGroup(QString("Highscores Level %1").arg(level));
KScoreDialog::FieldInfo scoreInfo;
if (high.addScore(moves, scoreInfo, true, true))
{
high.exec();
}
updateLevel(level+1);
}
void GameWidget::getMoves(int moves)
{
current.setNum(moves);
ys->setText(current);
}
void GameWidget::updateLevel (int l)
{
level=l;
QString levelFile = locate("appdata", QString("levels/level_%1").arg(l));
if (levelFile.isNull()) {
return updateLevel(1);
}
KSimpleConfig cfg(levelFile, true);
cfg.setGroup("Level");
feld->load(cfg);
highScore->setConfigGroup(QString("High Scores Level %1").arg(level));
highest.setNum(highScore->highScore());
if (highest != "0" ) hs->setText(highest);
else hs->setText("-");
ys->setText("0");
scrl->setValue(level);
feld->repaint();
}
void GameWidget::restartLevel()
{
updateLevel(level);
}
GameWidget::GameWidget ( QWidget *parent, const char* name )
: QWidget( parent, name )
{
level = 1;
nlevels = KGlobal::dirs()->findAllResources("appdata", "levels/level_*",
false, true).count();
QHBoxLayout *top = new QHBoxLayout(this, 10);
// spielfeld
feld = new Feld (this, "feld");
feld->setFocus();
top->addWidget(feld);
QVBox *vb = new QVBox(this);
vb->setSpacing(20);
top->addWidget(vb);
// scrollbar
scrl = new QScrollBar(1, nlevels, 1,
5, 1, QScrollBar::Horizontal, vb, "scrl" );
connect (scrl, SIGNAL (valueChanged (int)), SLOT (updateLevel (int)));
// molek<65>l
molek = new Molek (vb, "molek");
feld->setMolek(molek);
connect (feld, SIGNAL (gameOver(int)), SLOT(gameOver(int)));
connect (feld, SIGNAL (sendMoves(int)), SLOT(getMoves(int)));
connect (feld, SIGNAL (enableRedo(bool)), SIGNAL(enableRedo(bool)));
connect (feld, SIGNAL (enableUndo(bool)), SIGNAL(enableUndo(bool)));
highScore = new KScoreDialog(KScoreDialog::Name | KScoreDialog::Score, this);
// the score group
QGroupBox *bg = new QGroupBox (i18n("Score"), vb, "bg");
QBoxLayout *slay = new QVBoxLayout (bg, 10);
slay->addSpacing(10);
slay->addWidget(new QLabel(i18n("Highscore:"), bg));
QFont headerFont = KGlobalSettings::generalFont();
headerFont.setBold(true);
hs = new QLabel (highest, bg);
hs->setAlignment(Qt::AlignRight);
hs->setFont(headerFont);
slay->addWidget(hs);
slay->addSpacing(10);
slay->addWidget(new QLabel(i18n("Your score so far:"), bg));
ys = new QLabel (current, bg);
ys->setAlignment(Qt::AlignRight);
ys->setFont(headerFont);
slay->addWidget(ys);
updateLevel(1);
KConfig *config = KGlobal::config();
config->setGroup("Options");
settings.anim_speed = config->readNumEntry("Animation Speed", 1);
if (settings.anim_speed < 1 || settings.anim_speed > MAX_SPEED)
settings.anim_speed = 1;
settings.changed = false;
}
GameWidget::~GameWidget()
{
}
void GameWidget::showHighscores ()
{
KScoreDialog high(KScoreDialog::Name | KScoreDialog::Score, this);
high.setCaption(i18n("Level %1 Highscores").arg(level));
high.setConfigGroup(QString("Highscores Level %1").arg(level));
high.exec();
}
#include "gamewidget.moc"