From: slack <slack@codemaniacs.com>
Date: Fri, 13 Mar 2009 02:39:41 +0000 (+0100)
Subject: qtboi is playable :D
X-Git-Url: http://slack.codemaniacs.com/git/?a=commitdiff_plain;h=bc64059b6e32217a5ea2b245314106b3e110585c;p=wenboi.git

qtboi is playable :D
---

diff --git a/qtboi/QtBoiEmuThread.cc b/qtboi/QtBoiEmuThread.cc
index d6a26a7..f4b1a28 100644
--- a/qtboi/QtBoiEmuThread.cc
+++ b/qtboi/QtBoiEmuThread.cc
@@ -64,6 +64,17 @@ void QtBoiEmuThread::loadROM(QString name)
 	romLoaded=true;
 }
 
+
+void QtBoiEmuThread::pressControl(GameBoy::Control c)
+{
+	gb.push_control(c);
+}
+
+void QtBoiEmuThread::releaseControl(GameBoy::Control c)
+{
+	gb.release_control(c);
+}
+
 void QtBoiEmuThread::reset()
 {
 	resetRequested=true;
@@ -95,11 +106,10 @@ void QtBoiEmuThread::step()
 
 void QtBoiEmuThread::run()
 {
-	GameBoy gb;
-	cout << "GB created, emu thread running" << endl;
+	cout << "emu thread running" << endl;
 	
 	// wait until ROM is loaded
-	while(!romLoaded)
+	while(!romLoaded && !quitRequested)
 		msleep(500);
 
 	while(!quitRequested)
@@ -126,6 +136,7 @@ void QtBoiEmuThread::run()
 						{
 							frameCount = gb.video.get_frames_rendered();
 							emit redraw(gb.video.get_screen_buffer());
+							msleep(5);
 						}
 					}
 					break;
diff --git a/qtboi/QtBoiEmuThread.h b/qtboi/QtBoiEmuThread.h
index bb9b854..1088277 100644
--- a/qtboi/QtBoiEmuThread.h
+++ b/qtboi/QtBoiEmuThread.h
@@ -10,6 +10,7 @@ class QtBoiEmuThread: public QThread
   Q_OBJECT
 
   public:
+    GameBoy gb;
     GameBoy::run_status status;
     bool isPaused;
     int frameCount;
@@ -19,6 +20,9 @@ class QtBoiEmuThread: public QThread
 
     void loadROM(QString romName);
  
+    void pressControl(GameBoy::Control);
+    void releaseControl(GameBoy::Control);
+
   public slots:
     void reset();
     void run();
@@ -32,8 +36,9 @@ class QtBoiEmuThread: public QThread
     void redraw(const uchar *buffer);
 
   private:
-    QString romName;
     enum RunningMode { RUN, STEP };
+    
+    QString romName;
     RunningMode runningMode;
     bool quitRequested;
     bool resetRequested;
diff --git a/qtboi/QtBoiMainWindow.cc b/qtboi/QtBoiMainWindow.cc
index 71820da..4f2549f 100644
--- a/qtboi/QtBoiMainWindow.cc
+++ b/qtboi/QtBoiMainWindow.cc
@@ -2,6 +2,7 @@
 
 #include <QMenu>
 #include <QMenuBar>
+#include <QToolBar>
 #include <QString>
 #include <QFileDialog>
 #include <QPushButton>
@@ -22,14 +23,28 @@ QtBoiMainWindow::QtBoiMainWindow(QWidget *parent)
 	screen->setColor(1, qRgb(212,212,212));
 	screen->setColor(0, qRgb(255,255,255));
 
-	createMenu();
-	resize(640,480);
-	centralWindow = new QLabel(this);
-	setCentralWidget(centralWindow);
-
 	emuThread = new QtBoiEmuThread(this);
 	emuThread->start();
 
+	loadROM       = new QAction(tr("&Load ROM..."), this);
+	quit          = new QAction(tr("&Quit"), this);
+	emulatorPause = new QAction(tr("&Pause"), this);
+	emulatorCont  = new QAction(tr("&Go"), this);
+	emulatorStop  = new QAction(tr("&Stop"), this);
+	emulatorStep  = new QAction(tr("St&ep"), this);
+	emulatorReset = new QAction(tr("&Reset"), this);
+
+	loadROM->setShortcut(QKeySequence(tr("Ctrl+O", "File|Load ROM...")));
+	emulatorCont->setShortcut(QKeySequence(tr("F5", "Emulator|Go")));
+	emulatorStep->setShortcut(QKeySequence(tr("F7", "Debug|Step")));
+	//emulatorCont->setIcon(QIcon("../icons/player_play.svg"));
+	//emulatorPause->setIcon(QIcon("../icons/player_pause.svg"));
+	//loadROM->setIcon(QIcon("../icons/player_eject.svg"));
+
+	createMenu();
+	createToolbar();
+
+
 	connect(emulatorCont, SIGNAL(triggered()), emuThread, SLOT(cont()));
 	connect(emulatorStop, SIGNAL(triggered()), emuThread, SLOT(stop()));
 	connect(emulatorPause, SIGNAL(triggered()), emuThread, SLOT(pause()));
@@ -37,6 +52,10 @@ QtBoiMainWindow::QtBoiMainWindow(QWidget *parent)
 	connect(emulatorReset, SIGNAL(triggered()), emuThread, SLOT(reset()));
 	connect(emuThread, SIGNAL(redraw(const uchar*)), this, SLOT(onRedraw(const uchar*)));
 
+	resize(640,480);
+	centralWindow = new QLabel(this);
+	setCentralWidget(centralWindow);
+	centralWindow->move(0,0);
 }
 
 QtBoiMainWindow::~QtBoiMainWindow()
@@ -50,35 +69,36 @@ QtBoiMainWindow::~QtBoiMainWindow()
 
 void QtBoiMainWindow::createMenu()
 {
-	loadROM       = new QAction("&Load ROM...", this);
-	quit          = new QAction("&Quit", this);
-	emulatorPause = new QAction("&Pause", this);
-	emulatorCont  = new QAction("&Go", this);
-	emulatorStop  = new QAction("&Stop", this);
-	emulatorStep  = new QAction("St&ep", this);
-	emulatorReset = new QAction("&Reset", this);
-
-
 	QMenu *file;
-	file = menuBar()->addMenu("&File");
+	file = menuBar()->addMenu(tr("&File"));
 	file->addAction(loadROM);
 	file->addAction(quit);
 
 	QMenu *emulator;
-	emulator = menuBar()->addMenu("&Emulator");
+	emulator = menuBar()->addMenu(tr("&Emulator"));
 	emulator->addAction(emulatorCont);
 	emulator->addAction(emulatorPause);
 	emulator->addAction(emulatorStop);
 	emulator->addAction(emulatorReset);
 
 	QMenu *debug;
-	debug = menuBar()->addMenu("&Debug");
+	debug = menuBar()->addMenu(tr("&Debug"));
 	debug->addAction(emulatorStep);
 
 	connect(quit, SIGNAL(triggered()), qApp, SLOT(quit()));
 	connect(loadROM, SIGNAL(triggered()), this, SLOT(onLoadROM()));
 }
 
+void QtBoiMainWindow::createToolbar()
+{
+	QToolBar *toolbar;
+	toolbar = addToolBar(tr("&Emulator"));
+	toolbar->addAction(loadROM);
+	toolbar->addAction(emulatorCont);
+	toolbar->addAction(emulatorPause);
+	toolbar->addAction(emulatorReset);
+}
+
 void QtBoiMainWindow::onLoadROM()
 {
 	QString filename = QFileDialog::getOpenFileName(this, tr("Load ROM"), "../roms", tr("GameBoy ROMs (*.gb *.gbc)"));
@@ -95,6 +115,80 @@ void QtBoiMainWindow::onRedraw(const uchar *buffer)
 	centralWindow->setPixmap(QPixmap::fromImage(screen->scaled(320,288)));
 }
 
+void QtBoiMainWindow::keyPressEvent(QKeyEvent *event)
+{
+	if (emuThread->isPaused) {
+		QMainWindow::keyPressEvent(event);
+		return;
+	}
+	switch(event->key())
+	{
+		case Qt::Key_Up:
+		emuThread->pressControl(GameBoy::PAD_UP);
+		break;
+		case Qt::Key_Down:
+		emuThread->pressControl(GameBoy::PAD_DOWN);
+		break;
+		case Qt::Key_Left:
+		emuThread->pressControl(GameBoy::PAD_LEFT);
+		break;
+		case Qt::Key_Right:
+		emuThread->pressControl(GameBoy::PAD_RIGHT);
+		break;
+		case Qt::Key_Z:
+		emuThread->pressControl(GameBoy::BUTTON_A);
+		break;
+		case Qt::Key_X:
+		emuThread->pressControl(GameBoy::BUTTON_B);
+		break;
+		case Qt::Key_Return:
+		emuThread->pressControl(GameBoy::BUTTON_SELECT);
+		break;
+		case Qt::Key_Space:
+		emuThread->pressControl(GameBoy::BUTTON_START);
+		break;
+		default:
+		QMainWindow::keyPressEvent(event);
+	}
+}
+
+void QtBoiMainWindow::keyReleaseEvent(QKeyEvent *event)
+{
+	if (emuThread->isPaused) {
+		QMainWindow::keyReleaseEvent(event);
+		return;
+	}
+	switch(event->key())
+	{
+		case Qt::Key_Up:
+		emuThread->releaseControl(GameBoy::PAD_UP);
+		break;
+		case Qt::Key_Down:
+		emuThread->releaseControl(GameBoy::PAD_DOWN);
+		break;
+		case Qt::Key_Left:
+		emuThread->releaseControl(GameBoy::PAD_LEFT);
+		break;
+		case Qt::Key_Right:
+		emuThread->releaseControl(GameBoy::PAD_RIGHT);
+		break;
+		case Qt::Key_Z:
+		emuThread->releaseControl(GameBoy::BUTTON_A);
+		break;
+		case Qt::Key_X:
+		emuThread->releaseControl(GameBoy::BUTTON_B);
+		break;
+		case Qt::Key_Return:
+		emuThread->releaseControl(GameBoy::BUTTON_SELECT);
+		break;
+		case Qt::Key_Space:
+		emuThread->releaseControl(GameBoy::BUTTON_START);
+		break;
+		default:
+		QMainWindow::keyReleaseEvent(event);
+	}
+}
+
 
 
 
diff --git a/qtboi/QtBoiMainWindow.h b/qtboi/QtBoiMainWindow.h
index 1382339..17edd0f 100644
--- a/qtboi/QtBoiMainWindow.h
+++ b/qtboi/QtBoiMainWindow.h
@@ -3,6 +3,7 @@
 
 #include <QApplication>
 #include <QMainWindow>
+#include <QKeyEvent>
 #include <QPushButton>
 #include <QImage>
 #include <QLabel>
@@ -21,7 +22,14 @@ class QtBoiMainWindow: public QMainWindow
 		void onRedraw(const uchar *buffer);
 
 	private:
+		// private functions
 		void createMenu();
+		void createToolbar();
+
+		// events
+		void keyPressEvent(QKeyEvent *event);
+		void keyReleaseEvent(QKeyEvent *event);
+
 		QtBoiEmuThread *emuThread;
 
 		QLabel *centralWindow;