mirror of https://github.com/mgba-emu/mgba.git
Qt: Fix linking after some windows have been closed
This commit is contained in:
parent
f026c90089
commit
be3e884ba5
1
CHANGES
1
CHANGES
|
@ -26,6 +26,7 @@ Bugfixes:
|
|||
- Tools: Fix recurring multiple times over the same library
|
||||
- GBA I/O: Handle audio registers specially when deserializing
|
||||
- Util: Fix highest-fd socket not being returned by SocketAccept
|
||||
- Qt: Fix linking after some windows have been closed
|
||||
Misc:
|
||||
- SDL: Remove scancode key input
|
||||
- GBA Video: Clean up unused timers
|
||||
|
|
|
@ -33,7 +33,6 @@ mLOG_DEFINE_CATEGORY(QT, "Qt");
|
|||
|
||||
GBAApp::GBAApp(int& argc, char* argv[])
|
||||
: QApplication(argc, argv)
|
||||
, m_windows{}
|
||||
, m_db(nullptr)
|
||||
{
|
||||
g_app = this;
|
||||
|
@ -80,10 +79,10 @@ GBAApp::GBAApp(int& argc, char* argv[])
|
|||
AudioProcessor::setDriver(static_cast<AudioProcessor::Driver>(m_configController.getQtOption("audioDriver").toInt()));
|
||||
}
|
||||
Window* w = new Window(&m_configController);
|
||||
connect(w, &Window::destroyed, [this]() {
|
||||
m_windows[0] = nullptr;
|
||||
connect(w, &Window::destroyed, [this, w]() {
|
||||
m_windows.removeAll(w);
|
||||
});
|
||||
m_windows[0] = w;
|
||||
m_windows.append(w);
|
||||
|
||||
if (loaded) {
|
||||
w->argumentsPassed(&args);
|
||||
|
@ -121,15 +120,15 @@ bool GBAApp::event(QEvent* event) {
|
|||
}
|
||||
|
||||
Window* GBAApp::newWindow() {
|
||||
if (m_multiplayer.attached() >= MAX_GBAS) {
|
||||
if (m_windows.count() >= MAX_GBAS) {
|
||||
return nullptr;
|
||||
}
|
||||
Window* w = new Window(&m_configController, m_multiplayer.attached());
|
||||
int windowId = m_multiplayer.attached();
|
||||
connect(w, &Window::destroyed, [this, windowId]() {
|
||||
m_windows[windowId] = nullptr;
|
||||
connect(w, &Window::destroyed, [this, w]() {
|
||||
m_windows.removeAll(w);
|
||||
});
|
||||
m_windows[windowId] = w;
|
||||
m_windows.append(w);
|
||||
w->setAttribute(Qt::WA_DeleteOnClose);
|
||||
w->loadConfig();
|
||||
w->show();
|
||||
|
@ -142,27 +141,27 @@ GBAApp* GBAApp::app() {
|
|||
return g_app;
|
||||
}
|
||||
|
||||
void GBAApp::pauseAll(QList<int>* paused) {
|
||||
for (int i = 0; i < MAX_GBAS; ++i) {
|
||||
if (!m_windows[i] || !m_windows[i]->controller()->isLoaded() || m_windows[i]->controller()->isPaused()) {
|
||||
void GBAApp::pauseAll(QList<Window*>* paused) {
|
||||
for (auto& window : m_windows) {
|
||||
if (!window->controller()->isLoaded() || window->controller()->isPaused()) {
|
||||
continue;
|
||||
}
|
||||
m_windows[i]->controller()->setPaused(true);
|
||||
paused->append(i);
|
||||
window->controller()->setPaused(true);
|
||||
paused->append(window);
|
||||
}
|
||||
}
|
||||
|
||||
void GBAApp::continueAll(const QList<int>* paused) {
|
||||
for (int i : *paused) {
|
||||
m_windows[i]->controller()->setPaused(false);
|
||||
void GBAApp::continueAll(const QList<Window*>& paused) {
|
||||
for (auto& window : paused) {
|
||||
window->controller()->setPaused(false);
|
||||
}
|
||||
}
|
||||
|
||||
QString GBAApp::getOpenFileName(QWidget* owner, const QString& title, const QString& filter) {
|
||||
QList<int> paused;
|
||||
QList<Window*> paused;
|
||||
pauseAll(&paused);
|
||||
QString filename = QFileDialog::getOpenFileName(owner, title, m_configController.getOption("lastDirectory"), filter);
|
||||
continueAll(&paused);
|
||||
continueAll(paused);
|
||||
if (!filename.isEmpty()) {
|
||||
m_configController.setOption("lastDirectory", QFileInfo(filename).dir().path());
|
||||
}
|
||||
|
@ -170,10 +169,10 @@ QString GBAApp::getOpenFileName(QWidget* owner, const QString& title, const QStr
|
|||
}
|
||||
|
||||
QString GBAApp::getSaveFileName(QWidget* owner, const QString& title, const QString& filter) {
|
||||
QList<int> paused;
|
||||
QList<Window*> paused;
|
||||
pauseAll(&paused);
|
||||
QString filename = QFileDialog::getSaveFileName(owner, title, m_configController.getOption("lastDirectory"), filter);
|
||||
continueAll(&paused);
|
||||
continueAll(paused);
|
||||
if (!filename.isEmpty()) {
|
||||
m_configController.setOption("lastDirectory", QFileInfo(filename).dir().path());
|
||||
}
|
||||
|
@ -181,10 +180,10 @@ QString GBAApp::getSaveFileName(QWidget* owner, const QString& title, const QStr
|
|||
}
|
||||
|
||||
QString GBAApp::getOpenDirectoryName(QWidget* owner, const QString& title) {
|
||||
QList<int> paused;
|
||||
QList<Window*> paused;
|
||||
pauseAll(&paused);
|
||||
QString filename = QFileDialog::getExistingDirectory(owner, title, m_configController.getOption("lastDirectory"));
|
||||
continueAll(&paused);
|
||||
continueAll(paused);
|
||||
if (!filename.isEmpty()) {
|
||||
m_configController.setOption("lastDirectory", QFileInfo(filename).dir().path());
|
||||
}
|
||||
|
@ -249,14 +248,14 @@ GBAApp::FileDialog::FileDialog(GBAApp* app, QWidget* parent, const QString& capt
|
|||
}
|
||||
|
||||
int GBAApp::FileDialog::exec() {
|
||||
QList<int> paused;
|
||||
QList<Window*> paused;
|
||||
m_app->pauseAll(&paused);
|
||||
bool didAccept = QFileDialog::exec() == QDialog::Accepted;
|
||||
QStringList filenames = selectedFiles();
|
||||
if (!filenames.isEmpty()) {
|
||||
m_app->m_configController.setOption("lastDirectory", QFileInfo(filenames[0]).dir().path());
|
||||
}
|
||||
m_app->continueAll(&paused);
|
||||
m_app->continueAll(paused);
|
||||
return didAccept;
|
||||
}
|
||||
|
||||
|
|
|
@ -39,7 +39,6 @@ private:
|
|||
};
|
||||
#endif
|
||||
|
||||
|
||||
class GBAApp : public QApplication {
|
||||
Q_OBJECT
|
||||
|
||||
|
@ -78,11 +77,11 @@ private:
|
|||
|
||||
Window* newWindowInternal();
|
||||
|
||||
void pauseAll(QList<int>* paused);
|
||||
void continueAll(const QList<int>* paused);
|
||||
void pauseAll(QList<Window*>* paused);
|
||||
void continueAll(const QList<Window*>& paused);
|
||||
|
||||
ConfigController m_configController;
|
||||
Window* m_windows[MAX_GBAS];
|
||||
QList<Window*> m_windows;
|
||||
MultiplayerController m_multiplayer;
|
||||
|
||||
NoIntroDB* m_db;
|
||||
|
|
Loading…
Reference in New Issue