Show savestate manager over game when in fullscreen

This commit is contained in:
Jeffrey Pfau 2014-10-16 01:52:45 -07:00
parent 73d28a1ae4
commit 1d00ccf6dd
4 changed files with 44 additions and 4 deletions

View File

@ -133,3 +133,8 @@ void LoadSaveState::closeEvent(QCloseEvent* event) {
emit closed();
QWidget::closeEvent(event);
}
void LoadSaveState::showEvent(QShowEvent* event) {
m_slots[m_currentFocus]->setFocus();
QWidget::showEvent(event);
}

View File

@ -31,6 +31,7 @@ signals:
protected:
virtual bool eventFilter(QObject*, QEvent*) override;
virtual void closeEvent(QCloseEvent*) override;
virtual void showEvent(QShowEvent*) override;
private:
void loadState(int slot);

View File

@ -4,6 +4,7 @@
#include <QKeyEvent>
#include <QKeySequence>
#include <QMenuBar>
#include <QStackedLayout>
#include "GameController.h"
#include "GDBWindow.h"
@ -17,6 +18,7 @@ Window::Window(QWidget* parent)
: QMainWindow(parent)
, m_logView(new LogView())
, m_stateWindow(nullptr)
, m_screenWidget(new QWidget())
#ifdef USE_GDB_STUB
, m_gdbController(nullptr)
#endif
@ -25,8 +27,11 @@ Window::Window(QWidget* parent)
QGLFormat format(QGLFormat(QGL::Rgba | QGL::DoubleBuffer));
format.setSwapInterval(1);
m_screenWidget->setLayout(new QStackedLayout());
m_screenWidget->layout()->setContentsMargins(0, 0, 0, 0);
setCentralWidget(m_screenWidget);
m_display = new Display(format);
setCentralWidget(m_display);
attachWidget(m_display);
connect(m_controller, SIGNAL(gameStarted(GBAThread*)), this, SLOT(gameStarted(GBAThread*)));
connect(m_controller, SIGNAL(gameStopped(GBAThread*)), m_display, SLOT(stopDrawing()));
connect(m_controller, SIGNAL(gameStopped(GBAThread*)), this, SLOT(gameStopped()));
@ -133,6 +138,16 @@ void Window::closeEvent(QCloseEvent* event) {
QMainWindow::closeEvent(event);
}
void Window::toggleFullScreen() {
if (isFullScreen()) {
showNormal();
setCursor(Qt::ArrowCursor);
} else {
showFullScreen();
setCursor(Qt::BlankCursor);
}
}
void Window::gameStarted(GBAThread* context) {
emit startDrawing(m_controller->drawContext(), context);
foreach (QAction* action, m_gameActions) {
@ -153,14 +168,22 @@ void Window::openStateWindow(LoadSave ls) {
bool wasPaused = m_controller->isPaused();
m_stateWindow = new LoadSaveState(m_controller);
connect(this, SIGNAL(shutdown()), m_stateWindow, SLOT(hide()));
connect(m_stateWindow, &LoadSaveState::closed, [this]() { m_stateWindow = nullptr; });
connect(m_stateWindow, &LoadSaveState::closed, [this]() {
m_screenWidget->layout()->removeWidget(m_stateWindow);
m_stateWindow = nullptr;
setFocus();
});
if (!wasPaused) {
m_controller->setPaused(true);
connect(m_stateWindow, &LoadSaveState::closed, [this]() { m_controller->setPaused(false); });
}
m_stateWindow->setAttribute(Qt::WA_DeleteOnClose);
m_stateWindow->setMode(ls);
m_stateWindow->show();
if (isFullScreen()) {
attachWidget(m_stateWindow);
} else {
m_stateWindow->show();
}
}
void Window::setupMenu(QMenuBar* menubar) {
@ -277,7 +300,7 @@ void Window::setupMenu(QMenuBar* menubar) {
resize(VIDEO_HORIZONTAL_PIXELS * 4, VIDEO_VERTICAL_PIXELS * 4);
});
frameMenu->addAction(setSize);
frameMenu->addAction(tr("Fullscreen"), this, SLOT(showFullScreen()), QKeySequence("Ctrl+F"));
frameMenu->addAction(tr("Fullscreen"), this, SLOT(toggleFullScreen()), QKeySequence("Ctrl+F"));
QMenu* soundMenu = menubar->addMenu(tr("&Sound"));
QMenu* buffersMenu = soundMenu->addMenu(tr("Buffer &size"));
@ -305,3 +328,8 @@ void Window::setupMenu(QMenuBar* menubar) {
action->setDisabled(true);
}
}
void Window::attachWidget(QWidget* widget) {
m_screenWidget->layout()->addWidget(widget);
static_cast<QStackedLayout*>(m_screenWidget->layout())->setCurrentWidget(widget);
}

View File

@ -46,6 +46,9 @@ signals:
void audioBufferSamplesChanged(int samples);
void fpsTargetChanged(float target);
public slots:
void toggleFullScreen();
private slots:
void gameStarted(GBAThread*);
void gameStopped();
@ -54,11 +57,14 @@ private:
void setupMenu(QMenuBar*);
void openStateWindow(LoadSave);
void attachWidget(QWidget* widget);
GameController* m_controller;
Display* m_display;
QList<QAction*> m_gameActions;
LogView* m_logView;
LoadSaveState* m_stateWindow;
QWidget* m_screenWidget;
#ifdef USE_GDB_STUB
GDBController* m_gdbController;