Collecting basic statistics from won games
[impuzzle] / src / mainwindow.cpp
index e95883f..e2dbc09 100644 (file)
 
 #include "mainwindow.h"
 #include "gameview.h"
+#include "settings.h"
+#include "settingsdialog.h"
+#include "aboutdialog.h"
+#include "puzzleitem.h"
+#include "statistics.h"
+#include "statisticsdialog.h"
 
 #include <QAction>
 #include <QMenu>
 #include <QMenuBar>
+#include <QMessageBox>
+#include <QCloseEvent>
+
+#include <QDebug>
 
 #include "imageimporter.h"
 
+MainWindow *MainWindow::instance_ = 0;
+
 MainWindow::MainWindow(QWidget *parent) :
         QMainWindow(parent)
 {
@@ -32,13 +44,33 @@ MainWindow::MainWindow(QWidget *parent) :
     createMenu();
 
     setCentralWidget(GameView::instance());
+    settingsDialog_ = new SettingsDialog(this);
+
+    setWindowTitle(tr("ImPuzzle"));
+
+    connect(GameView::instance(), SIGNAL(gameWon()), this, SLOT(gameEnded()));
+    connect(GameView::instance(), SIGNAL(gameRestored()), this, SLOT(enableSaving()));
+}
+
+MainWindow *MainWindow::instance()
+{
+    if(!instance_) {
+        instance_ = new MainWindow;
+    }
+
+    return instance_;
 }
 
 void MainWindow::createMenu()
 {
-    menu_ = menuBar()->addMenu("");
+    menu_ = menuBar()->addMenu("&Game");
     menu_->addAction(newGameAction_);
+    menu_->addAction(statisticsAction_);
+    menu_->addAction(saveAction_);
     menu_->addAction(importAction_);
+
+    helpMenu_ = menuBar()->addMenu("&Help");
+    helpMenu_->addAction(aboutAction_);
 }
 
 void MainWindow::createActions()
@@ -49,6 +81,16 @@ void MainWindow::createActions()
     importAction_ = new QAction(tr("Import image"), this);
     connect(importAction_, SIGNAL(triggered()), this, SLOT(importClicked()));
     importAction_->setDisabled(true);
+
+    aboutAction_ = new QAction(tr("About ImPuzzle"), this);
+    connect(aboutAction_, SIGNAL(triggered()), this, SLOT(aboutClicked()));
+
+    saveAction_ = new QAction(tr("Save and quit"), this);
+    connect(saveAction_, SIGNAL(triggered()), GameView::instance(), SLOT(saveGame()));
+    saveAction_->setDisabled(true);
+
+    statisticsAction_ = new QAction(tr("Statistics"), this);
+    connect(statisticsAction_, SIGNAL(triggered()), this, SLOT(showStatistics()));
 }
 
 void MainWindow::importClicked()
@@ -58,5 +100,57 @@ void MainWindow::importClicked()
 
 void MainWindow::newGameClicked()
 {
-    GameView::instance()->setPieces(ImageImporter::instance()->newPieces(0, 20));
+    int r = settingsDialog_->exec();
+
+    if(r) {
+        GameView::instance()->setPieces(ImageImporter::instance()->newPieces(Settings::instance()->image(), Settings::instance()->pieceCount()));
+        enableSaving();
+        PuzzleItem::setMoveCount(0);
+    }
+}
+
+void MainWindow::aboutClicked()
+{
+    AboutDialog *dialog = new AboutDialog(this);
+    dialog->exec();
+    dialog->deleteLater();
+}
+
+void MainWindow::gameEnded()
+{
+    if(saveAction_->isEnabled()) {
+        saveAction_->setDisabled(true);
+        Statistics::instance()->increaseGameCount(Settings::instance()->pieceCount() == EASY_PIECE_COUNT ? Statistics::easyDifficulty : Statistics::hardDifficulty);
+        Statistics::instance()->addNewScore(PuzzleItem::moveCount(),
+                                            Settings::instance()->pieceCount() == EASY_PIECE_COUNT ? Statistics::easyDifficulty : Statistics::hardDifficulty);
+        PuzzleItem::resetMoveCount();
+    }
+}
+
+void MainWindow::enableSaving()
+{
+    if(!saveAction_->isEnabled()) {
+        saveAction_->setEnabled(true);
+    }
+}
+
+void MainWindow::closeEvent(QCloseEvent *event)
+{
+    if(saveAction_->isEnabled()) {
+        int answer = QMessageBox::question(this, tr("Save game status?"),
+                                           tr("Saved status will be automatically loaded when you start the application next time"),
+                                           QMessageBox::Yes, QMessageBox::No);
+
+        if(answer == QMessageBox::Yes) {
+            GameView::instance()->saveGame();
+        }
+    }
+
+    event->accept();
+}
+
+void MainWindow::showStatistics()
+{
+    StatisticsDialog dialog(this);
+    dialog.exec();
 }