diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp index 426697d59..51da6c977 100644 --- a/src/citra_qt/bootmanager.cpp +++ b/src/citra_qt/bootmanager.cpp @@ -82,21 +82,10 @@ class GGLWidgetInternal : public QGLWidget { public: GGLWidgetInternal(QGLFormat fmt, GRenderWindow* parent) - : QGLWidget(fmt, parent), splash(":/data/citra.svg"), parent(parent) { + : QGLWidget(fmt, parent), parent(parent) { } void paintEvent(QPaintEvent* ev) override { - if (do_painting) { - QPainter painter(this); - - int scaled_width = width()/3; - int scaled_height = width()/3; - - painter.drawImage(QRect(width()/2-scaled_width/2, - height()/2-scaled_height/2, - scaled_width, - scaled_height), splash); - } } void resizeEvent(QResizeEvent* ev) override { @@ -104,13 +93,31 @@ public: parent->OnFramebufferSizeChanged(); } - void DisablePainting() { do_painting = false; } - void EnablePainting() { do_painting = true; } - private: GRenderWindow* parent; +}; + +class GSplashWidgetInternal : public QWidget +{ +public: + GSplashWidgetInternal(QWidget* parent) + : QWidget(parent), splash(":/data/citra.svg") { + } + + void paintEvent(QPaintEvent* ev) override { + QPainter painter(this); + + int scaled_width = width()/3; + int scaled_height = width()/3; + + painter.drawImage(QRect(width()/2-scaled_width/2, + height()/2-scaled_height/2, + scaled_width, + scaled_height), splash); + } + +private: QImage splash; - bool do_painting; }; GRenderWindow::GRenderWindow(QWidget* parent, EmuThread* emu_thread) : @@ -125,22 +132,26 @@ GRenderWindow::GRenderWindow(QWidget* parent, EmuThread* emu_thread) : // TODO: One of these flags might be interesting: WA_OpaquePaintEvent, WA_NoBackground, WA_DontShowOnScreen, WA_DeleteOnClose QGLFormat fmt; fmt.setVersion(3,2); - //fmt.setProfile(QGLFormat::CoreProfile); + fmt.setProfile(QGLFormat::CoreProfile); // Requests a forward-compatible context, which is required to get a 3.2+ context on OS X fmt.setOption(QGL::NoDeprecatedFunctions); - child = new GGLWidgetInternal(fmt, this); - QBoxLayout* layout = new QHBoxLayout(this); + render_widget = new GGLWidgetInternal(fmt, this); + splash_widget = new GSplashWidgetInternal(this); + layout = new QHBoxLayout(this); resize(VideoCore::kScreenTopWidth, VideoCore::kScreenTopHeight + VideoCore::kScreenBottomHeight); - layout->addWidget(child); + layout->addWidget(splash_widget); layout->setMargin(0); setLayout(layout); + active_widget = splash_widget; + render_widget->hide(); // By default, widget are shown. Hide the inactive one for the moment. + OnMinimalClientAreaChangeRequest(GetActiveConfig().min_client_area_size); OnFramebufferSizeChanged(); - NotifyClientAreaSizeChanged(std::pair(child->width(), child->height())); + NotifyClientAreaSizeChanged(std::pair(active_widget->width(), active_widget->height())); BackupGeometry(); @@ -156,7 +167,7 @@ void GRenderWindow::moveContext() #if QT_VERSION > QT_VERSION_CHECK(5, 0, 0) // If the thread started running, move the GL Context to the new thread. Otherwise, move it back. auto thread = (QThread::currentThread() == qApp->thread() && emu_thread != nullptr) ? emu_thread : qApp->thread(); - child->context()->moveToThread(thread); + render_widget->context()->moveToThread(thread); #endif } @@ -167,19 +178,19 @@ void GRenderWindow::SwapBuffers() // since the last time you called swapBuffers. This presumably means something if you're using // QGLWidget the "regular" way, but in our multi-threaded use case is harmless since we never // call doneCurrent in this thread. - child->makeCurrent(); + render_widget->makeCurrent(); #endif - child->swapBuffers(); + render_widget->swapBuffers(); } void GRenderWindow::MakeCurrent() { - child->makeCurrent(); + render_widget->makeCurrent(); } void GRenderWindow::DoneCurrent() { - child->doneCurrent(); + render_widget->doneCurrent(); } void GRenderWindow::PollEvents() { @@ -197,11 +208,11 @@ void GRenderWindow::OnFramebufferSizeChanged() // windowHandle() might not be accessible until the window is displayed to screen. auto pixel_ratio = windowHandle() ? (windowHandle()->screen()->devicePixelRatio()) : 1.0; - unsigned width = child->QPaintDevice::width() * pixel_ratio; - unsigned height = child->QPaintDevice::height() * pixel_ratio; + unsigned width = active_widget->QPaintDevice::width() * pixel_ratio; + unsigned height = active_widget->QPaintDevice::height() * pixel_ratio; #else - unsigned width = child->QPaintDevice::width(); - unsigned height = child->QPaintDevice::height(); + unsigned width = active_widget->QPaintDevice::width(); + unsigned height = active_widget->QPaintDevice::height(); #endif NotifyFramebufferLayoutChanged(EmuWindow::FramebufferLayout::DefaultScreenLayout(width, height)); @@ -284,10 +295,22 @@ void GRenderWindow::OnMinimalClientAreaChangeRequest(const std::pairemu_thread = emu_thread; - child->DisablePainting(); + + // Swaps to put in front the render widget + active_widget=render_widget; + layout->removeWidget(splash_widget); + layout->addWidget(render_widget); + render_widget->show(); + splash_widget->hide(); } void GRenderWindow::OnEmulationStopping() { emu_thread = nullptr; - child->EnablePainting(); + + // Swaps back the splash widget + active_widget=splash_widget; + layout->removeWidget(render_widget); + layout->addWidget(splash_widget); + splash_widget->show(); + render_widget->hide(); } diff --git a/src/citra_qt/bootmanager.h b/src/citra_qt/bootmanager.h index 215941d5a..8e1739ad7 100644 --- a/src/citra_qt/bootmanager.h +++ b/src/citra_qt/bootmanager.h @@ -12,10 +12,10 @@ #include "common/emu_window.h" #include "common/thread.h" +class QBoxLayout; class QKeyEvent; class QScreen; -class GGLWidgetInternal; class GMainWindow; class GRenderWindow; @@ -133,7 +133,11 @@ public slots: private: void OnMinimalClientAreaChangeRequest(const std::pair& minimal_size) override; - GGLWidgetInternal* child; + QBoxLayout* layout; + QWidget* active_widget; + QGLWidget* render_widget; + QWidget* splash_widget; + QByteArray geometry; diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp index 7fb1b0dcb..d3ffc993c 100644 --- a/src/citra_qt/main.cpp +++ b/src/citra_qt/main.cpp @@ -59,7 +59,6 @@ GMainWindow::GMainWindow() : emu_thread(nullptr) statusBar()->hide(); render_window = new GRenderWindow(this, emu_thread.get()); - render_window->hide(); profilerWidget = new ProfilerWidget(this); addDockWidget(Qt::BottomDockWidgetArea, profilerWidget); @@ -291,7 +290,6 @@ void GMainWindow::ShutdownGame() { ui.action_Start->setText(tr("Start")); ui.action_Pause->setEnabled(false); ui.action_Stop->setEnabled(false); - render_window->hide(); } void GMainWindow::StoreRecentFile(const QString& filename)