summaryrefslogtreecommitdiffstats
path: root/ksokoban/MainWindow.cpp
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commitc90c389a8a8d9d8661e9772ec4144c5cf2039f23 (patch)
tree6d8391395bce9eaea4ad78958617edb20c6a7573 /ksokoban/MainWindow.cpp
downloadtdegames-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 'ksokoban/MainWindow.cpp')
-rw-r--r--ksokoban/MainWindow.cpp364
1 files changed, 364 insertions, 0 deletions
diff --git a/ksokoban/MainWindow.cpp b/ksokoban/MainWindow.cpp
new file mode 100644
index 00000000..63654f1c
--- /dev/null
+++ b/ksokoban/MainWindow.cpp
@@ -0,0 +1,364 @@
+/*
+ * 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 <qpopupmenu.h>
+#include <qkeycode.h>
+#include <assert.h>
+#include <klocale.h>
+#include <qstring.h>
+#include <kfiledialog.h>
+#include <qframe.h>
+#include <kmessagebox.h>
+#include <kstandarddirs.h>
+#include <kio/netaccess.h>
+#include <kiconloader.h>
+#include <qiconset.h>
+#include <qdragobject.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 QPopupMenu(0,"collection menu");
+ collection_->setCheckable(true);
+ //connect(collection_, SIGNAL(activated(int)), playField_, SLOT(changeCollection(int)));
+ connect(collection_, SIGNAL(activated(int)), this, 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;
+ QPixmap pixmap;
+
+ setEraseColor(QColor(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 QPopupMenu(0,"game menu");
+ pixmap = SmallIcon("fileopen");
+ game_->insertItem(QIconSet(pixmap), i18n("&Load Levels..."), this, SLOT(loadLevels()));
+ pixmap = SmallIcon("forward");
+ game_->insertItem(QIconSet(pixmap), i18n("&Next Level"), playField_, SLOT(nextLevel()), Key_N);
+ pixmap = SmallIcon("back");
+ game_->insertItem(QIconSet(pixmap), i18n("&Previous Level"), playField_, SLOT(previousLevel()), Key_P);
+ pixmap = SmallIcon("reload");
+ game_->insertItem(QIconSet(pixmap), i18n("Re&start Level"), playField_, SLOT(restartLevel()), Key_Escape);
+
+ createCollectionMenu();
+ game_->insertItem(i18n("&Level Collection"), collection_);
+
+ pixmap = SmallIcon("undo");
+ game_->insertItem(QIconSet(pixmap), i18n("&Undo"), playField_, SLOT(undo()),QKeySequence( (KStdAccel::undo()).toString()));
+ pixmap = SmallIcon("redo");
+ game_->insertItem(QIconSet(pixmap), i18n("&Redo"), playField_, SLOT(redo()), QKeySequence( (KStdAccel::redo()).toString()));
+ game_->insertSeparator();
+ pixmap = SmallIcon("exit");
+ game_->insertItem(QIconSet(pixmap), i18n("&Quit"), KApplication::kApplication(), SLOT(closeAllWindows()), QKeySequence( (KStdAccel::quit()).toString()));
+ menu_->insertItem(i18n("&Game"), game_);
+
+ animation_ = new QPopupMenu(0,"animation menu");
+ animation_->setCheckable(true);
+ connect(animation_, SIGNAL(activated(int)), this, SLOT(updateAnimMenu(int)));
+ connect(animation_, SIGNAL(activated(int)), playField_, 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 QPopupMenu(0,"bookmarks menu");
+ setBM_ = new QPopupMenu(0, "set bookmark menu");
+ setBM_->insertItem(QIconSet(pixmap), i18n("(unused)"), 1);
+ setBM_->setAccel(CTRL+Key_1, 1);
+ setBM_->insertItem(QIconSet(pixmap), i18n("(unused)"), 2);
+ setBM_->setAccel(CTRL+Key_2, 2);
+ setBM_->insertItem(QIconSet(pixmap), i18n("(unused)"), 3);
+ setBM_->setAccel(CTRL+Key_3, 3);
+ setBM_->insertItem(QIconSet(pixmap), i18n("(unused)"), 4);
+ setBM_->setAccel(CTRL+Key_4, 4);
+ setBM_->insertItem(QIconSet(pixmap), i18n("(unused)"), 5);
+ setBM_->setAccel(CTRL+Key_5, 5);
+ setBM_->insertItem(QIconSet(pixmap), i18n("(unused)"), 6);
+ setBM_->setAccel(CTRL+Key_6, 6);
+ setBM_->insertItem(QIconSet(pixmap), i18n("(unused)"), 7);
+ setBM_->setAccel(CTRL+Key_7, 7);
+ setBM_->insertItem(QIconSet(pixmap), i18n("(unused)"), 8);
+ setBM_->setAccel(CTRL+Key_8, 8);
+ setBM_->insertItem(QIconSet(pixmap), i18n("(unused)"), 9);
+ setBM_->setAccel(CTRL+Key_9, 9);
+ setBM_->insertItem(QIconSet(pixmap), i18n("(unused)"), 10);
+ setBM_->setAccel(CTRL+Key_0, 10);
+ connect(setBM_, SIGNAL(activated(int)), this, SLOT(setBookmark(int)));
+ bookmarkMenu_->insertItem(i18n("&Set Bookmark"), setBM_);
+
+ pixmap = SmallIcon("bookmark");
+ goToBM_ = new QPopupMenu(0, "go to bookmark menu");
+ goToBM_->insertItem(QIconSet(pixmap), i18n("(unused)"), 1);
+ goToBM_->setAccel(Key_1, 1);
+ goToBM_->insertItem(QIconSet(pixmap), i18n("(unused)"), 2);
+ goToBM_->setAccel(Key_2, 2);
+ goToBM_->insertItem(QIconSet(pixmap), i18n("(unused)"), 3);
+ goToBM_->setAccel(Key_3, 3);
+ goToBM_->insertItem(QIconSet(pixmap), i18n("(unused)"), 4);
+ goToBM_->setAccel(Key_4, 4);
+ goToBM_->insertItem(QIconSet(pixmap), i18n("(unused)"), 5);
+ goToBM_->setAccel(Key_5, 5);
+ goToBM_->insertItem(QIconSet(pixmap), i18n("(unused)"), 6);
+ goToBM_->setAccel(Key_6, 6);
+ goToBM_->insertItem(QIconSet(pixmap), i18n("(unused)"), 7);
+ goToBM_->setAccel(Key_7, 7);
+ goToBM_->insertItem(QIconSet(pixmap), i18n("(unused)"), 8);
+ goToBM_->setAccel(Key_8, 8);
+ goToBM_->insertItem(QIconSet(pixmap), i18n("(unused)"), 9);
+ goToBM_->setAccel(Key_9, 9);
+ goToBM_->insertItem(QIconSet(pixmap), i18n("(unused)"), 10);
+ goToBM_->setAccel(Key_0, 10);
+ connect(goToBM_, SIGNAL(activated(int)), this, 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(QString::null, 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(QFocusEvent *) {
+ 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;
+
+ QString name;
+ if (col >= 0 && col < internalCollections_.collections())
+ name = internalCollections_[col]->name();
+ else
+ name = i18n("(invalid)");
+ QString 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");
+ QString 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
+// QString levelName = _url.path().mid(namepos);
+ QString levelName = _url.fileName();
+
+ QString 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(QDragEnterEvent* event) {
+ event->accept(KURLDrag::canDecode(event));
+}
+
+void
+MainWindow::dropEvent(QDropEvent* event) {
+ KURL::List urls;
+ if (KURLDrag::decode(event, urls)) {
+// kdDebug() << "MainWindow:Handling QUriDrag..." << endl;
+ if (urls.count() > 0) {
+ const KURL &url = urls.first();
+ openURL(url);
+ }
+ }
+}