Skip to content

Commit

Permalink
Fixed possible crash due to scripts reloading
Browse files Browse the repository at this point in the history
Added ResetBlocker instances to avoid script reload while a file dialog
is open.

A ResetBlocker instance was also needed in ScriptDialog::exec, to avoid
scripts reloading while a dialog is open in modal mode.
  • Loading branch information
bjorn committed Jul 27, 2023
1 parent 22a9901 commit 70ea216
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 22 deletions.
6 changes: 6 additions & 0 deletions src/tiled/scriptdialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,12 @@ void ScriptDialog::setNewRowMode(NewRowMode mode)
m_newRowMode = mode;
}

int ScriptDialog::exec()
{
ScriptManager::ResetBlocker blocker;
return QDialog::exec();
}

QWidget *ScriptDialog::addDialogWidget(QWidget *widget, const QString &label)
{
determineWidgetGrouping(widget);
Expand Down
2 changes: 2 additions & 0 deletions src/tiled/scriptdialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,8 @@ class ScriptDialog : public QDialog
NewRowMode newRowMode() const;
void setNewRowMode(NewRowMode mode);

int exec() override;

static void deleteAllDialogs();

private:
Expand Down
44 changes: 22 additions & 22 deletions src/tiled/scriptmodule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -597,38 +597,38 @@ QString ScriptModule::prompt(const QString &label, const QString &text, const QS
ScriptManager::ResetBlocker blocker;
return QInputDialog::getText(MainWindow::maybeInstance(), title, label, QLineEdit::Normal, text);
}

QString ScriptModule::promptForDirectory(const QString &defaultDir, const QString &title) const
{
QString finalTitle = QString(title);
if (finalTitle.isEmpty())
finalTitle = tr("Open Directory");
return QFileDialog::getExistingDirectory(MainWindow::maybeInstance(), finalTitle,
defaultDir,
QFileDialog::ShowDirsOnly);
ScriptManager::ResetBlocker blocker;
return QFileDialog::getExistingDirectory(MainWindow::maybeInstance(),
title.isEmpty() ? tr("Open Directory") : title,
defaultDir,
QFileDialog::ShowDirsOnly);
}

QStringList ScriptModule::promptOpenMultipleFiles(const QString &defaultDir, const QString &filters, const QString &title) const
{
QString finalTitle = QString(title);
if (finalTitle.isEmpty())
finalTitle = tr("Open Files");
return QFileDialog::getOpenFileNames(MainWindow::maybeInstance(), finalTitle,
defaultDir, filters);
ScriptManager::ResetBlocker blocker;
return QFileDialog::getOpenFileNames(MainWindow::maybeInstance(),
title.isEmpty() ? tr("Open Files") : title,
defaultDir, filters);
}

QString ScriptModule::promptOpenFile(const QString &defaultDir, const QString &filters, const QString &title) const
{
QString finalTitle = QString(title);
if (finalTitle.isEmpty())
finalTitle = tr("Open File");
return QFileDialog::getOpenFileName(MainWindow::maybeInstance(), finalTitle,
defaultDir, filters);
ScriptManager::ResetBlocker blocker;
return QFileDialog::getOpenFileName(MainWindow::maybeInstance(),
title.isEmpty() ? tr("Open File") : title,
defaultDir, filters);
}
QString ScriptModule::promptSaveFile(const QString &defaultDir, const QString &filters, const QString &title) const

QString ScriptModule::promptSaveFile(const QString &defaultDir, const QString &filters, const QString &title) const
{
QString finalTitle = QString(title);
if (finalTitle.isEmpty())
finalTitle = tr("Save File");
return QFileDialog::getSaveFileName(MainWindow::maybeInstance(), finalTitle,
defaultDir, filters);
ScriptManager::ResetBlocker blocker;
return QFileDialog::getSaveFileName(MainWindow::maybeInstance(),
title.isEmpty() ? tr("Save File") : title,
defaultDir, filters);
}

void ScriptModule::log(const QString &text) const
Expand Down

0 comments on commit 70ea216

Please sign in to comment.