File indexing completed on 2024-04-21 04:03:42

0001 /*
0002     SPDX-FileCopyrightText: 2007 Paolo Capriotti <p.capriotti@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "mainwindow.h"
0008 
0009 #include <QLayout>
0010 #include <QLabel>
0011 #include <QGraphicsView>
0012 #include <QPointer>
0013 #include <QStatusBar>
0014 #include <QAction>
0015 
0016 #include <KActionCollection>
0017 #include <KToggleAction>
0018 
0019 #include <KGameDifficulty>
0020 #include <KGameHighScoreDialog>
0021 #include <KGameStandardAction>
0022 
0023 #include "mainarea.h"
0024 #include "kollisionconfig.h"
0025 
0026 MainWindow::MainWindow()
0027 {
0028     m_main = new MainArea();
0029     QGraphicsView* view = new QGraphicsView(m_main, this);
0030     view->setOptimizationFlags( 
0031                                 QGraphicsView::DontSavePainterState |
0032                                 QGraphicsView::DontAdjustForAntialiasing );
0033 //    view->setViewportUpdateMode( QGraphicsView::FullViewportUpdate );
0034     view->setCacheMode( QGraphicsView::CacheBackground );
0035     view->setFrameStyle(QFrame::NoFrame);
0036 
0037     setCentralWidget(view);
0038 
0039     KGameDifficulty::global()->addStandardLevelRange(
0040         KGameDifficultyLevel::Easy, KGameDifficultyLevel::Hard,
0041         KGameDifficultyLevel::Hard //default
0042     );
0043     KGameDifficultyGUI::init(this);
0044     connect(KGameDifficulty::global(), &KGameDifficulty::currentLevelChanged, m_main, &MainArea::abort);
0045 
0046     setupActions();
0047 
0048     QLayout* l = layout();
0049     Q_ASSERT(l);
0050     l->setSizeConstraint(QLayout::SetFixedSize);
0051 
0052     // setup status bar
0053     QStatusBar* bar = statusBar();
0054     Q_ASSERT(bar);
0055     m_time_label = new QLabel;
0056     bar->addPermanentWidget(m_time_label);
0057 
0058     m_balls_label = new QLabel;
0059     bar->addWidget(m_balls_label);
0060 //     bar->setItemAlignment(STATUSBAR_BALLS, Qt::AlignLeft);
0061 
0062     connect(m_main, &MainArea::changeGameTime, this, &MainWindow::setGameTime);
0063     connect(m_main, &MainArea::changeBallNumber, this, &MainWindow::setBallNumber);
0064     connect(m_main, &MainArea::changeState, this, &MainWindow::changeState);
0065     connect(m_main, &MainArea::pause, this, &MainWindow::pause);
0066 
0067     stateChanged(QStringLiteral("playing"), KXMLGUIClient::StateReverse);
0068     connect(m_main, &MainArea::starting, this, &MainWindow::newGame);
0069     connect(m_main, &MainArea::gameOver, this, &MainWindow::gameOver);
0070 }
0071 
0072 MainWindow::~MainWindow()
0073 {
0074     delete m_main;
0075 }
0076 
0077 void MainWindow::setupActions()
0078 {
0079     // Game
0080     QAction * abort = actionCollection()->addAction( QStringLiteral( "game_abort" ));
0081     abort->setText(i18n("End game"));
0082     connect(abort, &QAction::triggered, m_main, &MainArea::abort);
0083 
0084     QAction * pause = KGameStandardAction::pause(m_main, &MainArea::togglePause, actionCollection());
0085     m_main->setPauseAction(pause);
0086     KGameStandardAction::highscores(this, &MainWindow::highscores, actionCollection());
0087     KGameStandardAction::quit(this, &QWidget::close, actionCollection());
0088 
0089     QAction * ballSize = new KToggleAction(i18n("&Increase Ball Size"), this);
0090     ballSize->setChecked(KollisionConfig::increaseBallSize());
0091     actionCollection()->addAction( QStringLiteral( "increase_ball_size" ), ballSize);
0092     connect(ballSize, &QAction::triggered, m_main, &MainArea::increaseBallSize);
0093 
0094     QAction * action;
0095     action = new KToggleAction(i18n("&Play Sounds"), this);
0096     action->setChecked(KollisionConfig::enableSounds());
0097     actionCollection()->addAction( QStringLiteral( "options_sounds" ), action);
0098     connect(action, &QAction::triggered, m_main, &MainArea::enableSounds);
0099 
0100     setupGUI(Create | Save | Keys | StatusBar);
0101 }
0102 
0103 void MainWindow::newGame()
0104 {
0105     stateChanged(QStringLiteral("playing"));
0106     m_lastUsedDifficulty = KGameDifficulty::global()->currentLevel();
0107 }
0108 
0109 void MainWindow::gameOver(int time)
0110 {
0111     stateChanged(QStringLiteral("playing"), KXMLGUIClient::StateReverse);
0112 
0113     QPointer<KGameHighScoreDialog> ksdialog = new KGameHighScoreDialog(KGameHighScoreDialog::Name, this);
0114     ksdialog->initFromDifficulty(KGameDifficulty::global(), /*setConfigGroup=*/ false);
0115     ksdialog->setConfigGroup(qMakePair(
0116         m_lastUsedDifficulty->key(),
0117         m_lastUsedDifficulty->title()
0118     ));
0119     KGameHighScoreDialog::FieldInfo scoreInfo;
0120     scoreInfo[KGameHighScoreDialog::Score].setNum(time);
0121     if (ksdialog->addScore(scoreInfo, KGameHighScoreDialog::AskName)) {
0122         ksdialog->exec();
0123     }
0124     delete ksdialog;
0125 }
0126 
0127 void MainWindow::highscores()
0128 {
0129     KGameHighScoreDialog ksdialog(KGameHighScoreDialog::Name | KGameHighScoreDialog::Time, this);
0130     ksdialog.initFromDifficulty(KGameDifficulty::global());
0131     ksdialog.exec();
0132 }
0133 
0134 void MainWindow::setBallNumber(int number)
0135 {
0136     m_balls_label->setText(i18n("Balls: %1", number));
0137 }
0138 
0139 void MainWindow::setGameTime(int time)
0140 {
0141     m_time_label->setText(i18np("Time: %1 second", "Time: %1 seconds", time));
0142 }
0143 
0144 void MainWindow::changeState(bool running) {
0145     showCursor(!running);
0146     KGameDifficulty::global()->setGameRunning(running);
0147 }
0148 
0149 void MainWindow::pause(bool p)
0150 {
0151     showCursor(p);
0152 }
0153 
0154 void MainWindow::showCursor(bool show)
0155 {
0156     if (show) {
0157         centralWidget()->setCursor(QCursor());
0158     }
0159     else {
0160         centralWidget()->setCursor(Qt::BlankCursor);
0161     }
0162 }
0163 
0164 #include "moc_mainwindow.cpp"