/*************************************************************************** * Copyright (C) 2008 by Oliver Groß * * z.o.gross@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., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include "constants.h" #include "cgamewindow.h" #include "ccrossfieldwidget.h" #include "cnewgamedialog.h" #include "chighscore.h" namespace qcross { using namespace libqnono; //public CGameWindow::CGameWindow(QWidget * parent) : QMainWindow(parent) { m_Field = new CCrossFieldWidget(this); m_Nonogram = m_Field->nonogram(); setCentralWidget(m_Field); m_Field->showMessage(tr("Welcome to QCross!")); createActions(); connect(m_Nonogram, SIGNAL(won(int)), this, SLOT(wonGame(int))); connect(m_Nonogram, SIGNAL(timeup()), this, SLOT(lostGame())); connect(m_Nonogram, SIGNAL(loaded()), SLOT(updateStates())); connect(m_Nonogram, SIGNAL(restarted()), SLOT(updateStates())); connect(m_Nonogram, SIGNAL(paused(int)), SLOT(updateStates())); connect(m_Nonogram, SIGNAL(resumed(int)), SLOT(updateStates())); } CGameWindow::~CGameWindow() { } //protected void CGameWindow::createActions() { QToolBar * currentToolBar; QMenu * currentMenu; //Game currentMenu = menuBar()->addMenu(tr("&Game")); currentMenu->addAction(tr("&New..."), this, SLOT(newGame()), Qt::CTRL + Qt::Key_N); currentMenu->addSeparator(); m_SaveGameAction = currentMenu->addAction(tr("&Save..."), this, SLOT(saveGame()), Qt::CTRL + Qt::Key_N); m_SaveGameAction->setEnabled(false); currentMenu->addAction(tr("&Load..."), this, SLOT(loadGame()), Qt::CTRL + Qt::Key_N); currentMenu->addSeparator(); m_RestartGameAction = currentMenu->addAction(tr("&Restart"), m_Nonogram, SLOT(restart()), Qt::CTRL + Qt::Key_R); m_RestartGameAction->setEnabled(false); m_PauseGameAction = currentMenu->addAction(tr("&Pause")); m_PauseGameAction->setEnabled(false); m_PauseGameAction->setCheckable(true); m_PauseGameAction->setShortcut(Qt::CTRL + Qt::Key_P); connect(m_PauseGameAction, SIGNAL(toggled(bool)), this, SLOT(pauseGame(bool))); currentMenu->addSeparator(); currentMenu->addAction(tr("&Quit"), this, SLOT(close()), Qt::CTRL + Qt::Key_Q); currentMenu->addSeparator(); currentMenu->addAction(tr("debug: solve"), m_Nonogram, SLOT(solve())); currentToolBar = addToolBar(currentMenu->title()); currentToolBar->addActions(currentMenu->actions()); //Help currentMenu = menuBar()->addMenu(tr("&Help")); currentMenu->addAction(tr("&About"), this, SLOT(about())); currentMenu->addAction(tr("About &Qt"), qApp, SLOT(aboutQt())); } void CGameWindow::newGame() { bool notPaused = !m_Nonogram->isPaused(); if (notPaused) m_Nonogram->pause(); CNewGameDialog dialog; if (dialog.exec() == QDialog::Accepted) { m_Nonogram->start(dialog.getProblem()); return; } if (notPaused) m_Nonogram->resume(); } void CGameWindow::saveGame() { bool notPaused = !m_Nonogram->isPaused(); if (notPaused) m_Nonogram->pause(); QString fileName = QFileDialog::getSaveFileName(this, tr("Save current game"), QDir::homePath(), tr("QCross Saved games (*.csg)")); m_Nonogram->saveGame(fileName); if (notPaused) m_Nonogram->resume(); } void CGameWindow::loadGame() { bool notPaused = !m_Nonogram->isPaused(); if (notPaused) m_Nonogram->pause(); QString fileName = QFileDialog::getOpenFileName(this, tr("Open saved game"), QDir::homePath(), tr("QCross Saved games (*.csg)")); if (m_Nonogram->loadGame(fileName)) { return; } if (notPaused) m_Nonogram->resume(); } void CGameWindow::pauseGame(bool value) { if (value == m_Nonogram->isPaused()) return; if (value) { m_Nonogram->pause(); } else { m_Nonogram->resume(); } } void CGameWindow::wonGame(int score) { m_PauseGameAction->setEnabled(false); if (score < 0) return; const NonogramProblem &problem(m_Nonogram->problem()); if (!problem.packageIdentifier().isEmpty() && problem.packageIndex() >= 0) { CHighscore highscore; highscore.setPackageIdentifier(problem.packageIdentifier()); if (highscore.open()) { int oldScore = highscore[problem.packageIndex()]; if (0 == oldScore || (problem.timeout() > 0 ? score > oldScore : score < oldScore)) { qDebug("attempting to save highscore"); highscore[problem.packageIndex()] = score; highscore.save(); } } } } void CGameWindow::lostGame() { m_PauseGameAction->setEnabled(false); } void CGameWindow::about() { QMessageBox::about(this, tr("About"), tr("This is a still unfancy gui for solving nonograms.")); } void CGameWindow::updateStates() { bool valid = m_Nonogram->valid(); m_SaveGameAction->setEnabled(valid); m_PauseGameAction->setEnabled(valid); m_RestartGameAction->setEnabled(valid); m_PauseGameAction->setChecked(m_Nonogram->isPaused()); } }