|
|
|
/*
|
|
|
|
* ksokoban - a Sokoban game for KDE
|
|
|
|
* Copyright (C) 1998 Anders Widell <awl@hem.passagen.se>
|
|
|
|
*
|
|
|
|
* 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 <stdio.h>
|
|
|
|
|
|
|
|
#include <kapplication.h>
|
|
|
|
#include <kconfig.h>
|
|
|
|
#include <kmenubar.h>
|
|
|
|
#include <tqpopupmenu.h>
|
|
|
|
#include <tqkeycode.h>
|
|
|
|
#include <assert.h>
|
|
|
|
#include <klocale.h>
|
|
|
|
#include <tqstring.h>
|
|
|
|
#include <kfiledialog.h>
|
|
|
|
#include <tqframe.h>
|
|
|
|
#include <kmessagebox.h>
|
|
|
|
#include <kstandarddirs.h>
|
|
|
|
#include <kio/netaccess.h>
|
|
|
|
#include <kiconloader.h>
|
|
|
|
#include <tqiconset.h>
|
|
|
|
#include <tqdragobject.h>
|
|
|
|
#include <kpopupmenu.h>
|
|
|
|
#include <kurldrag.h>
|
|
|
|
#include <kstdaccel.h>
|
|
|
|
|
|
|
|
#include "MainWindow.h"
|
|
|
|
#include "PlayField.h"
|
|
|
|
#include "LevelCollection.h"
|
|
|
|
|
|
|
|
#include "MainWindow.moc"
|
|
|
|
|
|
|
|
void
|
|
|
|
MainWindow::createCollectionMenu() {
|
|
|
|
collection_ = new TQPopupMenu(0,"collection menu");
|
|
|
|
collection_->setCheckable(true);
|
|
|
|
//connect(collection_, TQT_SIGNAL(activated(int)), playField_, TQT_SLOT(changeCollection(int)));
|
|
|
|
connect(collection_, TQT_SIGNAL(activated(int)), this, TQT_SLOT(changeCollection(int)));
|
|
|
|
|
|
|
|
for (int i=0; i<internalCollections_.collections(); i++) {
|
|
|
|
collection_->insertItem(internalCollections_[i]->name(), i);
|
|
|
|
}
|
|
|
|
checkedCollection_ = 0;
|
|
|
|
|
|
|
|
KConfig *cfg=(KApplication::kApplication())->config();
|
|
|
|
cfg->setGroup("settings");
|
|
|
|
int id = cfg->readNumEntry("collection", 10);
|
|
|
|
|
|
|
|
currentCollection_ = 0;
|
|
|
|
for (int i=0; i<internalCollections_.collections(); i++) {
|
|
|
|
if (internalCollections_[i]->id() == id) currentCollection_ = i;
|
|
|
|
}
|
|
|
|
|
|
|
|
changeCollection(currentCollection_);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
MainWindow::MainWindow() : KMainWindow(0), externalCollection_(0) {
|
|
|
|
int i;
|
|
|
|
TQPixmap pixmap;
|
|
|
|
|
|
|
|
setEraseColor(TQColor(0,0,0));
|
|
|
|
|
|
|
|
KConfig *cfg=(KApplication::kApplication())->config();
|
|
|
|
cfg->setGroup("Geometry");
|
|
|
|
int width = cfg->readNumEntry("width", 750);
|
|
|
|
int height = cfg->readNumEntry("height", 562);
|
|
|
|
resize(width, height);
|
|
|
|
|
|
|
|
playField_ = new PlayField(this, "playfield");
|
|
|
|
setCentralWidget(playField_);
|
|
|
|
playField_->show();
|
|
|
|
|
|
|
|
menu_ = new KMenuBar(this, "menubar" );
|
|
|
|
|
|
|
|
game_ = new TQPopupMenu(0,"game menu");
|
|
|
|
pixmap = SmallIcon("fileopen");
|
|
|
|
game_->insertItem(TQIconSet(pixmap), i18n("&Load Levels..."), this, TQT_SLOT(loadLevels()));
|
|
|
|
pixmap = SmallIcon("forward");
|
|
|
|
game_->insertItem(TQIconSet(pixmap), i18n("&Next Level"), playField_, TQT_SLOT(nextLevel()), Key_N);
|
|
|
|
pixmap = SmallIcon("back");
|
|
|
|
game_->insertItem(TQIconSet(pixmap), i18n("&Previous Level"), playField_, TQT_SLOT(previousLevel()), Key_P);
|
|
|
|
pixmap = SmallIcon("reload");
|
|
|
|
game_->insertItem(TQIconSet(pixmap), i18n("Re&start Level"), playField_, TQT_SLOT(restartLevel()), Key_Escape);
|
|
|
|
|
|
|
|
createCollectionMenu();
|
|
|
|
game_->insertItem(i18n("&Level Collection"), collection_);
|
|
|
|
|
|
|
|
pixmap = SmallIcon("undo");
|
|
|
|
game_->insertItem(TQIconSet(pixmap), i18n("&Undo"), playField_, TQT_SLOT(undo()),TQKeySequence( (KStdAccel::undo()).toString()));
|
|
|
|
pixmap = SmallIcon("redo");
|
|
|
|
game_->insertItem(TQIconSet(pixmap), i18n("&Redo"), playField_, TQT_SLOT(redo()), TQKeySequence( (KStdAccel::redo()).toString()));
|
|
|
|
game_->insertSeparator();
|
|
|
|
pixmap = SmallIcon("exit");
|
|
|
|
game_->insertItem(TQIconSet(pixmap), i18n("&Quit"), KApplication::kApplication(), TQT_SLOT(closeAllWindows()), TQKeySequence( (KStdAccel::quit()).toString()));
|
|
|
|
menu_->insertItem(i18n("&Game"), game_);
|
|
|
|
|
|
|
|
animation_ = new TQPopupMenu(0,"animation menu");
|
|
|
|
animation_->setCheckable(true);
|
|
|
|
connect(animation_, TQT_SIGNAL(activated(int)), this, TQT_SLOT(updateAnimMenu(int)));
|
|
|
|
connect(animation_, TQT_SIGNAL(activated(int)), playField_, TQT_SLOT(changeAnim(int)));
|
|
|
|
animation_->insertItem(i18n("&Slow"), 3);
|
|
|
|
animation_->insertItem(i18n("&Medium"), 2);
|
|
|
|
animation_->insertItem(i18n("&Fast"), 1);
|
|
|
|
animation_->insertItem(i18n("&Off"), 0);
|
|
|
|
checkedAnim_ = playField_->animDelay();
|
|
|
|
updateAnimMenu(checkedAnim_);
|
|
|
|
menu_->insertItem(i18n("&Animation"), animation_);
|
|
|
|
|
|
|
|
pixmap = SmallIcon("bookmark_add");
|
|
|
|
bookmarkMenu_ = new TQPopupMenu(0,"bookmarks menu");
|
|
|
|
setBM_ = new TQPopupMenu(0, "set bookmark menu");
|
|
|
|
setBM_->insertItem(TQIconSet(pixmap), i18n("(unused)"), 1);
|
|
|
|
setBM_->setAccel(CTRL+Key_1, 1);
|
|
|
|
setBM_->insertItem(TQIconSet(pixmap), i18n("(unused)"), 2);
|
|
|
|
setBM_->setAccel(CTRL+Key_2, 2);
|
|
|
|
setBM_->insertItem(TQIconSet(pixmap), i18n("(unused)"), 3);
|
|
|
|
setBM_->setAccel(CTRL+Key_3, 3);
|
|
|
|
setBM_->insertItem(TQIconSet(pixmap), i18n("(unused)"), 4);
|
|
|
|
setBM_->setAccel(CTRL+Key_4, 4);
|
|
|
|
setBM_->insertItem(TQIconSet(pixmap), i18n("(unused)"), 5);
|
|
|
|
setBM_->setAccel(CTRL+Key_5, 5);
|
|
|
|
setBM_->insertItem(TQIconSet(pixmap), i18n("(unused)"), 6);
|
|
|
|
setBM_->setAccel(CTRL+Key_6, 6);
|
|
|
|
setBM_->insertItem(TQIconSet(pixmap), i18n("(unused)"), 7);
|
|
|
|
setBM_->setAccel(CTRL+Key_7, 7);
|
|
|
|
setBM_->insertItem(TQIconSet(pixmap), i18n("(unused)"), 8);
|
|
|
|
setBM_->setAccel(CTRL+Key_8, 8);
|
|
|
|
setBM_->insertItem(TQIconSet(pixmap), i18n("(unused)"), 9);
|
|
|
|
setBM_->setAccel(CTRL+Key_9, 9);
|
|
|
|
setBM_->insertItem(TQIconSet(pixmap), i18n("(unused)"), 10);
|
|
|
|
setBM_->setAccel(CTRL+Key_0, 10);
|
|
|
|
connect(setBM_, TQT_SIGNAL(activated(int)), this, TQT_SLOT(setBookmark(int)));
|
|
|
|
bookmarkMenu_->insertItem(i18n("&Set Bookmark"), setBM_);
|
|
|
|
|
|
|
|
pixmap = SmallIcon("bookmark");
|
|
|
|
goToBM_ = new TQPopupMenu(0, "go to bookmark menu");
|
|
|
|
goToBM_->insertItem(TQIconSet(pixmap), i18n("(unused)"), 1);
|
|
|
|
goToBM_->setAccel(Key_1, 1);
|
|
|
|
goToBM_->insertItem(TQIconSet(pixmap), i18n("(unused)"), 2);
|
|
|
|
goToBM_->setAccel(Key_2, 2);
|
|
|
|
goToBM_->insertItem(TQIconSet(pixmap), i18n("(unused)"), 3);
|
|
|
|
goToBM_->setAccel(Key_3, 3);
|
|
|
|
goToBM_->insertItem(TQIconSet(pixmap), i18n("(unused)"), 4);
|
|
|
|
goToBM_->setAccel(Key_4, 4);
|
|
|
|
goToBM_->insertItem(TQIconSet(pixmap), i18n("(unused)"), 5);
|
|
|
|
goToBM_->setAccel(Key_5, 5);
|
|
|
|
goToBM_->insertItem(TQIconSet(pixmap), i18n("(unused)"), 6);
|
|
|
|
goToBM_->setAccel(Key_6, 6);
|
|
|
|
goToBM_->insertItem(TQIconSet(pixmap), i18n("(unused)"), 7);
|
|
|
|
goToBM_->setAccel(Key_7, 7);
|
|
|
|
goToBM_->insertItem(TQIconSet(pixmap), i18n("(unused)"), 8);
|
|
|
|
goToBM_->setAccel(Key_8, 8);
|
|
|
|
goToBM_->insertItem(TQIconSet(pixmap), i18n("(unused)"), 9);
|
|
|
|
goToBM_->setAccel(Key_9, 9);
|
|
|
|
goToBM_->insertItem(TQIconSet(pixmap), i18n("(unused)"), 10);
|
|
|
|
goToBM_->setAccel(Key_0, 10);
|
|
|
|
connect(goToBM_, TQT_SIGNAL(activated(int)), this, TQT_SLOT(goToBookmark(int)));
|
|
|
|
bookmarkMenu_->insertItem(i18n("&Go to Bookmark"), goToBM_);
|
|
|
|
menu_->insertItem(i18n("&Bookmarks"), bookmarkMenu_);
|
|
|
|
|
|
|
|
for (i=1; i<=10; i++) {
|
|
|
|
bookmarks_[i-1] = new Bookmark(i);
|
|
|
|
updateBookmark(i);
|
|
|
|
}
|
|
|
|
|
|
|
|
help_ = helpMenu(TQString(), false);
|
|
|
|
menu_->insertSeparator();
|
|
|
|
menu_->insertItem(i18n("&Help"), help_);
|
|
|
|
|
|
|
|
menu_->show();
|
|
|
|
|
|
|
|
setAcceptDrops(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
MainWindow::~MainWindow()
|
|
|
|
{
|
|
|
|
KConfig *cfg=(KApplication::kApplication())->config();
|
|
|
|
|
|
|
|
cfg->setGroup("Geometry");
|
|
|
|
cfg->writeEntry("width", width());
|
|
|
|
cfg->writeEntry("height", height());
|
|
|
|
|
|
|
|
cfg->setGroup("settings");
|
|
|
|
cfg->writeEntry("collection", internalCollections_[checkedCollection_]->id());
|
|
|
|
|
|
|
|
for (int i=1; i<=10; i++) {
|
|
|
|
delete bookmarks_[i-1];
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
delete externalCollection_;
|
|
|
|
|
|
|
|
// The following line segfaults when linked against qt 1.44
|
|
|
|
//delete help_;
|
|
|
|
delete goToBM_;
|
|
|
|
delete setBM_;
|
|
|
|
delete bookmarkMenu_;
|
|
|
|
delete animation_;
|
|
|
|
delete collection_;
|
|
|
|
delete game_;
|
|
|
|
//delete menu_;
|
|
|
|
|
|
|
|
//delete playField_;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
MainWindow::focusInEvent(TQFocusEvent *) {
|
|
|
|
playField_->setFocus();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
MainWindow::updateAnimMenu(int id) {
|
|
|
|
animation_->setItemChecked(checkedAnim_, false);
|
|
|
|
checkedAnim_ = id;
|
|
|
|
animation_->setItemChecked(checkedAnim_, true);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
MainWindow::updateBookmark(int num) {
|
|
|
|
int col = internalCollections_.toInternalId(bookmarks_[num-1]->collection());
|
|
|
|
int lev = bookmarks_[num-1]->level();
|
|
|
|
int mov = bookmarks_[num-1]->moves();
|
|
|
|
|
|
|
|
if (col < 0 || lev < 0) return;
|
|
|
|
|
|
|
|
TQString name;
|
|
|
|
if (col >= 0 && col < internalCollections_.collections())
|
|
|
|
name = internalCollections_[col]->name();
|
|
|
|
else
|
|
|
|
name = i18n("(invalid)");
|
|
|
|
TQString l;
|
|
|
|
l.setNum(lev+1);
|
|
|
|
name += " #" + l;
|
|
|
|
l.setNum(mov);
|
|
|
|
name += " (" + l + ")";
|
|
|
|
|
|
|
|
setBM_->changeItem(name, num);
|
|
|
|
goToBM_->changeItem(name, num);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
MainWindow::setBookmark(int id) {
|
|
|
|
assert(id >= 1 && id <= 10);
|
|
|
|
playField_->setBookmark(bookmarks_[id-1]);
|
|
|
|
updateBookmark(id);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
MainWindow::goToBookmark(int id) {
|
|
|
|
assert(id >= 1 && id <= 10);
|
|
|
|
|
|
|
|
Bookmark *bm = bookmarks_[id-1];
|
|
|
|
int collection = internalCollections_.toInternalId(bm->collection());
|
|
|
|
int level = bm->level();
|
|
|
|
|
|
|
|
if (collection < 0 || collection >= internalCollections_.collections()) return;
|
|
|
|
LevelCollection* colPtr = internalCollections_[collection];
|
|
|
|
if (colPtr == 0) return;
|
|
|
|
if (level < 0 || level >= colPtr->noOfLevels()) return;
|
|
|
|
if (level > colPtr->completedLevels()) return;
|
|
|
|
|
|
|
|
playField_->setUpdatesEnabled(false);
|
|
|
|
changeCollection(collection);
|
|
|
|
playField_->setUpdatesEnabled(true);
|
|
|
|
playField_->goToBookmark(bookmarks_[id-1]);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
MainWindow::changeCollection(int id)
|
|
|
|
{
|
|
|
|
collection_->setItemChecked(checkedCollection_, false);
|
|
|
|
checkedCollection_ = id;
|
|
|
|
collection_->setItemChecked(checkedCollection_, true);
|
|
|
|
|
|
|
|
delete externalCollection_;
|
|
|
|
externalCollection_ = 0;
|
|
|
|
playField_->changeCollection(internalCollections_[id]);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
MainWindow::loadLevels() {
|
|
|
|
KConfig *cfg=(KApplication::kApplication())->config();
|
|
|
|
cfg->setGroup("settings");
|
|
|
|
TQString lastFile = cfg->readPathEntry("lastLevelFile");
|
|
|
|
|
|
|
|
KURL result = KFileDialog::getOpenURL(lastFile, "*", this, i18n("Load Levels From File"));
|
|
|
|
if (result.isEmpty()) return;
|
|
|
|
|
|
|
|
openURL(result);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
MainWindow::openURL(KURL _url) {
|
|
|
|
KConfig *cfg=(KApplication::kApplication())->config();
|
|
|
|
|
|
|
|
// int namepos = _url.path().findRev('/') + 1; // NOTE: findRev can return -1
|
|
|
|
// TQString levelName = _url.path().mid(namepos);
|
|
|
|
TQString levelName = _url.fileName();
|
|
|
|
|
|
|
|
TQString levelFile;
|
|
|
|
if (_url.isLocalFile()) {
|
|
|
|
levelFile = _url.path();
|
|
|
|
} else {
|
|
|
|
// levelFile = locateLocal("appdata", "levels/" + levelName);
|
|
|
|
if(!KIO::NetAccess::download( _url, levelFile ) )
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
LevelCollection *tmpCollection = new LevelCollection(levelFile, levelName);
|
|
|
|
KIO::NetAccess::removeTempFile(levelFile );
|
|
|
|
|
|
|
|
if (tmpCollection->noOfLevels() < 1) {
|
|
|
|
KMessageBox::sorry(this, i18n("No levels found in file"));
|
|
|
|
delete tmpCollection;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (_url.isLocalFile()) {
|
|
|
|
cfg->setGroup("settings");
|
|
|
|
cfg->writePathEntry("lastLevelFile", _url.path());
|
|
|
|
}
|
|
|
|
|
|
|
|
delete externalCollection_;
|
|
|
|
externalCollection_ = tmpCollection;
|
|
|
|
|
|
|
|
collection_->setItemChecked(checkedCollection_, false);
|
|
|
|
playField_->changeCollection(externalCollection_);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
MainWindow::dragEnterEvent(TQDragEnterEvent* event) {
|
|
|
|
event->accept(KURLDrag::canDecode(event));
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
MainWindow::dropEvent(TQDropEvent* event) {
|
|
|
|
KURL::List urls;
|
|
|
|
if (KURLDrag::decode(event, urls)) {
|
|
|
|
// kdDebug() << "MainWindow:Handling TQUriDrag..." << endl;
|
|
|
|
if (urls.count() > 0) {
|
|
|
|
const KURL &url = urls.first();
|
|
|
|
openURL(url);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|