void MainWindow::onNewGame() { m_needDestroy = false; m_gameConfiguring = true; std::shared_ptr<void> finalizer(nullptr, [&](void*) { m_gameConfiguring = false; }); NewGameDialog dialog; if (dialog.exec() != QDialog::Accepted) return; const GameConfig& config = dialog.gameConfig(); if (!config.isInititialized()) return; auto rival = std::move(dialog.rival()); connect(Kg::difficulty(), SIGNAL(currentLevelChanged(const KgDifficultyLevel*)), rival.get(), SLOT(onDifficultyChanged(const KgDifficultyLevel*))); m_menu.m_undoAction->setEnabled(rival->canUndo()); connect(rival.get(), SIGNAL(needDestroy()), this, SLOT(onNeedDestroy())); m_model = std::unique_ptr<BoardModel>(new BoardModel(config, createStepQueue(config))); connect(m_menu.m_undoAction, SIGNAL(triggered(bool)), m_model.get(), SLOT(undo())); connect(m_model.get(), SIGNAL(statusUpdated(const QString&)), statusBar(), SLOT(showMessage(const QString&))); { std::unique_ptr<IBoardView> view(new BoardView(this)); connect(this, SIGNAL(preferencesUpdated()), view->getObject(), SLOT(update())); setCentralWidget(qobject_cast<QWidget*>(view->getObject())); m_model->setView(std::move(view)); } m_model->setRival(std::move(rival)); m_menu.m_endAction->setEnabled(true); if (m_needDestroy) endGame(); }