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