diff options
Diffstat (limited to 'kmines/main.cpp')
-rw-r--r-- | kmines/main.cpp | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/kmines/main.cpp b/kmines/main.cpp new file mode 100644 index 00000000..52620887 --- /dev/null +++ b/kmines/main.cpp @@ -0,0 +1,260 @@ +/* + * Copyright (c) 1996-2004 Nicolas HADACEK (hadacek@kde.org) + * + * 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 "main.h" +#include "main.moc" + +#include <qptrvector.h> + +#include <kaccel.h> +#include <kapplication.h> +#include <klocale.h> +#include <kcmdlineargs.h> +#include <kaboutdata.h> +#include <kstdaction.h> +#include <kkeydialog.h> +#include <kstdgameaction.h> +#include <kaction.h> +#include <kdebug.h> +#include <knotifyclient.h> +#include <knotifydialog.h> +#include <khighscore.h> +#include <kconfigdialog.h> + +#include "settings.h" +#include "status.h" +#include "highscores.h" +#include "version.h" +#include "dialogs.h" + +const MainWidget::KeyData MainWidget::KEY_DATA[NB_KEYS] = { +{I18N_NOOP("Move Up"), "keyboard_moveup", Key_Up, SLOT(moveUp())}, +{I18N_NOOP("Move Down"), "keyboard_movedown", Key_Down, SLOT(moveDown())}, +{I18N_NOOP("Move Right"), "keyboard_moveright", Key_Right, SLOT(moveRight())}, +{I18N_NOOP("Move Left"), "keyboard_moveleft", Key_Left, SLOT(moveLeft())}, +{I18N_NOOP("Move at Left Edge"), "keyboard_leftedge", Key_Home, SLOT(moveLeftEdge())}, +{I18N_NOOP("Move at Right Edge"), "keyboard_rightedge", Key_End, SLOT(moveRightEdge())}, +{I18N_NOOP("Move at Top Edge"), "keyboard_topedge", Key_PageUp, SLOT(moveTop())}, +{I18N_NOOP("Move at Bottom Edge"), "keyboard_bottomedge", Key_PageDown, SLOT(moveBottom())}, +{I18N_NOOP("Reveal Mine"), "keyboard_revealmine", Key_Space, SLOT(reveal())}, +{I18N_NOOP("Mark Mine"), "keyboard_markmine", Key_W, SLOT(mark())}, +{I18N_NOOP("Automatic Reveal"), "keyboard_autoreveal", Key_Return, SLOT(autoReveal())} +}; + + +MainWidget::MainWidget() + : KZoomMainWindow(4, 100, 1, "kmines") +{ + KNotifyClient::startDaemon(); + + _status = new Status(this); + connect(_status, SIGNAL(gameStateChangedSignal(KMines::GameState)), + SLOT(gameStateChanged(KMines::GameState))); + connect(_status, SIGNAL(pause()), SLOT(pause())); + + // Game & Popup + KStdGameAction::gameNew(_status, SLOT(restartGame()), actionCollection()); + _pause = KStdGameAction::pause(_status, SLOT(pauseGame()), + actionCollection()); + KStdGameAction::highscores(this, SLOT(showHighscores()), + actionCollection()); + KStdGameAction::quit(qApp, SLOT(quit()), actionCollection()); + + // keyboard + _keybCollection = new KActionCollection(this); + for (uint i=0; i<NB_KEYS; i++) { + const KeyData &d = KEY_DATA[i]; + (void)new KAction(i18n(d.label), d.keycode, _status, + d.slot, _keybCollection, d.name); + } + + // Settings + KStdAction::preferences(this, SLOT(configureSettings()), + actionCollection()); + KStdAction::keyBindings(this, SLOT(configureKeys()), actionCollection()); + KStdAction::configureNotifications(this, SLOT(configureNotifications()), + actionCollection()); + KStdGameAction::configureHighscores(this, SLOT(configureHighscores()), + actionCollection()); + // Levels + _levels = KStdGameAction::chooseGameType(0, 0, actionCollection()); + QStringList list; + for (uint i=0; i<=Level::NB_TYPES; i++) + list += i18n(Level::LABELS[i]); + _levels->setItems(list); + connect(_levels, SIGNAL(activated(int)), _status, SLOT(newGame(int))); + + // Adviser + _advise = + KStdGameAction::hint(_status, SLOT(advise()), actionCollection()); + _solve = KStdGameAction::solve(_status, SLOT(solve()), actionCollection()); + (void)new KAction(i18n("Solving Rate..."), 0, _status, SLOT(solveRate()), + actionCollection(), "solve_rate"); + + // Log + (void)new KAction(KGuiItem(i18n("View Log"), "viewmag"), 0, + _status, SLOT(viewLog()), + actionCollection(), "log_view"); + (void)new KAction(KGuiItem(i18n("Replay Log"), "player_play"), + 0, _status, SLOT(replayLog()), + actionCollection(), "log_replay"); + (void)new KAction(KGuiItem(i18n("Save Log..."), "filesave"), 0, + _status, SLOT(saveLog()), + actionCollection(), "log_save"); + (void)new KAction(KGuiItem(i18n("Load Log..."), "fileopen"), 0, + _status, SLOT(loadLog()), + actionCollection(), "log_load"); + + setupGUI( KMainWindow::Save | Create ); + readSettings(); + setCentralWidget(_status); + init("popup"); + addWidget(_status->field()); +} + +bool MainWidget::queryExit() +{ + _status->checkBlackMark(); + return KZoomMainWindow::queryExit(); +} + +void MainWidget::readSettings() +{ + settingsChanged(); + Level::Type type = (Level::Type) Settings::level(); + _levels->setCurrentItem(type); + _status->newGame(type); +} + +void MainWidget::showHighscores() +{ + KExtHighscore::show(this); +} + +void MainWidget::focusOutEvent(QFocusEvent *e) +{ + if ( Settings::pauseFocus() && e->reason()==QFocusEvent::ActiveWindow + && _status->isPlaying() ) pause(); + KMainWindow::focusOutEvent(e); +} + +void MainWidget::configureSettings() +{ + if ( KConfigDialog::showDialog("settings") ) return; + + KConfigDialog *dialog = new KConfigDialog(this, "settings", Settings::self()); + GameConfig *gc = new GameConfig; + dialog->addPage(gc, i18n("Game"), "package_system"); + dialog->addPage(new AppearanceConfig, i18n("Appearance"), "style"); + CustomConfig *cc = new CustomConfig; + dialog->addPage(cc, i18n("Custom Game"), "package_settings"); + connect(dialog, SIGNAL(settingsChanged()), SLOT(settingsChanged())); + dialog->show(); + cc->init(); + gc->init(); +} + +void MainWidget::configureHighscores() +{ + KExtHighscore::configure(this); +} + +void MainWidget::settingsChanged() +{ + bool enabled = Settings::keyboardGame(); + QValueList<KAction *> list = _keybCollection->actions(); + QValueList<KAction *>::Iterator it; + for (it = list.begin(); it!=list.end(); ++it) + (*it)->setEnabled(enabled); + _status->settingsChanged(); +} + +void MainWidget::configureKeys() +{ + KKeyDialog d(true, this); + d.insert(_keybCollection, i18n("Keyboard game")); + d.insert(actionCollection(), i18n("General")); + d.configure(); +} + +void MainWidget::configureNotifications() +{ + KNotifyDialog::configure(this); +} + +void MainWidget::gameStateChanged(KMines::GameState state) +{ + stateChanged(KMines::STATES[state]); + if ( state==Playing ) setFocus(); +} + +void MainWidget::pause() +{ + _pause->activate(); +} + +void MainWidget::writeZoomSetting(uint zoom) +{ + Settings::setCaseSize(zoom); + Settings::writeConfig(); +} + +uint MainWidget::readZoomSetting() const +{ + return Settings::caseSize(); +} + +void MainWidget::writeMenubarVisibleSetting(bool visible) +{ + Settings::setMenubarVisible(visible); + Settings::writeConfig(); +} + +bool MainWidget::menubarVisibleSetting() const +{ + return Settings::menubarVisible(); +} + +//---------------------------------------------------------------------------- +static const char *DESCRIPTION + = I18N_NOOP("KMines is a classic mine sweeper game"); + +int main(int argc, char **argv) +{ + KHighscore::init("kmines"); + + KAboutData aboutData("kmines", I18N_NOOP("KMines"), LONG_VERSION, + DESCRIPTION, KAboutData::License_GPL, + COPYLEFT, 0, HOMEPAGE); + aboutData.addAuthor("Nicolas Hadacek", 0, EMAIL); + aboutData.addCredit("Andreas Zehender", I18N_NOOP("Smiley pixmaps")); + aboutData.addCredit("Mikhail Kourinny", I18N_NOOP("Solver/Adviser")); + aboutData.addCredit("Thomas Capricelli", I18N_NOOP("Magic reveal mode")); + KCmdLineArgs::init(argc, argv, &aboutData); + + KApplication a; + KGlobal::locale()->insertCatalogue("libkdegames"); + KExtHighscore::ExtManager manager; + + if ( a.isRestored() ) RESTORE(MainWidget) + else { + MainWidget *mw = new MainWidget; + mw->show(); + } + return a.exec(); +} |