File indexing completed on 2024-04-21 04:02:39

0001 /*
0002     SPDX-FileCopyrightText: 2007 Dmitry Suzdalev <dimsuz@gmail.com>
0003     SPDX-FileCopyrightText: 2010 Brian Croom <brian.s.croom@gmail.com>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "scene.h"
0009 
0010 // own
0011 #include "settings.h"
0012 #include "minefielditem.h"
0013 // KDEGames
0014 #include <KGamePopupItem>
0015 #include <KGameThemeProvider>
0016 // KF
0017 #include <KLocalizedString>
0018 // Qt
0019 #include <QResizeEvent>
0020 
0021 // --------------- KMinesView ---------------
0022 
0023 KMinesView::KMinesView( KMinesScene* scene, QWidget *parent )
0024     : QGraphicsView(scene, parent), m_scene(scene)
0025 {
0026 }
0027 
0028 void KMinesView::resizeEvent( QResizeEvent *ev )
0029 {
0030     m_scene->resizeScene( ev->size().width(), ev->size().height() );
0031 }
0032 
0033 // -------------- KMinesScene --------------------
0034 
0035 static KGameThemeProvider* provider()
0036 {
0037     auto* prov = new KGameThemeProvider;
0038     prov->discoverThemes(QStringLiteral("themes"));
0039 
0040     return prov;
0041 }
0042 
0043 KMinesScene::KMinesScene( QObject* parent )
0044     : QGraphicsScene(parent), m_renderer(provider())
0045 {
0046     setItemIndexMethod( NoIndex );
0047     m_fieldItem = new MineFieldItem(&m_renderer);
0048     connect(m_fieldItem, &MineFieldItem::flaggedMinesCountChanged, this, &KMinesScene::minesCountChanged);
0049     connect(m_fieldItem, &MineFieldItem::firstClickDone, this, &KMinesScene::firstClickDone);
0050     connect(m_fieldItem, &MineFieldItem::gameOver, this, &KMinesScene::onGameOver);
0051     // and re-emit it for others
0052     connect(m_fieldItem, &MineFieldItem::gameOver, this, &KMinesScene::gameOver);
0053     addItem(m_fieldItem);
0054 
0055     m_messageItem = new KGamePopupItem;
0056     m_messageItem->setMessageOpacity(0.9);
0057     m_messageItem->setMessageTimeout(4000);
0058     addItem(m_messageItem);
0059     
0060     m_gamePausedMessageItem = new KGamePopupItem;
0061     m_gamePausedMessageItem->setMessageOpacity(0.9);
0062     m_gamePausedMessageItem->setMessageTimeout(0);
0063     m_gamePausedMessageItem->setHideOnMouseClick(false);
0064     addItem(m_gamePausedMessageItem);
0065     
0066     setBackgroundBrush(m_renderer.spritePixmap(QStringLiteral( "mainWidget" ), sceneRect().size().toSize()));
0067 }
0068 
0069 void KMinesScene::reset()
0070 {
0071     m_fieldItem->resetMines();
0072     m_messageItem->forceHide();
0073 }
0074 
0075 bool KMinesScene::canScore() const
0076 {
0077     return m_canScore;
0078 }
0079 
0080 void KMinesScene::setCanScore(bool value)
0081 {
0082     m_canScore = value;
0083 }
0084 
0085 void KMinesScene::resizeScene(int width, int height)
0086 {
0087     setSceneRect(0, 0, width, height);
0088     setBackgroundBrush(m_renderer.spritePixmap(QStringLiteral( "mainWidget" ), sceneRect().size().toSize()));
0089     m_fieldItem->resizeToFitInRect( sceneRect() );
0090     m_fieldItem->setPos( sceneRect().width()/2 - m_fieldItem->boundingRect().width()/2,
0091                          sceneRect().height()/2 - m_fieldItem->boundingRect().height()/2 );
0092     m_gamePausedMessageItem->setPos( sceneRect().width()/2 - m_gamePausedMessageItem->boundingRect().width()/2,
0093                           sceneRect().height()/2 - m_gamePausedMessageItem->boundingRect().height()/2 );
0094     m_messageItem->setPos( sceneRect().width()/2 - m_messageItem->boundingRect().width()/2,
0095                           sceneRect().height()/2 - m_messageItem->boundingRect().height()/2 );
0096 }
0097 
0098 void KMinesScene::startNewGame(int rows, int cols, int numMines)
0099 {
0100     // hide message if any
0101     m_messageItem->forceHide();
0102 
0103     m_fieldItem->initField(rows, cols, numMines);
0104     // reposition items
0105     resizeScene((int)sceneRect().width(), (int)sceneRect().height());
0106 }
0107 
0108 int KMinesScene::totalMines() const
0109 {
0110     return m_fieldItem->minesCount();
0111 }
0112 
0113 void KMinesScene::setGamePaused(bool paused)
0114 {
0115     m_fieldItem->setVisible(!paused);
0116     if(paused)
0117         m_gamePausedMessageItem->showMessage(i18n("Game is paused."), KGamePopupItem::Center);
0118     else
0119         m_gamePausedMessageItem->forceHide();
0120 }
0121 
0122 void KMinesScene::onGameOver(bool won)
0123 {
0124     if(won)
0125         m_messageItem->showMessage(i18n("Congratulations! You have won!"), KGamePopupItem::Center);
0126     else
0127         m_messageItem->showMessage(i18n("You have lost."), KGamePopupItem::Center);
0128 }
0129 
0130 #include "moc_scene.cpp"