00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "mainwindow.h"
00021
00022 #include <core/debughelper.h>
00023 #include <engine/game.h>
00024 #include <engine/gameproject.h>
00025 #include <engine/scene.h>
00026 #include <graphics/renderwidget.h>
00027 #include <player/models/gamesmodel.h>
00028
00029 #include <QtGui/QFileDialog>
00030 #include <QtGui/QStatusBar>
00031 #include <QtGui/QApplication>
00032 #include <QtGui/QListView>
00033 #include <QtGui/QVBoxLayout>
00034 #include <QtGui/QPushButton>
00035 #include <QLabel>
00036 #include <QTimer>
00037
00038 using namespace GluonPlayer;
00039
00040 class MainWindow::MainWindowPrivate
00041 {
00042 public:
00043 GluonEngine::GameProject* project;
00044 GluonGraphics::RenderWidget* widget;
00045
00046 QAbstractItemModel* model;
00047
00048 QString title;
00049 QString fileName;
00050
00051 int msecElapsed;
00052 int frameCount;
00053 };
00054
00055 GluonPlayer::MainWindow::MainWindow( int argc, char** argv, QWidget* parent, Qt::WindowFlags flags )
00056 : QMainWindow( parent, flags )
00057 , d( new MainWindowPrivate )
00058 {
00059 d->msecElapsed = 0;
00060 d->frameCount = 0;
00061
00062 if( argc > 1 )
00063 {
00064 d->fileName = argv[1];
00065 QTimer::singleShot( 0, this, SLOT( openProject() ) );
00066 }
00067 else
00068 {
00069 QWidget* base = new QWidget( this );
00070 QVBoxLayout* layout = new QVBoxLayout();
00071 base->setLayout( layout );
00072 setCentralWidget( base );
00073
00074 QLabel* header = new QLabel( tr( "Please select a Project" ), base );
00075 header->setAlignment( Qt::AlignCenter );
00076 QFont font;
00077 font.setBold( true );
00078 header->setFont( font );
00079 layout->addWidget( header );
00080
00081 QListView* view = new QListView( base );
00082 layout->addWidget( view );
00083 d->model = new GamesModel( view );
00084 view->setModel( d->model );
00085 connect( view, SIGNAL( activated( QModelIndex ) ), SLOT( activated( QModelIndex ) ) );
00086
00087 QPushButton* button = new QPushButton( tr( "Open other project..." ), base );
00088 layout->addWidget( button );
00089 connect( button, SIGNAL( clicked( bool ) ), SLOT( openClicked( bool ) ) );
00090 }
00091 resize( 500, 500 );
00092 }
00093
00094 void MainWindow::activated( QModelIndex index )
00095 {
00096 if( index.isValid() )
00097 {
00098 openProject( d->model->data( index ).toString() );
00099 }
00100 }
00101
00102 void MainWindow::openClicked( bool toggled )
00103 {
00104 Q_UNUSED( toggled )
00105
00106 QString fileName = QFileDialog::getOpenFileName( this, tr( "Select a Project" ), QString(), QString( "*.gluon|Gluon Project Files" ) );
00107 if( !fileName.isEmpty() )
00108 openProject( fileName );
00109 }
00110
00111 void MainWindow::openProject( const QString& fileName )
00112 {
00113 QString file = fileName;
00114 if( file.isEmpty() )
00115 file = d->fileName;
00116
00117 d->widget = new GluonGraphics::RenderWidget( this );
00118 setCentralWidget( d->widget );
00119 connect( GluonEngine::Game::instance(), SIGNAL( painted( int ) ), d->widget, SLOT( updateGL() ) );
00120 connect( GluonEngine::Game::instance(), SIGNAL( painted( int ) ), SLOT( countFrames( int ) ) );
00121 connect( GluonEngine::Game::instance(), SIGNAL( updated( int ) ), SLOT( updateTitle( int ) ) );
00122
00123 QTimer::singleShot( 100, this, SLOT( startGame() ) );
00124
00125 d->fileName = file;
00126 }
00127
00128 void MainWindow::startGame()
00129 {
00130 GluonCore::GluonObjectFactory::instance()->loadPlugins();
00131
00132 d->project = new GluonEngine::GameProject();
00133 d->project->loadFromFile( QUrl( d->fileName ) );
00134
00135 setWindowFilePath( d->fileName );
00136 d->title = windowTitle();
00137
00138 GluonEngine::Game::instance()->setGameProject( d->project );
00139 GluonEngine::Game::instance()->setCurrentScene( d->project->entryPoint() );
00140
00141 GluonEngine::Game::instance()->runGame();
00142 }
00143
00144 void MainWindow::closeEvent( QCloseEvent* event )
00145 {
00146 GluonEngine::Game::instance()->stopGame();
00147 QWidget::closeEvent( event );
00148 }
00149
00150 void MainWindow::updateTitle( int msec )
00151 {
00152 d->msecElapsed += msec;
00153
00154 static int fps = 0;
00155 if( d->msecElapsed > 1000 )
00156 {
00157 fps = d->frameCount;
00158 d->frameCount = 0;
00159 d->msecElapsed = 0;
00160 }
00161
00162 setWindowTitle( d->title + QString( " (%1 FPS)" ).arg( fps ) );
00163 }
00164
00165 void MainWindow::countFrames( int time )
00166 {
00167 Q_UNUSED( time )
00168 d->frameCount++;
00169 }
00170
00171 #include "mainwindow.moc"