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"