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"