1 /*
2     SPDX-FileCopyrightText: 2007 Paolo Capriotti <p.capriotti@gmail.com>
3 
4     SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #include "mainwindow.h"
8 
9 #include <QLayout>
10 #include <QLabel>
11 #include <QGraphicsView>
12 #include <QPointer>
13 
14 #include <QAction>
15 #include <KActionCollection>
16 #include <KgDifficulty>
17 #include <KScoreDialog>
18 #include <KStandardGameAction>
19 #include <QStatusBar>
20 #include <KToggleAction>
21 
22 #include "mainarea.h"
23 #include "kollisionconfig.h"
24 
MainWindow()25 MainWindow::MainWindow()
26 {
27     m_main = new MainArea();
28     QGraphicsView* view = new QGraphicsView(m_main, this);
29     view->setOptimizationFlags(
30                                 QGraphicsView::DontSavePainterState |
31                                 QGraphicsView::DontAdjustForAntialiasing );
32 //    view->setViewportUpdateMode( QGraphicsView::FullViewportUpdate );
33     view->setCacheMode( QGraphicsView::CacheBackground );
34     view->setFrameStyle(QFrame::NoFrame);
35 
36     setCentralWidget(view);
37 
38     Kg::difficulty()->addStandardLevelRange(
39         KgDifficultyLevel::Easy, KgDifficultyLevel::Hard,
40         KgDifficultyLevel::Hard //default
41     );
42     KgDifficultyGUI::init(this);
43     connect(Kg::difficulty(), &KgDifficulty::currentLevelChanged, m_main, &MainArea::abort);
44 
45     setupActions();
46 
47     QLayout* l = layout();
48     Q_ASSERT(l);
49     l->setSizeConstraint(QLayout::SetFixedSize);
50 
51     // setup status bar
52     QStatusBar* bar = statusBar();
53     Q_ASSERT(bar);
54     m_time_label = new QLabel;
55     bar->addPermanentWidget(m_time_label);
56 
57     m_balls_label = new QLabel;
58     bar->addWidget(m_balls_label);
59 //     bar->setItemAlignment(STATUSBAR_BALLS, Qt::AlignLeft);
60 
61     connect(m_main, &MainArea::changeGameTime, this, &MainWindow::setGameTime);
62     connect(m_main, &MainArea::changeBallNumber, this, &MainWindow::setBallNumber);
63     connect(m_main, &MainArea::changeState, this, &MainWindow::changeState);
64     connect(m_main, &MainArea::pause, this, &MainWindow::pause);
65 
66     stateChanged(QStringLiteral("playing"), KXMLGUIClient::StateReverse);
67     connect(m_main, &MainArea::starting, this, &MainWindow::newGame);
68     connect(m_main, &MainArea::gameOver, this, &MainWindow::gameOver);
69 }
70 
~MainWindow()71 MainWindow::~MainWindow()
72 {
73     delete m_main;
74 }
75 
setupActions()76 void MainWindow::setupActions()
77 {
78     // Game
79     QAction * abort = actionCollection()->addAction( QStringLiteral( "game_abort" ));
80     abort->setText(i18n("End game"));
81     connect(abort, &QAction::triggered, m_main, &MainArea::abort);
82 
83     QAction * pause = KStandardGameAction::pause(m_main, &MainArea::togglePause, actionCollection());
84     m_main->setPauseAction(pause);
85     KStandardGameAction::highscores(this, &MainWindow::highscores, actionCollection());
86     KStandardGameAction::quit(this, &QWidget::close, actionCollection());
87 
88     QAction * ballSize = new KToggleAction(i18n("&Increase Ball Size"), this);
89     ballSize->setChecked(KollisionConfig::increaseBallSize());
90     actionCollection()->addAction( QStringLiteral( "increase_ball_size" ), ballSize);
91     connect(ballSize, &QAction::triggered, m_main, &MainArea::increaseBallSize);
92 
93     QAction * action;
94     action = new KToggleAction(i18n("&Play Sounds"), this);
95     action->setChecked(KollisionConfig::enableSounds());
96     actionCollection()->addAction( QStringLiteral( "options_sounds" ), action);
97     connect(action, &QAction::triggered, m_main, &MainArea::enableSounds);
98 
99     setupGUI(Create | Save | Keys | StatusBar);
100 }
101 
newGame()102 void MainWindow::newGame()
103 {
104     stateChanged(QStringLiteral("playing"));
105     m_lastUsedDifficulty = Kg::difficulty()->currentLevel();
106 }
107 
gameOver(int time)108 void MainWindow::gameOver(int time)
109 {
110     stateChanged(QStringLiteral("playing"), KXMLGUIClient::StateReverse);
111 
112     QPointer<KScoreDialog> ksdialog = new KScoreDialog(KScoreDialog::Name, this);
113     ksdialog->initFromDifficulty(Kg::difficulty(), /*setConfigGroup=*/ false);
114     ksdialog->setConfigGroup(qMakePair(
115         m_lastUsedDifficulty->key(),
116         m_lastUsedDifficulty->title()
117     ));
118     KScoreDialog::FieldInfo scoreInfo;
119     scoreInfo[KScoreDialog::Score].setNum(time);
120     if (ksdialog->addScore(scoreInfo, KScoreDialog::AskName)) {
121         ksdialog->exec();
122     }
123     delete ksdialog;
124 }
125 
highscores()126 void MainWindow::highscores()
127 {
128     KScoreDialog ksdialog(KScoreDialog::Name | KScoreDialog::Time, this);
129     ksdialog.initFromDifficulty(Kg::difficulty());
130     ksdialog.exec();
131 }
132 
setBallNumber(int number)133 void MainWindow::setBallNumber(int number)
134 {
135     m_balls_label->setText(i18n("Balls: %1", number));
136 }
137 
setGameTime(int time)138 void MainWindow::setGameTime(int time)
139 {
140     m_time_label->setText(i18np("Time: %1 second", "Time: %1 seconds", time));
141 }
142 
changeState(bool running)143 void MainWindow::changeState(bool running) {
144     showCursor(!running);
145     Kg::difficulty()->setGameRunning(running);
146 }
147 
pause(bool p)148 void MainWindow::pause(bool p)
149 {
150     showCursor(p);
151 }
152 
showCursor(bool show)153 void MainWindow::showCursor(bool show)
154 {
155     if (show) {
156         centralWidget()->setCursor(QCursor());
157     }
158     else {
159         centralWidget()->setCursor(Qt::BlankCursor);
160     }
161 }
162 
163 
164